外观
Vim 键盘宏:和重复编辑说再见
很多人刚开始用 Vim 时,知道 d、y、p、:%s/old/new/g 这些命令,却忽略了一个非常实用和高级的功能:键盘宏(macro)。当你面对一批“结构相似、但又不完全相同”的重复编辑任务时,键盘宏往往比手工修改更快,也比写一次性脚本更直接。
本文介绍 Vim 键盘宏的核心用法、常见场景和一些容易踩的坑。
什么是键盘宏
键盘宏本质上就是:把你在 Normal 模式下的一串按键记录下来,之后重复播放。
它特别适合下面这类任务:
- 给多行文本添加相同格式
- 对每一行做类似的删改
- 批量提取、调整、重排内容
- 需要“按固定步骤编辑很多次”,但又不值得专门写脚本
可以把它理解成 Vim 里的“录制操作序列”。
最基本的三步
Vim 键盘宏最常用的命令只有三个:
qa " 开始录制宏到寄存器 a
q " 结束录制
@a " 执行寄存器 a 中的宏
100@a " 执行寄存器 a 中的宏 100 次这里的 a 是寄存器名,你也可以换成任意小写字母,如 qf、qx、qq 等。
一个最小例子:
假设有下面几行:
apple
banana
orange想把它们改成:
item: apple;
item: banana;
item: orange;可以这样做:
- 把光标移动到第一行
- 输入
qa开始录制 - 输入
Iitem: <Esc>A;<Esc>j - 输入
q结束录制 - 输入
2@a,对后两行重复执行
解释一下录制内容:
Iitem: <Esc>:在行首插入item:A;<Esc>:在行尾追加;j:移动到下一行,为下一次执行做好准备
追加录制到已有宏
如果宏差一点点就够用了,不必从头重录。可以用大写寄存器名追加:
qA
...再录制一些动作...
q这表示把新录制的内容追加到寄存器 a 现有宏的后面。
查看和编辑宏
宏实际存放在寄存器里,所以可以用:reg a直接查看, :reg可以查看所有寄存器。
如果你想更精细地修改宏内容,可以把寄存器内容粘出来编辑:
"ap上面这条命令会把寄存器 a 的内容粘贴到当前缓冲区。改好以后,再用下面的方法写回:
"ay$当然,更常见的做法仍然是直接重录,因为短宏通常比“手动编辑按键序列”更容易维护。
一个复杂的键盘宏高效场景
现在我有一些壁纸图片,我希望整理成一个 html 列表,并且要有链接直接到每张壁纸,方便我查看,这个 html 文件类似于这样:

下面这个小视频展示了怎么用键盘宏把一大段文本快速变成一个 html 列表:
视频里的操作可以拆成两步理解:
- 先新建一个
index.html - 用
:r!ls把当前目录下的文件名读进来,再录一个宏,把每一行文件名改成一条 html 链接
其中,录制宏时的按键思路可以概括为:
qa:开始录制宏到寄存器aI<a href="<Esc>:在行首插入<a href="A"><Esc>:在行尾补上">hhyi":回到引号内部,把文件名复制下来- 到行尾把刚才复制的文件名再粘贴一份,作为链接文字
- 继续补上
</a><br> j0:跳到下一行行首,方便继续执行这个宏q:结束录制
录好之后,再用 @a 或 200@a 之类的命令批量回放,就能把整列文件名快速变成 html 链接列表。
录制宏时的几个原则
想让宏稳定可复用,最好遵循下面几个原则:
- 尽量从明确的位置开始,比如行首
0、首个非空字符^、行尾$ - 尽量使用文本对象或查找命令,比如
w、f,、t)、ci",少依赖“按几次l” - 宏里最好包含“为下一次执行准备环境”的动作,比如
j0 - 先在 2 到 3 行上试跑,确认没问题后再批量执行
- 优先在 Normal 模式下录制,避免插入模式里输太多不可控内容
这些原则的核心是:让宏依赖文本结构,而不是依赖当前偶然的光标位置。
结语
Vim 键盘宏的价值,在于把重复劳动压缩成一组可复用动作。很多本来需要几十次机械编辑的工作,录一个宏后几秒钟就结束了。
如果你已经会用 Vim 的基本移动和编辑命令,那么键盘宏几乎是下一步最值得掌握的功能之一。真正开始用起来后,你会发现它比想象中实用得多。与其它编辑器相比,Vim 更像是一门“语言”,键盘宏就是它的“函数”,让你能把复杂的编辑逻辑封装起来,随时调用。
版权所有
版权归属:Guisong Wu