259

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

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

4

4 回答 4

431

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

在第 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以阅读更多内容。

于 2008-12-23T22:02:04.893 回答
63

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

:g/pattern/normal! @a

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

于 2011-03-13T22:19:56.610 回答
46

你也可以这样做:

在正常模式下:

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

例如:

1000@q

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

更新:接受的答案好多了

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

于 2014-01-03T22:26:02.160 回答
2

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

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

于 2011-03-13T18:38:40.830 回答