Vim 中的宏其实就是一组操作的记录,这组操作可以保存在指定的寄存器中,并且只要寄存器中的内容没有被覆盖掉,可以在任意时刻拿出来播放(即在任意的文本上按照原来的顺序执行录制好的操作)。
宏的录制其实非常简单,其开始和结束都通过 q
来触发,只不过开始的时候需要在其后指定一个寄存器来保存命令:
qa " 开始录制,将操作按顺序保存在寄存器 a 中
A;<ESC>
Ivar <ESC>
q " 结束录制
上面的操作就录制了一个宏,并保存在了寄存器 a 中。
我们可以通过下面的命令来查看寄存器中录制的宏:
:reg a
"a A;^[Ivar ^[
注意,在录制时,禁止使用鼠标。
宏录制好之后,我们可以将光标移动到其他行,然后通过 @{register}
这种方式在当前行上执行指定寄存器中保存的宏。
@@
可以用来重复执行最近调用过的宏。
宏在执行的过程中,如果发生了错误的话,会中断宏的执行;并且如果是串行调用的话,后续的宏调用也会被终止。这里的出错是指宏中的任意一项操作不能正确完成,例如查找没有结果、jk 操作到来文件的结尾行或者开头第一行等。
如果想要连续多次执行一个宏的话,可以通过如下两种方式:
对于录制好的宏,可以通过 n@{register}
这种方式来串行调用指定寄存器中的宏,这种方式调用,如果在执行到某一次时出错的话,后续的次数都会被停止,不会再继续执行。
如果不想在执行的过程中被中断,想要完整的对每一行执行宏时,可以使用并行的方式来调用宏。调用方式如下:
qq
...
q
jVG
:'<,'>normal @q
即并行调用是通过可视模式中的行可视模式批量选中之后配合 normal
命令进行宏调用的。这样会并行执行宏调用,前一个失败时并不会中断后续的宏调用。即每一次调用都是单独进行的,并不会依赖上一次宏调用的执行结果来判断是否执行下一次。
对于要在多个文件中使用的宏,我们可以通过 :argsdo
这条 Ex 命令来实现:
:args *.txt
:argsdo normal @a
上面的部分首先通过 :args
命令批量打开要执行宏的文件,然后使用 :argsdo
来对所有通过 args 打开的文件执行普通命令 @a
,即将寄存器 a 中保存的宏在每个文件上都执行一次。
如果在录制宏的过程中出现来失误的话,可以将宏的内容粘贴在文本中,修改后再放回寄存器中。不要把宏想的太神秘,宏就是一段放在寄存器中的文本,与普通文本唯一的区别就是这段文本在 Vim 有着特殊的含义。所以我们可以通过下面的方式将宏的内容打印出来:
:$put a
上面的命令将寄存器 a 中的内容打印在当前 buffer 的最后一行,在保证正确的前提下可以对其中的命令进行任意的修改,然后再通过下面的命令将修改后的宏放到指定的寄存器中:
"ay$
dd
上面的命令会先将行首到行尾的内容放在寄存器 a 中,然后再通过 d 命令删除这行内容。也可以通过 "add
这个命令来实现剪切到寄存器的功能,但是这个命令会在宏的末尾带着换行符,在有的时候可能会引起不必要的错误。
qa
- 开始录制宏qA
- 向寄存器中追加内容,这里的 A 只是一个示例,表示使用命名寄存器的大写形式
- Github
- Email: web.taox@gmail.com