Skip to content

第七章: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 用得行云流水,还有几样“内功” 值得一学:精确圈定编辑范围的文本对象、掌控复制粘贴的寄存器、在代码里来去有痕的标记 跳转,以及跨文件批量操作。接下来几章我们逐一拿下。

下一章将介绍文本对象。