【问题标题】:In Vim, how do I apply a macro to a set of lines?在 Vim 中,如何将宏应用于一组行?
【发布时间】:2010-09-28 06:11:35
【问题描述】:

我有一个包含一堆行的文件。我记录了一个在单行上执行操作的宏。我想在文件中的所有剩余行上重复该宏。有没有快速的方法来做到这一点?

我尝试了 Ctrl+Q,突出显示了一组行,然后按了 @@,但这似乎不起作用。

【问题讨论】:

  • 题外话问题:我不知道 VIM 宏(或者不想知道 :P)你有一些关于 VIM 宏的面向“懒惰阅读器”的不错的链接吗?
  • 当然,这个:oreillynet.com/mac/blog/2006/07/… 总结得很好。
  • 你也可以检查 :he complex-repeat from inside vim

标签: vim vim-macros


【解决方案1】:

在 Ex 模式下使用normal 命令在多行/所有行上执行宏:

执行第 5 行到第 10 行寄存器 a 中存储的宏。

:5,10norm! @a

在第 5 行到文件末尾执行存储在寄存器 a 中的宏。

:5,$norm! @a

在所有行上执行存储在寄存器a中的宏。

:%norm! @a

在所有匹配 pattern 的行上执行寄存器 a 中的宏存储。

:g/pattern/norm! @a

要在视觉选定的行上执行宏,请按 Vjk 直到选择所需的区域。然后键入:norm! @a 并观察显示以下输入行。

:'<,'>norm! @a

在 vim 中输入 :help normal 阅读更多内容。

【讨论】:

  • 是的,:help normal in vim 或者我刚刚添加的链接。
  • 任何可以帮助非 emacs 用户的东西!
  • 很好!!初学者提示:使用 V 然后 j/k 突出显示您想要的行,然后输入 :norm! @a
  • 要添加来自@KevinBourrillion 的非常有用的提示,在突出显示行后按: 时,Ex 输入行将改为:'&lt;,'&gt;,然后您将添加凯文建议的其余内容.这将使最终命令读取::'&lt;,'&gt;norm! @a.
  • @GabeMoothart ! 避免用户重新映射键。您可能不需要它,但适合所有人的答案需要它。
【解决方案2】:

使用global 在所有包含“pattern”的行上运行宏“a”

:g/pattern/normal! @a

如需帮助,请查看::help global

【讨论】:

  • 只是为了澄清未来的用户:这是一个全局 Ex 命令。
【解决方案3】:

您也可以这样做:

正常模式下:

[number of times to apply the macro] @ [register]

例如:

1000@q

将寄存器 q 中的宏应用到接下来的 1000 行。

更新:accepted answer 好多了

更新:正如@kevinliu 指出的那样,您可能希望以j 结束宏以转到下一行。

【讨论】:

  • 这会在最后一行停止,并且不会在最后一行执行多次,这是我害怕的。
  • @Hubro,其他用户的这些答案对我有用::%norm! @avGG :norm! @a
  • 出于某种原因,这非常有效,而接受的答案却没有。我的宏涉及插入新行、执行操作并移至下一行。
  • @jasonszhao 是的,这里也一样。但无论如何不要说 1000 但所有行直到结束.. 并且仍然照顾新行,做事等。
  • 我认为应该指出您的宏必须以j 命令结尾才能进入下一行,否则它会尝试将其应用于同一行。
【解决方案4】:

还有一个名为 RangeMacro 的插件,完全可以满足您的需求!对于无法通过名称猜测的每个人,它的作用:它为给定范围内的每一行重复录制的宏,无论是通过视觉选择还是通过 :40,50 / :+10

http://www.vim.org/scripts/script.php?script_id=3271

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多