重播 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 @x1,$: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,只需在宏之前执行qaqqaqqa0gUwj@aq。此外,如果您忘记将@q 放在末尾,您可以随时执行qA 来开始附加寄存器,然后执行@q。我通常出于某种原因记录到 reg q,因为它很容易(尤其是递归宏)并且通常最终会执行 qqqqqgUiwj@qq 而不是两个宏。前三个qs 清除reg q,后两个qs 开始录制。见vim.wikia.com/wiki/Record_a_recursive_macro 我想清除a 注册一个可以简单的类型qaq【参考方案3】:

你可以做(​​在命令模式下)

:%normal @x

【讨论】:

我喜欢这个解决方案,但我会在缓冲区的每一行执行宏,OP 只从光标到末尾询问。 @Porunga :.,$norm @x 将起作用(.,$ 表示从当前行 . 到最后一行 $【参考方案4】:

我个人会做

VG:normal @x

编辑:将寄存器更改为您指定的。

【讨论】:

不错的一个。我喜欢这个解决方案只在选定的区域上运行。 我把它映射到了 nnoremap VG:norm@q 我用宏“1z=]s”试过这个,但它只拼写修复每行的第一个单词,跳过其余的。 @elig 你可能想要创建一个递归宏来查找所有行上的缺失单词。【参考方案5】:

来自 vim wiki,缩短版本: qqqqq录制宏 @qq 完成录制 @q 执行它(并将运行到文件末尾)

【讨论】:

拜托,您可以添加对文档的引用吗? @aturegano 我认为作者的意思是使用递归宏。请参阅The Vim Wiki: Record a Recursive Macro 了解更多信息。

以上是关于重播 vim 宏直到缓冲区结束的主要内容,如果未能解决你的问题,请参考以下文章

用宏高效实现环形缓冲区

将vim语法高亮导出到latex

4. VIM 系列 - 认识VIM的缓冲区窗口标签页

优雅地用宏实现环形缓冲区

优雅地用宏实现环形缓冲区

优雅地用宏实现环形缓冲区