我有一份文件,里面有很多行。我已经记录了一个宏,它在单行上执行操作。我想在文件中的所有剩余行上重复该宏。有什么快速的方法吗?

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


当前回答

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

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

:5,10norm! @a

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

:5,$norm! @a

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

:%norm! @a

在寄存器的所有行上执行宏存储匹配模式。

:g/pattern/norm! @a

要在视觉上选定的行上执行宏,请按V和j或k,直到选定所需的区域。然后输入:norm!@a,并观察下面显示的输入行。

:'<,'>norm! @a

在vim中输入:help normal可读取更多信息。

其他回答

还有一个叫RangeMacro的插件,就是你想要的!对于每个猜不出名字的人,它的作用是:它对给定范围内的每一行重复一个记录的宏,无论是通过视觉选择还是通过a:40,50 /:+10

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

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

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

:5,10norm! @a

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

:5,$norm! @a

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

:%norm! @a

在寄存器的所有行上执行宏存储匹配模式。

:g/pattern/norm! @a

要在视觉上选定的行上执行宏,请按V和j或k,直到选定所需的区域。然后输入:norm!@a,并观察下面显示的输入行。

:'<,'>norm! @a

在vim中输入:help normal可读取更多信息。

你还可以这样做:

正常模式下:

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

例如:

1000@q

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

更新:公认的答案要好得多 更新:正如@kevinliu指出的那样,你可能想用一个j来结束宏以进入下一行。

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

:g/pattern/normal! @a

有关帮助,请检查::help global。