枚举 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>复制号码(yank find ) 使用j 向下移动一行 用 P 粘贴你的 yank 使用0 移回行首 使用 Ctrl-a 增加数字 使用0 再次回到开头(在数字末尾增加您的位置) 再次输入q 结束宏 使用@q(或@<the letter you picked>)播放宏 使用<number>@@ 重放宏任意次数(@@ 重放最后一个宏) 利润!

总结一下有趣的方式,这张 GIF 图片是i1. <Esc>0qqyf jP0^a0q10@q

【讨论】:

优秀。最后的击键摘要至关重要。谢谢。 是否可以先选择行,然后仅应用这些行(而不是运行宏 次)? 你还记得你用什么截屏软件录制的吗? 我使用 LICEcap 有一段时间了:cockos.com/licecap @nocibambi 见***.com/questions/3337926/…【参考方案2】:

对所有行应用枚举:

: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跳过空行,下移一行 &lt;C-v&gt; 模拟 Ctrl-v,打开可视模式 跳转到当前段落的末尾 k跳过空行,上移一行

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

I 进入插入模式并将光标放在每行的开头 0. 加在每一行的开头 &lt;Esc&gt; 将模式改回正常

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

vip 选择内段(以“0.”开头的列表) g&lt;C-a&gt; 会变魔术

我发现用零进行枚举比在文档中省略要枚举的列表的第一行更容易。

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

【讨论】:

当我认为您的意思是 &lt;g&lt;C-a&gt; 时,您输入了“g&lt;C-&gt; 具有魔力”。另外,这太棒了。你能帮我理解g &lt;C-a&gt;&lt;C-a&gt;之间的区别吗?后者只是增加数字。另外,使用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的文本文件中生成随机排序的数字和存储编号

Maven 在现有目录中生成原型

ValueError:不能将现有列的名称用于指示符列

将现有数字单元格转换为文本

从文本字段输入在现有表中创建新行。 SwiftUI(故事板)

在现有文档中编辑 Range NumberFormat