枚举vim中的现有文本(从现有文本中创建编号列表)

时间:2015-08-17 14:17:32

标签: list vim enumeration enumerable

我有一份包含以下文字的源文件

Here is a bunch of text
...
Collect underpants
???
Profit!
...
More text

我想直观地选择中间三行并在它们前面插入数字:

Here is a bunch of text
...
1. Collect underpants
2. ???
3. Profit!
...
More text

我找到的所有解决方案都是将数字设为on their own new lines或添加actual line of the file

任何人都可以帮助我将一系列数字添加到现有行中,从1开始吗?

4 个答案:

答案 0 :(得分:3)

这是一个很好的宏。

  1. 将第一个数字添加到您的行中,然后将光标放回到开头。
  2. 使用qq(或q<any letter>
  3. 开始macro
  4. 使用yf<space>y ank f ind
  5. 复制号码
  6. 使用j
  7. 向下移动一行
  8. 使用P
  9. 粘贴您的手淫
  10. 使用0
  11. 移回该行的开头
  12. 使用 Ctrl-a
  13. 增加数字
  14. 使用0再次回到起点(在数字末尾增加位置)
  15. 再次输入q
  16. 结束宏
  17. 使用@q(或@<the letter you picked>
  18. 播放宏
  19. 使用<number>@@@@重播最后一个宏),可以根据需要多次重播宏
  20. 利润!
  21. 总结有趣的方式,这个gif是i1. <Esc>0qqyf jP0^a0q10@qVim list macro

答案 1 :(得分:2)

使用以下命令设置非递归映射,并在光标位于要枚举的行内时在命令模式下键入 ,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),您可以选择它(查看 :help object-select)。假设段落中的每一行都需要枚举。

  • { 跳转到当前段落的开头
  • j 跳过空行,向下移动一行
  • <C-v> 模拟 Ctrl-v,打开可视模式
  • } 跳到当前段落的结尾
  • k 跳过空行,向上移动一行

选择需要的区域,我们可以进行多行编辑:

  • I 进入插入模式并将光标置于每行的开头
  • 0. 添加在每行的开头
  • <Esc> 将模式改回正常

您应该得到带有零的列表。如果你已经有这样的,你可以省略这部分。

  • vip 选择内部段落(列表以“0”开头)
  • g<C-a> 有魔力

我发现用零枚举更容易,而不是像文档中所说的那样省略列表的第一行进行枚举。

注意:我个人没有映射。更容易记住 g <C-a> 的作用并直接使用它。上面的答案描述了纯 <C-a> 的用法,它需要您手动计算任何内容,另一方面,g <C-a> 可以使用给定值(又名步骤)递增数字并使其成为“内部计数器”。

答案 2 :(得分:0)

要将枚举应用于所有行:

:let i=1 | g/^/s//\=i.'. '/ | let i=i+1

仅枚举选定的行:

:let i=1 | '<,'>g/^/s//\=i.'. '/ | let i=i+1

答案 3 :(得分:0)

为@DmitrySandalov解决方案创建地图:

vnoremap <silent> <Leader>n :<C-U>let i=1 \| '<,'>g/^/s//\=i.'. '/ \| let i=i+1 \| nohl<CR>