是否可以使用 Vim 的普通命令来记录和运行递归宏?

发布于 2024-10-10 13:03:41 字数 705 浏览 1 评论 0原文

给出:

https://stackoverflow.com/questions/ask

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

  1. qaq 清除 a 寄存器
  2. qa 开始录制到 a
  3. f/x 删除下一个正斜杠
  4. @a 重新运行宏
  5. q 结束录制

但是运行 正常 qaqqaf/xb@aq@a 在 b 之后停止 - - 它似乎放弃了递归调用。如果您尝试使用 map 命令,也会发生同样的情况。

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


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

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

我因为这个答案而问:删除 Vim 中除正则表达式匹配之外的所有内容 )

Given:

https://stackoverflow.com/questions/ask

From normal mode at the first character, typing in qaqqaf/xb@aq@a clears all of the forward slashes.

  1. qaq clears the a register
  2. qa starts recording to a
  3. f/x deletes the next forward slash
  4. @a re-runs the macro
  5. q ends the recording

But running normal qaqqaf/xb@aq@a stops after b -- it seems to bail at the recursive call. The same happens if you try to use map the command.

Is there something wrong with my syntax? Or is it impossible to record a recursive macro with normal?


Note: I know it's possible to write a recursive macro with let. I'm wondering if this is the only way to write a recursive macro without recording it manually:

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

(I ask because of this answer: Remove everything except regex match in Vim )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绾颜 2024-10-17 13:03:41

如果您想创建到递归宏的映射,我建议您首先这样做:

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 评论更改了函数

If you want to create a map to a recursive macro I suggest you start by doing something like so:

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

Of course this clobbers the @a register and if you find you self doing many of these kinds of mappings maybe a function would better suit your needs.

Here is a safer alternative to making recursive macro mappings:

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>

Edit: Changed function according to @Luc Hermitte comment

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文