在dailyvim.blogspot.com上看到一篇讲述Recursive Macros的小文。
以前从来没意识到vim的宏还支持递归,递归宏有什么作用呢? 最容易想到的就是可以在整个文件范围内执行宏。之前要在一个文件中从头到尾执行一个宏要怎么做,输入N@a,N是个很大的数,一定要大于文件总行数,a是寄存器的名字。有了宏递归,只需@a就可以搞定。
举个例子,有下面这样的文件内容:
1
2
3
4
5
将光标移至首行1的位置,在普通模式下键入以下操作:
qaq 清除寄存器a
qa<Ctrl-a>j@aq
其中<Ctrl-a>是将当前光标之上或之后的数值或者字母加1。
现在在首行键入@a,即可在将每一行的数字加一, 效果如下:
2
3
4
5
6
递归宏的另外一种应用就是生成一个连续序列,如下面的操作:
qaq
qYp<Ctrl-a>@ap
其中 Y复制一行,p将复制的内容贴到下一行,光标也会跟随到下一行。这个递归宏会生成新行,没有递归出口,只能用<Ctrl-C>强制退出。