2011-01-05 160 views
2

考虑:是否有可能用Vim的正常命令记录和运行递归宏?

https://stackoverflow.com/questions/ask 

从正常模式下的第一个字符,在qaqqaf/[email protected]@a键入清除所有的斜杠。

  1. QAQ清除寄存器
  2. QA开始记录到
  3. F/X删除下一个正斜杠
  4. @a重新运行宏
  5. q结束记录

但在运行normal qaqqaf/[email protected]@a后停止 - 它似乎在递归调用保释。如果您尝试使用映射命令,则会发生同样的情况。

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


注:我知道这是可以写一个递归宏与let。我想知道,如果这是写了递归宏无需手动记录的唯一途径:

let @a = "f/[email protected]" 
normal @a 

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

+0

Vim可以在寄存器宏执行任何更改的功能。因此,无论如何,将命令放入寄存器都是一种方式,就像在文本中一样。我相信'让'是做这个映射的最好方法。 – 2011-01-07 23:58:58

+0

对,但是有可能用'normal' **来记录一个递归宏**吗? – idbrii 2011-01-09 03:21:02

+0

似乎'正常'不能很好地处理递归宏。我似乎无法得到一个适当的记录。但是,您可以像这样一起使用'execute'和'feedkeys()':'exe feedkeys(“qaqqar_l @ aq @ a”,'t')'来记录和执行宏。 – 2011-01-11 21:33:50

回答

2

如果你想创建一个映射到递归宏我建议你开始做的东西像这样:

nmap <f2> :let @a = "f/[email protected]"|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评论

+0

在这些情况下,最好将可能失败的部分封装到try块中,并将@a恢复到finally块中。 – 2011-01-06 09:16:19

+0

好抓住@Luc。我已更新与您的更正功能 – 2011-01-06 16:07:34

+0

本质上接受为“不使用正常,使用让”,你的功能也是一个好主意。 – idbrii 2011-01-13 00:08:27