跳过正文
  1. Posts/

neovim_macro

·961 字·2 分钟· loading · loading · · ·
ICE345
作者
ICE345
CS Student | System | Linux | OCaml

Neovim 的「宏编程」就是通过录制并使用宏(macro)来快速执行重复性操作。它是 Vim/Neovim 中非常实用、效率极高的功能之一。


✅ 什么是 Neovim 的宏?
#

宏本质上是:你在 Normal 模式下的操作序列的录音回放。

你可以:

  • 录制一系列操作
  • 保存到某个寄存器(比如 a
  • 通过 @a 来重复执行
  • 还可以用 @@ 重复上一次宏调用

📌 宏的基本使用步骤:
#

动作命令
开始录制宏q<寄存器> 例如 qa 开始录到寄存器 a
执行操作你正常地输入命令(比如 dw, j, iHello<Esc> 等)
停止录制q
执行宏@a 执行寄存器 a 的宏
重复执行上一个宏@@

🛠 示例:删除每一行的第一个单词
#

  1. qa → 开始录制到 a
  2. ^dwj → 移动到行首 (^),删除一个词 (dw),跳到下一行 (j)
  3. q → 结束录制
  4. @a → 执行一遍宏
  5. @@ → 再次执行刚才的宏
  6. 也可以:10@a → 执行 10 次

📎 技巧和注意事项:
#

  • 宏只能录制 Normal/Insert/Visual 模式下的操作,不能直接录制 Lua 或 Vimscript。
  • 宏操作受当前光标位置、寄存器内容、编辑器状态影响,操作前最好保证状态一致。
  • 如果你在 Insert 模式下输入内容,宏也会录进去。
  • 宏中的移动建议用固定逻辑(例如 0, $, ^)而非手动左右移动(如 l, h),避免光标状态不同导致行为异常。

🚀 想更强?可以结合:
#

  • :normal 批量应用宏到多个行,比如:

    :10,20 normal @a
  • Lua 中调用宏或用 Lua 实现更强的批处理(如使用 vim.api.nvim_feedkeys


示例
#

test1 1.txt
test2 2.txt
test3 3.txt
...
test10 10.txt

你想借助 Neovim 宏编程(比如使用 @a)自动生成这些行。我们来分两种情况:


✅ 情况一:你只有第一行 test1 1.txt,想生成接下来的行
#

这种情况,我们可以借助宏 + Ctrl-a(数字加一命令)来自动生成每一行!

🪄 操作步骤如下:
#

  1. 手动输入第一行:

    test1 1.txt
  2. 移动光标到行首,执行:

    qa             " 开始录制宏到寄存器 a
    yyp            " 复制整行并粘贴
    w<C-a>         " 移动到数字1,加1(变成2)
    w<C-a>         " 再往后移动到 1.txt 中的1,再加1(变成2.txt)
    q              " 停止录制
  3. 然后执行:

    @a             " 执行宏一次
    @@             " 重复上一次宏(可以多次按)

或者批量执行 9 次(再加9行):

9@a

👀 结果你将得到:
#

test1 1.txt
test2 2.txt
test3 3.txt
test4 4.txt
...
test10 10.txt

💡 补充说明
#

  • yyp:复制整行并粘贴

  • w<C-a>:先跳到第一个数字(1),然后 Ctrl-a 加1

  • w<C-a>:继续跳到下一个数字加1(即 1.txt 中的 1

  • 只要你的格式是 英文单词+空格+数字.txt,这套宏就能自动推进


如果你之后格式变复杂,比如:

prefix-test01 result_001.txt

这种带前导零的情况,也可以用 g<C-a>(更高级的 Vim 自增命令)或 Lua 批量生成