第七章:Vim 中的宏
宏会把一串 Normal 模式操作录进寄存器,再按需重复执行。它适合“每一行都做同一件事” 但又不方便用 Visual Block 处理的场景。
还记得上一章中把文本转成数组的例子吧,我们再做一次,不过这次使用 宏。
搜索
/^Mercury$到第一项,按qa开始录制到寄存器a,然后依次执行I' Esc A ', Esc j q。空格只用于分组。按@@处理下一行,再按3@a处理 余下三行。
javascript
var myArray = [
Mercury
Venus
Earth
Mars
Jupiter
];完成后每一项都应该形如 'Mercury',,光标停在 ]; 一行。
刚才的操作可以拆成几部分:
q开始录制,a指定寄存器;录制宏通常使用 a-z;I' Esc A ', Esc j是录下的操作:在行首和行尾添加字符,然后移到下一行;- 第二个
q结束录制; @a执行寄存器a中的宏,@@重复最后一次宏,前面的数字表示执行次数。
设计可靠的宏
- 先手动完成一行,确认操作正确,再撤销并开始录制;
- 让宏最后移动到下一处目标,这样连续执行才接得上;
- 优先使用
0、$、f<X>、文本对象等相对动作,避免依赖固定列号; - 先用
@a单步测试,再用<N>@a批量执行; - 执行次数过多时,宏可能改到下一段内容,所以不要盲目给一个很大的数字。
可以用 :reg a 查看刚录下的按键。宏本质上就是寄存器里的文本,这也解释了为什么 录制前要指定一个寄存器。
执行
:reg a找到寄存器a,看看能否从其中的字符认出刚才的操作。若想重新完成 整段练习,连续按u恢复原文,再从第一项开始录制。
到这里,Vim 的基础操作就告一段落了。不过想真正把 Vim 用得行云流水,还有几样“内功” 值得一学:精确圈定编辑范围的文本对象、掌控复制粘贴的寄存器、在代码里来去有痕的标记 跳转,以及跨文件批量操作。接下来几章我们逐一拿下。
下一章将介绍文本对象。