枚举 Vim 中的现有文本(从现有文本中生成编号列表)
Posted
技术标签:
【中文标题】枚举 Vim 中的现有文本(从现有文本中生成编号列表)【英文标题】:Enumerate existing text in Vim (make numbered list out of existing text) 【发布时间】:2015-11-10 05:31:03 【问题描述】:我有一个包含以下文本的源文档
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 开始?
【问题讨论】:
重读您发布的第二个问题中的this answer,并解释这不能回答您的问题。 【参考方案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
【讨论】:
您能解释一下 top 命令的作用吗?我知道i
是一个计数器,g
是匹配行的开头,但不是别的。【参考方案3】:
使用以下命令设置非递归映射,当光标位于要枚举的行内时,在命令模式下键入,enum
。
:nn ,enum j<C-v>kI0. <Esc>vipg<C-a>
TL;DR
您可以输入:help CTRL-A
来查看您的问题的答案。
Visualg 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>
可以使用给定值(又名步骤)递增数字并拥有它的“内部计数器”。
【讨论】:
当我认为您的意思是<g<C-a>
时,您输入了“g<C->
具有魔力”。另外,这太棒了。你能帮我理解g <C-a>
和<C-a>
之间的区别吗?后者只是增加数字。另外,使用g
有什么模式吗?我知道加入行我使用 shift+j,但加入没有空格我使用g
然后 shift+j。它是某种全局快捷方式修饰符吗?
在 vim 中输入:help CTRL-A
,您将看到Visualg CTRL-A
的帮助。我怀疑 g
修饰符对每个命令都有共同的含义。我想g
在字母表中用作 A - 第一个也是最方便的字符。这也只是恕我直言,我还没有阅读所有用户手册\参考文档。【参考方案4】:
为@DmitrySandalov 解决方案创建地图:
vnoremap <silent> <Leader>n :<C-U>let i=1 \| '<,'>g/^/s//\=i.'. '/ \| let i=i+1 \| nohl<CR>
【讨论】:
这很酷,谢谢。我对地图不太熟悉,您能否添加说明以及如何在 vim 中使用它的示例? 查看地图的vim帮助(:help map) 好的。如果其他人理解 vim 映射和这个答案,并且可以通过一个如何使用它和输入/输出的例子来扩充它,那将不胜感激。以上是关于枚举 Vim 中的现有文本(从现有文本中生成编号列表)的主要内容,如果未能解决你的问题,请参考以下文章
python 在名为data.txt的文本文件中生成随机排序的数字和存储编号