枚举 Vim 中的现有文本(从现有文本中创建编号列表)
Enumerate existing text in Vim (make numbered list out of existing text)
我有一个包含以下文本的源文档
Here is a bunch of text
...
Collect underpants
???
Profit!
...
More text
我想在视觉上 select 中间三行并在它们前面插入数字:
Here is a bunch of text
...
1. Collect underpants
2. ???
3. Profit!
...
More text
我找到的所有解决方案要么把数字 on their own new lines or prepended the actual line of the file.
如何在现有行前添加一系列数字,从 1 开始?
这是一个很好的宏。
- 将第一个数字添加到您的行中,然后将光标放回开头。
- 用
qq
(或q<any letter>
)开始macro
- 用
yf<space>
复制号码(y
ank f
ind
)
- 下移
j
一行
- 用
P
粘贴你的 yank
- 返回行首
0
- 用Ctrl-a
增加数字
- 用
0
再次回到开头(增加你在数字末尾的位置)
- 再次输入
q
结束宏
- 用
@q
(或@<the letter you picked>
)播放宏
- 使用
<number>@@
任意多次重播宏(@@
重播最后一个宏)
- 盈利!
总结有趣的方式,这张 GIF 图片是 i1. <Esc>0qqyf jP0^a0q10@q
。
要对所有行应用枚举:
:let i=1 | g/^/s//\=i.'. '/ | let i=i+1
仅枚举选定的行:
:let i=1 | '<,'>g/^/s//\=i.'. '/ | let i=i+1
为@DmitrySandalov 解决方案创建地图:
vnoremap <silent> <Leader>n :<C-U>let i=1 \| '<,'>g/^/s//\=i.'. '/ \| let i=i+1 \| nohl<CR>
使用以下命令设置非递归映射,当光标位于要枚举的行内时,在命令模式下键入 ,enum
。
:nn ,enum {j<C-v>}kI0. <Esc>vipg<C-a>
TL;DR
您可以输入 :help CTRL-A
来查看您的问题的答案。
{Visual}g CTRL-A Add [count] to the number or alphabetic character in
the highlighted text. If several lines are
highlighted, each one will be incremented by an
additional [count] (so effectively creating a
[count] incrementing sequence).
For Example, if you have this list of numbers:
1.
1.
1.
1.
Move to the second "1." and Visually select three
lines, pressing g CTRL-A results in:
1.
2.
3.
4.
如果你有一个段落(:help paragraph
) you can select it (look at :help object-select
)。假设段落中的每一行都需要枚举。
{
跳转到当前段落的开头
j
跳过空白行,向下移动一行
<C-v>
模拟 Ctrl-v,打开可视模式
}
跳转到当前段落的末尾
k
跳过空白行,向上移动一行
所需区域selected,我们可以进行多行编辑:
I
进入插入模式并将光标置于每行的开头
在每一行的开头添加0.
<Esc>
将模式改回正常
您应该得到以零开头的列表。如果你已经有这样的,你可以省略这部分。
vip
select 内段(列表前加“0.”)
g<C-a>
神奇
我发现用零进行枚举比忽略列表的第一行要枚举更容易,如文档中所述。
注:我个人没有映射。更容易记住 g <C-a>
的作用并直接使用它。上面的答案描述了纯 <C-a>
的用法,这需要您手动计数,另一方面 g <C-a>
可以增加给定值的数字(又名步骤)并拥有它的“内部计数器”。
我有一个包含以下文本的源文档
Here is a bunch of text
...
Collect underpants
???
Profit!
...
More text
我想在视觉上 select 中间三行并在它们前面插入数字:
Here is a bunch of text
...
1. Collect underpants
2. ???
3. Profit!
...
More text
我找到的所有解决方案要么把数字 on their own new lines or prepended the actual line of the file.
如何在现有行前添加一系列数字,从 1 开始?
这是一个很好的宏。
- 将第一个数字添加到您的行中,然后将光标放回开头。
- 用
qq
(或q<any letter>
)开始macro - 用
yf<space>
复制号码(y
ankf
ind - 下移
j
一行
- 用
P
粘贴你的 yank
- 返回行首
0
- 用Ctrl-a 增加数字
- 用
0
再次回到开头(增加你在数字末尾的位置) - 再次输入
q
结束宏 - 用
@q
(或@<the letter you picked>
)播放宏 - 使用
<number>@@
任意多次重播宏(@@
重播最后一个宏) - 盈利!
总结有趣的方式,这张 GIF 图片是 i1. <Esc>0qqyf jP0^a0q10@q
。
要对所有行应用枚举:
:let i=1 | g/^/s//\=i.'. '/ | let i=i+1
仅枚举选定的行:
:let i=1 | '<,'>g/^/s//\=i.'. '/ | let i=i+1
为@DmitrySandalov 解决方案创建地图:
vnoremap <silent> <Leader>n :<C-U>let i=1 \| '<,'>g/^/s//\=i.'. '/ \| let i=i+1 \| nohl<CR>
使用以下命令设置非递归映射,当光标位于要枚举的行内时,在命令模式下键入 ,enum
。
:nn ,enum {j<C-v>}kI0. <Esc>vipg<C-a>
TL;DR
您可以输入 :help CTRL-A
来查看您的问题的答案。
{Visual}g CTRL-A Add [count] to the number or alphabetic character in
the highlighted text. If several lines are
highlighted, each one will be incremented by an
additional [count] (so effectively creating a
[count] incrementing sequence).
For Example, if you have this list of numbers:
1.
1.
1.
1.
Move to the second "1." and Visually select three
lines, pressing g CTRL-A results in:
1.
2.
3.
4.
如果你有一个段落(:help paragraph
) you can select it (look at :help object-select
)。假设段落中的每一行都需要枚举。
{
跳转到当前段落的开头j
跳过空白行,向下移动一行<C-v>
模拟 Ctrl-v,打开可视模式}
跳转到当前段落的末尾k
跳过空白行,向上移动一行
所需区域selected,我们可以进行多行编辑:
I
进入插入模式并将光标置于每行的开头
在每一行的开头添加0.
<Esc>
将模式改回正常
您应该得到以零开头的列表。如果你已经有这样的,你可以省略这部分。
vip
select 内段(列表前加“0.”)g<C-a>
神奇
我发现用零进行枚举比忽略列表的第一行要枚举更容易,如文档中所述。
注:我个人没有映射。更容易记住 g <C-a>
的作用并直接使用它。上面的答案描述了纯 <C-a>
的用法,这需要您手动计数,另一方面 g <C-a>
可以增加给定值的数字(又名步骤)并拥有它的“内部计数器”。