【发布时间】:2010-11-20 11:43:34
【问题描述】:
我想在 vim 中运行一个我刚刚记录在寄存器“x”中的宏,它位于打开缓冲区的每一行,从我的光标到缓冲区的末尾。我该怎么做?
我知道我可以重播宏 n 次:
15@x
...或者只是按住@ 直到我到达最后一行,但我只想敲几下键就可以完成它。
提前致谢。
【问题讨论】:
-
15@x 在 Windows gVIM 上不工作
我想在 vim 中运行一个我刚刚记录在寄存器“x”中的宏,它位于打开缓冲区的每一行,从我的光标到缓冲区的末尾。我该怎么做?
我知道我可以重播宏 n 次:
15@x
...或者只是按住@ 直到我到达最后一行,但我只想敲几下键就可以完成它。
提前致谢。
【问题讨论】:
999999@x,除非你有一个非常大的缓冲区...
【讨论】:
%:normal @x 或1,$:normal @x?
99999@x 是您在赶时间时自然想到的 :)
制作递归宏:
qa@aq
例如:
qa0gUwj@aq
它会用单个@a 将当前行的第一个单词 UPCASE 到文件末尾。 但请确保“寄存器为空:
let @a=""
【讨论】:
%:normal 方法更有用,因为它尊重宏中的任何线条移动,因此在线条形式不同的情况下很有用。我发现创建一个宏 'a' 来定义动作然后让宏 'b' 执行递归位(即 qb@a@bq)更容易。
ctrl-c 如果发生这种情况,请停止!
:set nowrapscan 使其失败并在到达文件末尾时停止。
qaq:qaqqa0gUwj@aq。此外,如果您忘记将@q 放在末尾,您可以随时执行qA 来开始附加寄存器,然后执行@q。我通常出于某种原因记录到 reg q,因为它很容易(尤其是递归宏)并且通常最终会执行 qqqqqgUiwj@qq 而不是两个宏。前三个qs 清除reg q,后两个qs 开始录制。见vim.wikia.com/wiki/Record_a_recursive_macro
a 注册一个可以简单的类型qaq
你可以做(在命令模式下)
:%normal @x
【讨论】:
:.,$norm @x 将起作用(.,$ 表示从当前行 . 到最后一行 $)
我个人会做
VG:normal @x
编辑:将寄存器更改为您指定的。
【讨论】:
来自 vim wiki,缩短版本: qqqqq录制宏 @qq 完成录制 @q 执行它(并将运行到文件末尾)
【讨论】: