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

Jor*_*mer 211 vim vim-macros

我有一堆文件.我记录了一个在一行上执行操作的宏.我想在文件中的所有剩余行上重复该宏.有快速的方法吗?

我尝试了Ctrl + Q,突出显示了一组行,然后按下了@@,但这似乎并没有成功.

Jud*_*den 334

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

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

:5,10norm! @a
Run Code Online (Sandbox Code Playgroud)

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

:5,$norm! @a
Run Code Online (Sandbox Code Playgroud)

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

:%norm! @a
Run Code Online (Sandbox Code Playgroud)

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

:g/pattern/norm! @a
Run Code Online (Sandbox Code Playgroud)

要在可视选择的行上执行宏,请按Vjk,直到选择所需的区域.然后键入:norm! @a并观察后面的输入行.

:'<,'>norm! @a
Run Code Online (Sandbox Code Playgroud)

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

  • 尼斯!初学者提示:使用V然后j/k突出显示所需的行,然后键入`:norm!@了` (45认同)
  • 要从@KevinBourrillion添加非常有用的提示,在突出显示行后按`:`时,Ex输入行将改为读取`:'<,'>`,然后您将添加Kevin建议的其余部分.这将使最终命令成为:`:'<,'> norm!@了`. (7认同)
  • `:克/模式/常态!@了` (4认同)
  • @GabeMoothart`!`避免用户重新映射密钥.您可能不需要它,但是适合每个人的答案都需要它. (3认同)
  • 我不明白为什么最后需要“!”;其他“norm”用法不需要​​它。 (2认同)

Ser*_*ujo 59

:g/pattern/normal! @a
Run Code Online (Sandbox Code Playgroud)

:help global

  • 仅供将来用户澄清:这是一个全局Ex命令. (3认同)

Max*_*ber 37

你也可以这样做:

在正常模式下:

[number of times to apply the macro] @ [register]
Run Code Online (Sandbox Code Playgroud)

例如:

1000@q
Run Code Online (Sandbox Code Playgroud)

将寄存器q中的宏应用于下一行1000行.

  • 这停在最后一行,并且不会在最后一行执行多次,这是我害怕的. (3认同)
  • 由于某种原因,这非常有效,并且接受的答案没有.我的宏涉及插入一个新行,做东西,然后移动到下一行. (2认同)
  • 我认为应该指出,您的宏必须以“ j”命令结尾才能下一行,否则它将尝试将其应用于同一行。 (2认同)