共212行

neovim 宏

2026-07-17 12:50:39

neovim 宏操作详细介绍

Neovim(Vim)里的**宏(Macro)本质上是把一系列按键操作录制到一个寄存器(register)**里,然后再回放执行。它不依赖插件,是内置最核心的批量编辑能力之一。

一、宏的基本概念

二、核心操作流程

1. 开始录制

在 Normal 模式下输入:

qa

此时底部会显示 recording @a,表示正在录制。

2. 执行你要的操作

比如在当前行:

这些按键都会被原样记录。

3. 停止录制

再按一次:

q

底部 recording @a 消失,录制完成。

4. 回放宏

三、查看 / 编辑宏内容

宏存在寄存器里,可以用寄存器相关命令查看和改写。

查看宏

:registers a

或简写:

:reg a

会看到类似:

a   0i// ^[j

其中 ^[<Esc> 的转义表示。

手动编辑宏(很实用)

宏本质是字符串,可以直接赋值修改:

:let @a = '0i// ^[j'

注意:^[ 在命令行里要用 <C-v><Esc> 输入,不能直接粘文本。

也可以在普通模式下把宏粘贴出来改:

"ap   " 把寄存器 a 的内容粘贴到当前缓冲区
"ayy  " 改完后把这行再存回寄存器 a

四、在可视化模式下对多行执行宏

这是宏最强用的场景之一。

  1. 在第一行录制好宏 qa ... q
  2. 选中接下来几行:
    V4j   " 选中当前行 + 下面 4 行
  3. 执行:
    :normal @a

会对每一行分别执行一次宏。

五、常用技巧

1. 宏里用相对运动

宏里尽量用:

2. 在宏末尾加移动,方便重复

比如在宏最后加 j,这样:

3. 递归宏(自我调用)

如果宏 a 的最后一步是 @a,会形成递归,直到出错或无法执行才停(常用于“处理到文件尾”)。

更安全的方式是条件退出,比如配合搜索:

/pattern^M   " 找不到会报错停止

4. 跨文件使用宏

全局寄存器内容在默认 ShaDa 里会持久化(前提是没禁用 shada),重启 Neovim 后 @a 仍然可用。

六、宏 vs 点命令(.

七、常见坑

宏卡住了,如何退出

宏卡住通常是因为宏在无限循环(比如递归宏)或者等待某个输入(比如搜索不到内容时停在提示状态)。以下是几种退出方法:

紧急退出方法

方法一:按 Ctrl + C(最快)

Ctrl + C

这是最通用的中断键,能打断大多数卡住的宏。

方法二:按 Esc 多次

Esc  Esc  Esc

连按几次,有时候能退出等待状态。

方法三:按 q 停止录制

如果宏还在录制状态(底部显示 recording @a),按一次 q 停止录制。

方法四:强制退出 Neovim

如果以上都不管用:

:q!

:qa!

强制退出所有窗口。

预防宏卡住的小技巧

1. 宏里不要用裸的搜索命令

错误的写法:

qa/patternEnterjq

如果搜索不到,宏会停在 / 等待输入。

安全的写法:

qa/patternEnterjjq

或者加个 ? 反向搜索兜底。

2. 递归宏加终止条件

qa
...
/END_OF_FILEEnter   " 如果找到 END_OF_FILE 就停
@a                   " 否则继续
q

3. 限制执行次数

不确定宏会不会卡住时,先试:

5@a   " 只执行 5 次

而不是直接 1000@a

最实用的组合拳

下次遇到宏卡住,按这个顺序试:

  1. Ctrl + C(大概率解决)
  2. 再按 Esc
  3. 如果还不行,:q! 强退

一般来说 Ctrl + C 就够了,除非 Neovim 本身崩溃。!

宏执行到文件末尾的方法总结

方法 命令 适用场景 优点 缺点
暴力次数法 999@a 文件行数确定且不太多 简单直接,不用记命令 行数超了会报错中断;少了执行不完
递归宏 宏末尾加 @a,然后执行 @a 不确定行数,想自动跑到末尾 一次触发,自动执行到底 宏里必须有移动指令,否则死循环
:normal 范围法 :.,$ normal @a 从当前行执行到文件末尾 精准控制起始行,不依赖宏内移动 需要手动输入范围
:global 全文件法 :%normal @a 对整个文件每行执行一次宏 最推荐,清晰可控,不易出错 宏必须设计成每行独立可执行
选中区域法 V 选中多行,再 :normal @a 只想对部分行执行 可视化选择,直观 需要先手动选中

推荐用法对比

场景 最佳方案
处理整个文件 :%normal @a
从当前位置处理到文件尾 :.,$ normal @a
处理选中的几行 选中后 :normal @a
快速搞一下,不管报错 999@a
想炫技 递归宏 @a 末尾加 @a