vim学习高级技巧之序列的生成方法详解

2019-01-16 23:13:55于丽

前言

本文主要给大家介绍了关于在vim中插入数字序列的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

待处理文本

假设文本原来内容是

这是第一行 这是第二行 这是第四行 这是第五行

插入行号变成

1 这是第一行 2 这是第二行 3 4 这是第四行 5 这是第五行

还有一种想要的效果是

这是第一行 line[1] 这是第二行 line[2] 这是第三行 line[3] 这是第四行 line[4]

下文会对上面两种需求都给出答案,利用下面提到的方法其实远可以实现更复杂的数字序列插入。包括替换指定字符,并在后面依次跟上序列数字。

使用line()

line('.')可以返回当前行号

:g/^/s//=line('.').' '/

非常简单,但不太灵活,只能用于显示当前行的行号

使用ex命令

vim提供了一些可以打印行号的ex命令,如"=", "p # ", "#"

为了获取vim的命令输出,这里需要使用redir

"为前5行加上行号 :redir @a | 1,5#|redir END :1,5d | put! a |1d |6d

在粘贴后在前后都多出一行,所以要用d来删除

使用range, setline, getline

range()可以产生数字序列列表

:for i in range(6) :call setline(i, i.' '.getline(i)) :endfor

range(6)会产生数字列表1-5, 不包含6

变量积加

: let i=1 | g/^/s//=i.' '/ | let i=i+1

这种方法更灵活,可以通过控制i的值变化来控制插入的值

宏和Ctrl-A

可以在数字上按ctrl-A来让数字加一, Ctrl-X让数字减一

过程如下:

手工添加第一行的序号和空格 输入0"ayw将序号和空格放到寄存器a中 移到下一行,执行下面按键
qz0"aP0^A"ayawjq

执行4@z来在下面4行执行保存在寄存器z中的命令序列

上面命令序列的详细解释如下

qz: 开始录制宏,保存在寄存器z中 0: 移到行首 “aP: 把寄存器a中的内容(行号和空格)粘贴到这里 0^A: 移到行首,按下ctrl-A来使当前光标下的数字加一 "ayaw: 把当前光标下的word复制到寄存器a中 j:移到下一行 q: 录制结束

如果没有空格做标志,那么就不能用aw来复制一个word,要用v来选择相应数字部分

注意:在命令行下, ctrl-a需要用ctrl-v, ctrl-a来表示这个按键

在vim下宏比较强大,但一般要写出一个可行的宏需要很多次调试

外部命令

seq是linux下输出序列的命令