ChatGPT解决这个技术问题 Extra ChatGPT

在 Vim 中,如何将宏应用于一组行?

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

我尝试了 Ctrl+Q,突出显示了一组行,然后按了 @@,但这似乎没有奏效。

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

J
Judge Maygarden

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

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

:5,10norm! @a

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

:5,$norm! @a

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

:%norm! @a

在匹配模式的所有行上执行寄存器 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 输入行将改为 :'<,'>,然后您将添加 Kevin 建议的其余内容。这将使最终命令读取::'<,'>norm! @a
@GabeMoothart ! 避免用户重新映射键。您可能不需要它,但适用于每个人的答案需要它。
k
kenorb

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

:g/pattern/normal! @a

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


只是为了澄清未来的用户:这是一个全局 Ex 命令。
G
Ginhing

你也可以这样做:

在正常模式下:

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

例如:

1000@q

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

更新:接受的答案要好得多更新:正如@kevinliu 指出的那样,您可能希望以 aj 结束宏以转到下一行。


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

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

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