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


222

我有一行文件。我记录了一个宏,它在一行上执行操作。我想在文件的所有其余行上重复该宏。有快速的方法可以做到这一点吗?

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


题外话:我不了解VIM宏(或不想知道:P)您在VIM宏上是否有一些面向“惰性阅读器”的链接?
OscarRyz

当然,这是:oreillynet.com/mac/blog/2006/07/…总结得很好。
乔丹·帕默

您也可以检查一下:他从vim内部重复执行
Sam Sam

Answers:


354

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

在第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以了解更多信息。


1
是的,:vim或我刚刚添加的链接:help normal。
Maygarden法官08年

1
有什么可以帮助非emacs用户的!
Maygarden法官08年

48
不错!初学者提示:使用V,然后按j / k突出显示所需的行,然后仅键入:norm! @a
Kevin Bourrillion 2011年

7
要添加来自@KevinBourrillion的非常有用的技巧,请:在突出显示各行之后按,Ex输入行将改为显示,:'<,'>然后向您添加Kevin建议的其余内容。这将使最终命令显示为::'<,'>norm! @a
Deiwin 2015年

3
@GabeMoothart !避免用户重新映射键。您可能不需要它,但是一个适合所有人的答案都需要它。
梅加登法官'16

60

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

:g/pattern/normal! @a

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


4
只是为了向将来的用户说明:这是一个全局Ex命令。
2013年

39

您也可以这样做:

在正常模式下:

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

例如:

1000@q

将寄存器q中的宏放在下一个1000行中。

更新:可接受的答案要好得多

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


4
这会在最后一行停止,并且不会在我担心的最后一行执行多次。
Hubro

:@Hubro,来自其他用户的这些问题的答案为我工作:%norm! @avGG :norm! @a
最大Heiber

2
出于某种原因,该方法非常有效,而可接受的答案却没有。我的宏涉及插入新行,执行操作以及移至下一行。
jasonszhao 2015年

@jasonszhao是的,这里也是。但反正是有没有说1000,但所有的行,直到结束..而且还照顾新线,做的东西,等等
ihightower

2
我认为应该指出,您的宏必须以j命令结尾才能下一行,否则它将尝试将其应用于同一行。
凯文·刘

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.