写代码改配置时,经常要对多行做相同操作:比如给每行开头加 # 注释、批量删掉某段文字、统一替换变量名前缀……手动一遍遍按,费眼又容易出错。其实 Vim 早内置了「宏录制」功能,不用插件,几秒就能录下你的按键操作,回放一次、十次、上百次都行。
怎么开始录?就一个字母
在普通模式下,按下 q 键,再按任意小写字母(比如 a),就进入了录制状态——Vim 会把接下来的所有按键操作存进寄存器 a 里。屏幕左下角会显示 recording @a。
比如你想给当前光标所在行和下面两行都加上 // 前缀:
qajI// <Esc>jI// <Esc>jI// <Esc>q拆开看:qa 开始录到寄存器 a;j 下移一行;I// <Esc> 进入行首插入模式、输入 // 、按 Esc 退出;重复两次后,再按一次 q 停止录制。
回放不靠手,靠 @
录制完,把光标移到想应用的地方,按 @a 就能重放一次。想连放 5 次?直接输 5@a。如果录的内容本身包含移动(比如 j 或 w),它会自动跟着光标位置“走”,非常自然。
再举个实用例子:清理日志文件中带 DEBUG 的行。先用 /DEBUG<Enter> 定位第一处,然后录:
qdiwddqqd 开始录到 d;iw 删除当前单词(即 DEBUG);dd 删整行;q 结束。之后只要不断按 @d,Vim 就会跳到下一个匹配处、删词、删行,一气呵成。
宏也能「叠着用」
宏不是只能单打独斗。比如你录了个格式化 JSON 行的宏 m,又录了个保存退出的宏 x,那 @m@x 就是格式化 + 保存。甚至可以把多个宏串起来录进新宏里——把光标放到合适位置,按 qq 开始录进 q,再依次按 @m@m@m@x,最后 q 结束,以后按 @q 就是一键三连。
小技巧:用 :reg 可以查看所有寄存器内容,包括你刚录的宏,方便检查有没有误操作;想清空某个宏?:let @a = '' 就行。