重播 vim 宏直到缓冲区结束
Posted
技术标签:
【中文标题】重播 vim 宏直到缓冲区结束【英文标题】:replay a vim macro until end of buffer 【发布时间】:2010-11-20 11:43:34 【问题描述】:我想在 vim 中运行一个我刚刚记录在寄存器“x
”中的宏,它位于打开缓冲区的每一行,从我的光标到缓冲区的末尾。我该怎么做?
我知道我可以重播宏 n 次:
15@x
...或者只是按住@
直到我到达最后一行,但我只想敲几下键就可以完成它。
提前致谢。
【问题讨论】:
15@x 在 Windows gVIM 上不工作 【参考方案1】:999999@x
,除非你有一个非常大的缓冲区...
【讨论】:
为什么不只是%:normal @x
或1,$:normal @x
?
这绝对是更优雅的解决方案 - 我猜99999@x
是您在赶时间时自然想到的 :)
除非你正好有 999999 行,否则 9999999@x 不会在最后一行运行多次吗?
刚试过。挂起会话。可能会继续运行一百万次,而不会在行尾停止。
至少在某些情况下这不会像预期的那样运行。考虑在其中包含 find next / find prev 的宏。因此,一旦宏重复到达文件末尾,它将从头继续。 vim doc on the subject。为了防止搜索换行,可能需要使用 :set nowrapscan。这是我可以想出的一个例子,但这并不意味着没有更多的例子。 :%normal @x 是@ryan_s 在上面的回答中建议的一种方式。【参考方案2】:
制作递归宏:
qa@aq
例如:
qa0gUwj@aq
它会用单个@a 将当前行的第一个单词 UPCASE 到文件末尾。 但请确保“寄存器为空:
let @a=""
【讨论】:
优秀。这种方法比%:normal
方法更有用,因为它尊重宏中的任何线条移动,因此在线条形式不同的情况下很有用。我发现创建一个宏 'a' 来定义动作然后让宏 'b' 执行递归位(即 qb@a@bq)更容易。
如果您的宏涉及搜索,请避免这样做,因为它将从顶部继续。 ctrl-c
如果发生这种情况,请停止!
@IainBallard, :set nowrapscan
使其失败并在到达文件末尾时停止。
要清除寄存器a,只需在宏之前执行qaq
:qaqqa0gUwj@aq
。此外,如果您忘记将@q
放在末尾,您可以随时执行qA
来开始附加寄存器,然后执行@q
。我通常出于某种原因记录到 reg q,因为它很容易(尤其是递归宏)并且通常最终会执行 qqqqqgUiwj@qq
而不是两个宏。前三个q
s 清除reg q,后两个q
s 开始录制。见vim.wikia.com/wiki/Record_a_recursive_macro
我想清除a
注册一个可以简单的类型qaq
【参考方案3】:
你可以做(在命令模式下)
:%normal @x
【讨论】:
我喜欢这个解决方案,但我会在缓冲区的每一行执行宏,OP 只从光标到末尾询问。 @Porunga:.,$norm @x
将起作用(.,$
表示从当前行 .
到最后一行 $
)【参考方案4】:
我个人会做
VG:normal @x
编辑:将寄存器更改为您指定的。
【讨论】:
不错的一个。我喜欢这个解决方案只在选定的区域上运行。 我把它映射到了 nnoremap来自 vim wiki,缩短版本: qqqqq录制宏 @qq 完成录制 @q 执行它(并将运行到文件末尾)
【讨论】:
拜托,您可以添加对文档的引用吗? @aturegano 我认为作者的意思是使用递归宏。请参阅The Vim Wiki: Record a Recursive Macro 了解更多信息。以上是关于重播 vim 宏直到缓冲区结束的主要内容,如果未能解决你的问题,请参考以下文章