如何在vim的行范围中添加行号?不像在“:set nu”中那样 - 这只显示数字,但不会将它们添加到文件中。

有帮助吗?

解决方案

使用

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

编辑:总结评论。

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


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

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

如果你想在行中的数字和旧文本之间添加一个字符串,只需将其连接(使用VimL中的),就可以使用数字表达式:

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

如果你需要这个作为文本排序,你可能想要填充结果,这可以使用 printf 0001,0002 ...而不是 1,2 ...例如:

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

无论如何,如果你想了解更多信息,只需打开vim help::h:s 并点击链接( | subreplace-special | ,...,<代码> |子匹配()|

其他提示

cat -n 在其输入中添加行号。您可以将当前文件传递给 cat -n ,并将当前缓冲区替换为打印到stdout的内容。幸运的是,这个复杂的解决方案在vim中只有不到10个字符:

 :%!cat -n

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

 :!cat -n

这将自动将视觉选择标记放入,并在您输入后显示如下:

 :'<,'>!cat -n

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

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

:%!nl

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

:%!cat -n

:%!awk '{print NR,
fu! LineIt()
  exe ":s/^/".line(".")."/"
endf
}'

但是,如果你在win-x,win2000的MS-DOS中使用vim,你会丢失这些工具包。 这是一个非常简单的方法来存档这个只有vim:

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

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

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

您也可以使用subst:

<*>

您也可以只打印行而不将其添加到文件中:

  

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

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

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

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

:%!awk '{print 1000+NR*10,<*>}'

“VisIncr”插件适合插入列一般增加数字(或字母,日期,罗马数字等)。您可以控制数字格式,填充等。所以插入一个“1”。在每一行的前面(通过:s :g 或visual-block insert),在可视块模式下突出显示该列,并运行其中一个命令插件。

如果有人想在使用这个优秀的答案插入行号后放置一个标签(或一些空格),这是一种方式。进入转义模式后,执行:

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

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

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

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

P.S: vim的力量:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top