You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为缓冲区所有标记执行宏?求Vim/Neovim实现方案

对所有缓冲区标记执行宏的实现方案

原生Vim命令快速实现

如果你不想写函数,可以直接执行这条命令(假设宏录制在q寄存器):

:for m in split(execute('marks'), '\n') | if m =~# '^ [a-zA-Z]' | execute("normal! `".m[1]."@q") | endif | endfor
  • 逻辑说明:通过execute('marks')获取所有标记列表,筛选出a-z/A-Z的普通标记,逐个跳转到标记位置并执行宏。

VimL函数实现(兼容Vim/Neovim)

定义可复用的函数,方便后续调用:

function! ExecuteMacroOnMarks(macro_reg)
  " 获取所有标记的文本输出并按行分割
  let marks_list = split(execute('marks'), '\n')
  for line in marks_list
    " 仅匹配小写/大写字母标记(跳过特殊标记如'、"等)
    if line =~# '^ [a-zA-Z]'
      let mark_char = line[1]
      " 跳转到标记并执行指定寄存器的宏
      execute "normal! `".mark_char."@".a:macro_reg
    endif
  endfor
endfunction

使用方式:

  1. 录制宏到目标寄存器(比如q)
  2. 执行:call ExecuteMacroOnMarks('q')

Lua函数实现(Neovim专属)

针对Neovim的Lua API实现更简洁的版本:

local function execute_macro_on_marks(macro_reg)
  -- 获取标记列表的文本输出
  local marks_output = vim.api.nvim_exec('marks', true)
  local marks_list = vim.split(marks_output, '\n')
  
  for _, line in ipairs(marks_list) do
    -- 筛选普通字母标记
    if vim.fn.match(line, '^ [a-zA-Z]') ~= -1 then
      local mark_char = line:sub(2, 2)
      -- 执行跳转+宏调用的普通模式命令
      vim.cmd(string.format('normal! `%s@%s', mark_char, macro_reg))
    end
  end
end

使用方式:

  1. 录制宏到目标寄存器(比如q)
  2. 执行:lua execute_macro_on_marks('q')
  3. 可将其绑定为快捷键,比如:
    vim.keymap.set('n', '<leader>mq', function() execute_macro_on_marks('q') end, {desc = "Execute macro q on all marks"})
    

插件辅助方案

可以使用vim-scripts/marks.vim插件增强标记管理能力,结合它的标记列表功能批量执行宏:

  1. 安装插件后,用:MarksList查看所有标记
  2. 结合之前的VimL/Lua函数,直接复用逻辑即可,插件会自动过滤无效标记,减少筛选成本。

注意事项

  • 确保宏录制的操作是可重复、无副作用的,避免因光标位置、缓冲区内容变化导致意外结果
  • 如果需要包含特殊标记(如'、"),可修改正则表达式,比如将^ [a-zA-Z]改为^ .来匹配所有标记
  • 执行前可先用:marks命令预览所有标记,确认目标标记都在列表中

内容的提问来源于stack exchange,提问作者gameloader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:25:15