71

如何将行号添加到在 Vim 中打开的文件中的一系列行中?不像:set nu- 这只是显示行号 - 但实际上将它们添加到文件中的每一行?

4

7 回答 7

116

:%s/^/\=line('.')/

编辑:总结评论。

可以根据需要调整此命令。


假设您想在视觉选择 ( V+ move) 的行前添加数字,并且您希望编号从 42 开始。

:'<,'>s/^/\=(line('.')-line("'<")+42)/

如果你想在数字和行中的旧文本之间添加一个字符串,只需将它连接(.在 VimL 中)到数字表达式:

:'<,'>s/^/\=(line('.')-line("'<")+42).' --> '/

如果您需要将其作为文本排序,您可能希望对结果进行零填充,这可以使用printffor 0001, 0002... 而不是1, 2... 例如:

:%s/^/\=printf('%04d', line('.'))/

无论如何,如果您想了解更多信息,只需打开 vim 帮助::h :s并点击链接 ( |subreplace-special|, ..., |submatch()|)

于 2008-10-31T10:18:40.870 回答
33

cat -n将行号添加到其输入。您可以将当前文件通过管道传输到cat -n并将当前缓冲区替换为打印到标准输出的内容。幸运的是,这个复杂的解决方案在 vim 中少于 10 个字符:

 :%!cat -n

或者,如果您只想要一个子选择,直观地选择该区域,然后键入:

 :!cat -n

这将自动放入视觉选择标记,并在您输入后看起来像这样:

 :'<,'>!cat -n

为了删除行号,我建议使用control-v,这将允许您直观地选择一个矩形,然后您可以使用 删除该矩形x

于 2008-10-31T07:10:03.340 回答
24

在 GNU 系统上:使用外部nl二进制文件:

:%!nl
于 2008-10-31T07:12:59.763 回答
6

在类 Unix 环境下,您可以使用 cat 或 awk 轻松生成行号,因为 vim 与 shell 具有友好的接口,所以一切在 vim 中都可以像在 shell 中一样工作。
来自Vim Tip28

:%!cat -n

或者

:%!awk '{print NR,$0}'

但是,如果你在 MS-DOS、win9x、win2000 中使用 vim,你会丢失这些工具包。这是仅通过 vim 归档的一种非常简单的方法:

fu! LineIt()
  exe ":s/^/".line(".")."/"
endf

或者,由字母组成的序列就像上面一样简单:

exe "s/^/".nr2char(line("."))."/" 

您还可以使用 subst:

:g/^/exe ":s/^/".line(".")."^I/"

您也可以只打印这些行而不将它们添加到文件中:

“有时它可能很有用,特别是在编辑大型源文件以在纸上打印行号。
为此,您可以使用:set printoptions=number:y激活和:set printoptions=number:n停用此功能的选项。
如果应始终打印行号,请将行set printoptions=number:y放入的vimrc。”

于 2008-10-31T07:12:07.407 回答
4

首先,如果需要,您可以删除现有的行号:

:%s/^[0-9]*//

然后,您可以添加行号。NR指从一开始的当前行号,因此您可以对其进行一些数学运算以获得所需的编号。以下命令为您提供四位数的行号:

:%!awk '{print 1000+NR*10,$0}'
于 2011-01-12T22:10:05.457 回答
3

VisIncr”插件非常适合插入一般递增的数字列(或字母、日期、罗马数字等)。您可以控制数字格式、填充等。因此,在每一行前面插入一个“1”(通过:s:g或视觉块插入),在视觉块模式下突出显示该列,然后运行插件中的命令之一。

于 2008-11-02T00:09:35.027 回答
0

如果有人想在使用这个出色的答案插入行号后放置一个制表符(或一些空格) ,这是一种方法。进入逃生模式后,执行:

:%s/^/\=line('.').'    '/

^表示行首,%s是替换指令。因此,我们说在每行的开头放置一个行号并添加 4 个空格,然后在替换之前放置该行的任何内容,并对文件中的所有行执行此操作。

这将自动替换它。或者,如果您希望命令要求您确认,请执行以下操作:

:%s/^/\=line('.').'    '/igc

PS:vim的力量 :)

于 2018-09-08T10:25:33.170 回答