Vim 宏录制与回放:把重复编辑录成一条命令
更新时间:2026-08-30。本文是
languages/vim/主题高手层第 0 篇(满足 A2:含 PlantUML + 机制深挖 + ≥2 实测 + ≥2 交叉引用)。
本文要回答的问题
- 宏到底是什么?存在哪?
- 怎么录一段、回放一次、重复 N 次?
- 什么场景用宏,什么场景用
:s替换更合适?
一、机制:宏就是"存进寄存器的按键序列"
宏没有独立存储,它就是把你按下的键原样记录进一个寄存器(见 寄存器)。回放时 Vim 把这些键"重新敲一遍"。所以 qa 录进 a 寄存器,@a 就是把 a 里的内容当按键执行。
关键点:宏记录的是"动作"不是"结果"。比如你录"到行尾加 ;",它会在每一行都"到行尾加 ;",而不是死板地加在某个固定位置。
二、录制与回放实战
场景:给下面每行函数名加 void 前缀。
text
foo()
bar()
baz()操作:
vim
gg " 回到第一行
qa " 开始录进 a
Ivoid <Esc> " 行首插入 "void "
j " 下移一行(为下次做准备)
q " 停止录制现在寄存器 a 里是 Ivoid <Esc>j。对剩下两行:
vim
@a " 回放一次(处理第 2 行)
@@ " 再回放一次(@@ = 重复上一次宏,处理第 3 行)或者一次性跑 N 次:3@a(对当前行及往下 3 次)。
三、跨多行批量:可视模式选中 + 宏
更稳的做法——先选中要处理的行,再对选区逐行跑宏:
vim
V " 行可视,选中目标行块
:normal @a " 对选区每一行执行宏 a:normal 让 Ex 命令在普通模式下解释 @a,配合可视选区就是"对选中行逐行回放"。
四、调试宏:先看存了什么
宏录错了?先看内容:
vim
:reg a " 显示 a 寄存器里的按键序列不满意直接重录 qa 覆盖,或编辑:"ap 把宏贴出来改,再 "ay$ 重新存回 a。
五、宏 vs :s 替换:怎么选
| 维度 | 宏 | :s 替换 |
|---|---|---|
| 适合 | 动作复杂、跨多步(移动+插入+删除组合) | 纯文本模式替换 |
| 学习能力 | 录一次即可,不必想正则 | 要写对正则 |
| 可重复性 | 存寄存器,可反复 @ | 命令历史可重查 |
| 例子 | "每行行首加前缀并复制到下一行" | "把所有 foo 改成 bar" |
经验:结构性、动作型重复用宏;纯文本模式替换用 :s(见 搜索替换)。
六、与金字塔衔接
- 宏依赖 文本对象 才能精准定位操作目标;
- 寄存器机制见 寄存器;
- 复杂自动化可升级到 vimscript 函数。
一句话总结
宏 = 把按键序列录进寄存器(qa…q),@a 回放、3@a 重复 N 次、可视选区+:normal @a 逐行批量;它记录"动作"而非"结果",适合结构性跨步重复,纯文本替换仍交给 :s。
上一篇:Vim 寄存器 下一篇:Vim 文本对象与运算符深挖