枚举 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 开始?

这是一个很好的宏。

  1. 将第一个数字添加到您的行中,然后将光标放回开头。
  2. qq(或q<any letter>)开始macro
  3. yf<space>复制号码(yank find )
  4. 下移 j
  5. 一行
  6. P
  7. 粘贴你的 yank
  8. 返回行首0
  9. Ctrl-a
  10. 增加数字
  11. 0 再次回到开头(增加你在数字末尾的位置)
  12. 再次输入 q 结束宏
  13. @q(或@<the letter you picked>)播放宏
  14. 使用 <number>@@ 任意多次重播宏(@@ 重播最后一个宏)
  15. 盈利!

总结有趣的方式,这张 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> 可以增加给定值的数字(又名步骤)并拥有它的“内部计数器”。