如何在Vim中将行号添加到行范围?


71

如何在Vim中打开的文件中的行范围内添加行号?并非如此(:set nu显示行号),但实际上是在文件的每一行之前添加了行号吗?


这个问题应该适用于所有带有行尾标记的文件,而不仅仅是源代码文件。
安娜·尼姆布斯

Answers:


112

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

编辑:总结评论。

您可以根据需要进行多次调整。


假设您要在视觉选择中的行前添加数字(V+移动),并且希望编号从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()|


尝试在视觉选择上执行此操作(其中1将是选择的第一行),但是它在文件的该行编号处开始编号。有什么办法可以修改起始号码?谢谢!
杰森

2
@Jasonoffset可以1-line("'<")。想知道,为什么这样的老问题出现在我的RSS中。
ZyX 2011年

我想这是因为
有了

2
您可以尝试:-文档(:help :s此处),vim技巧(vim.wikia.com),他人编写的插件,vim_use(官方邮件列表)和类似这样的论坛。
卢克·赫米特

8
万一其他人需要知道,可以在数字do之后添加一个字符串:%s/^/\=line('.') . 'string'/。在我的情况下,我需要一个逗号,因为我正在对一个csv文件中的行进行编号,所以我做了:%s/^/\=line('.') . ','/
katy lavallee 2011年

33

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

 :%!cat -n

或者,如果您只想进行部分选择,则可视地选择该区域,然后键入以下内容:

 :!cat -n

这将自动插入视觉选择标记,并且在键入后将如下所示:

 :'<,'>!cat -n

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


如果您希望行号以0而不是1开头怎么办?
尼尔斯(Nils)

删除第一行,其余编号。随后读取第一行,并以0开头。;)
sjas 2012年

这就是答案!
user3751385

24

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

:%!nl

2
cool nl -v允许您指定编号应从何处开始,因此如果您希望第一行成为0行而不是1行,请使用nl -v 0
Nils,

6

在类似Unix的环境中,您可以使用cat或awk轻松生成行号,因为vim与shell具有友好的接口,因此vim和shell中都一样。
Vim Tip28

:%!cat -n

要么

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

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

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

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

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

您还可以使用替代:

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

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

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


在第一个示例中,您的意思是“ cat”而不是“ call”吗?
Lance Roberts

@Lance:两年后,我真的不知道:这个节目后我从恢复的修正版本3catcall...(源是可能的Vim tip28在neuron.tuke.sk/~hudecm/VimTips-OFFLINE-nov02 .txt
VonC

好的,无论如何我还是需要awk行。您知道我将如何实现它,以便给我3或4个字母数字,例如以100或1000开头吗?
Lance Roberts

遵循参考文献,似乎应该是猫。我找到了awk语句来给我更多数字::%!awk '{print 1000+NR*10,$0}'。现在唯一的问题(不是很多)是我的剥离语句:%s / ^ [0-9] * //在前面留了多余的空间,引用\ s似乎无济于事。
Lance Roberts

@Lance:好的,我已经相应地编辑了答案。您的特定问题可以在此页面中找到答案;)
VonC

4

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

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

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

:%!awk '{print 1000+NR*10,$0}'

3

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


0

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

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

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

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

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

PS:vim的力量 :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.