是否可以使用Vim的正常命令记录和运行递归宏?

时间:2011-01-05 23:46:34

标签: vim recursion macros

假设:

https://stackoverflow.com/questions/ask

在第一个字符的正常模式下,输入qaqqaf/xb@aq@a会清除所有正斜杠。

  1. qaq清除a寄存器
  2. qa开始录制到
  3. f / x删除下一个正斜杠
  4. @a重新运行宏
  5. q结束录制
  6. 但是运行normal qaqqaf/xb@aq@a在b之后停止 - 它似乎在递归调用时保释。如果您尝试使用map命令,也会发生同样的情况。

    我的语法有问题吗?或者用normal记录递归宏是不可能的?


    注意:我知道可以使用let编写递归宏。我想知道这是否是编写递归宏而不手动记录的唯一方法:

    let @a = "f/xb@a"
    normal @a
    

    (因为这个答案我问:Remove everything except regex match in Vim

1 个答案:

答案 0 :(得分:2)

如果你想创建一个递归宏的地图,我建议你先做这样的事情:

nmap <f2> :let @a = "f/xb@a"|normal @a

当然这会破坏@a注册,如果你发现自己做了很多这类映射,那么函数可能更适合你的需求。

这是制作递归宏映射的更安全的替代方法:

function! RecMacroExe(cmds)
  let a = @a
  let @a = a:cmds . "@a"
  try
    normal @a
  finally
    let @a = a
  endtry
endfunction

nmap <f2> :call RecMacroExe("f/xb")<cr>

编辑:根据@Luc Hermitte评论

更改了功能