Vim 技巧 - 规范光标位置、直达目标以及中止宏
执行宏的过程中,有时会产生意外的结果,但如果我们能遵从一些最佳的应用方式,就能取得更好的一致性。
当我们执行一个宏时,Vim 会机械地重复这个打包在一起的按键操作序列。如果我们不小心的话,在回放宏时的结果会偏离我们的预期。但我们也可以录制更灵活的宏,针对每一种情况,它都能应对自如。
黄金法则:在录制一个宏时,要确保每条命令都可被重复执行。
# 规范光标的位置
一旦你开始录制宏,首先要问自己几个问题,我在哪里?我从哪里来?我要去哪里?在你做任何事之前,要确保你的光标位置已经就位,只有这样,下一条命令才会做你想做的事情,去你想去的地方。
这也许意味着应该把光标移到下一处查找匹配项(n
),或者当前行的行首(0
),又或是当前文件的首行(gg
)。如果每次总是从确定的位置开始执行的话,那么命中正确的目标会变得更容易。
# 用可重复的动作命令直达目标
Vim 有一组丰富的动作命令集,通过它们,可以直达文本文件的各个角落。因此,我们要善用这些命令。
千万别光为了让光标到达目标而一味地敲 l
键。请记住,Vim 会机械地执行你的按键操作。例如,当你录制宏时,将光标向右移动了 10 个字符的位置,这一次目的是达到了,但回放宏时怎么办?因为在另一段上下文中,“将光标向右移动 10 个字符的位置”也许已经移过了,或是还没到。
面向单词的动作命令,如 w
、b
、e
和 ge
,与面向字符的动作命令 h
和 l
相比,更具灵活性。如果我们录制“动作命令 0
,后跟 e
”,当每次执行该宏时,我们都能预料得到一致的结果,光标会移到当前行第一个词的最后一个字符上。只要该行包含至少一个词,无论该词包含多少个字符,都能够到达目标。
我推荐你用查找命令定位,或者用文本对象。总之,请用好 Vim 提供的所有动作命令,尽量使你的宏兼具灵活性与可重复性。还有一点别忘了,在录制宏的过程中,禁止使用鼠标。
# 当动作命令失败时,宏将中止执行
Vim 的动作命令可能会执行失败。举例来说,如果光标位于文件的首行,运行 k
命令将什么也不会发生。若光标位于文件的末行,按下 j
也会出现同样的情况。当发生上述情况时,Vim 会提示我们动作命令失败了。
如果宏执行动作命令失败了,Vim 将中止执行宏的其余命令。这是一项功能,而不是漏洞。我们可以用动作命令进行简单测试,来判断该宏是否应该在当前上下文中继续执行。
考虑这样一个例子:我们要查找一个模式(pattern),假设文档中有 10 处匹配。我们开始录制宏,先用 n
重复上一次的查找操作。一旦光标移到匹配处,我们会做一些小的修改。然后,停止宏的录制。改完这处后,这个地方就再没有可匹配的模式了。至此,整篇文档只剩 9 处匹配了。
当我们执行这个宏时,光标将移到下一处匹配并做相同的修改。至此,整篇文档只剩下 8 处匹配了。就这样,我们周而复始地执行该宏,直到再也没有一处匹配为止。若此时再执行该宏,由于已没有匹配项,n
命令会失败,宏将中止退出。
假设宏保存在寄存器 a
中。这一次,我们不再执行 10 次 @a
,而是改用次数作为前缀执行宏 10@a
。这种技术的过人之处,就在于执行宏的时候,可以不必顾忌执行的次数。真的不用去管执行次数了么?当然!我们可以执行 100@a
,甚至是 1000@a
,反正结果都是一样的。