1 在文本中插入行号
最近有朋友提到某编辑器有一个可以插入行号的插件,问Vim有没有办法可以在文章中插入行号。%$^&*#8~#$@#!……让我们看一下有多少种方式可以在vim中插入行号或数字序列!
建议看一下Vim官网的这篇文章。里面一部分内容与这篇是重叠的。不过这篇是中文的XD。
我们的目的是在当前编辑文中的每一行前面加上行号或数字序列并用空格分隔,如:
这是第一行
这是第二行
这是第四行
在插入行号后将成为:
1 这是第一行
2 这是第二行
3
4 这是第四行
但有时我们需要对部分行编号。下面的例子是对第二行以后的所有非空行依次编号:
这是第一行
1 这是第二行
2 这是第四行
为了区别行号,我这里就称之为数字序列。
进入正题。
1.1 使用line()函数
相信这是大多数人第一个想到的解法了——使用line()函数产生行号用:s命令插入行号。
" 为所有行加上行号
" 使用合适的范围或者正则表达式就可以限定作用的范围。
:g/^/ s//=line('.').' '/
优点是简单易用。缺点是不够灵活,只能用以显示指定行的行号。
1.2 使用ex命令
vim提供了一些可以打印行号的ex命令,如,”=”, “p #” 和”#“。为了捕捉Vim的命令输出,我们用redir命令。
" 为前30行加上行号
:redir @a | 1,30# | redir END
:1,30d | put! a
逻辑上很容易理解:1,30#显示前30行及其行号。保存到寄存器a中,删掉前30行,再贴上寄存器的内容。
没什么明显优点的一种方法。缺点同上。如果不是更改当前编辑区的内容而是直接保存到新文件的话,这种方法就比其他的方法方便。
1.3 使用range()函数
range()是个新的函数,用来产生包含数字序列的列表。当然也可以用来生成行号:
" 为前30行加上行号
:for i in range(31)
:call setline(i,i .' '. getline(i))
:endfor
对range(),setline()的用法见帮助文档。
range()函数相对前面的2个解法而言要灵活许多,除可用以表示行号,也可以用来编数字序列,相应地也要求一些编程基础。
1.4 加法运算
这是也是简单灵活的一种解法。好吧,也许大家第一个想到的解法不是使用line()函数。
" 为所有行加上行号
:let i=1
:g/^/ s//=i . ' '/ |let i=i+1
注意:g后面的两条命令(