2009-08-18 88 views
63

我想在一个打开的缓冲区的每一行,从我的光标到缓冲区结尾,在vim中运行一个我刚刚记录在寄存器“x”中的宏。我怎么做?重播一个vim宏,直到缓冲区结束

我知道我可以重播宏n次:

[email protected] 

...或只需按住@,直到我到达的最后一行,但我想刚打了几个按键,并完成它。

在此先感谢。

+0

15 @ X在Windows GVIM不工作 – 2013-04-28 04:55:47

回答

77

个人而言,我会做

VG:normal @x 

编辑:改变注册到一个你指定的。

+0

不错。我喜欢这个解决方案只在选定的区域运行。 – Kevin 2009-08-18 17:51:32

+0

我将其映射到nnoremap <[email protected]> VG:标准@ q PAS 2018-03-04 01:49:27

5

[email protected],除非你有一个非常大的缓冲...

+3

为什么不'%:正常@ x'或'1,$:normal @ x'? – 2010-01-04 13:11:12

+3

这绝对是更优雅的解决方案 - 我猜'99999 @ x'只是当你匆忙时想出的东西:) – Peter 2010-01-04 20:44:32

+1

9999999 @ x不会在最后一行运行很多次,除非你有999999行吗? – 2010-10-29 15:14:33

17

进行递归宏:

[email protected] 

例如:

[email protected] 

它会从当前行UPCASE第一个字带有单个@a的文件结尾。 但要确保“寄存器为空:

let @a="" 
+3

优秀。这种方法比'%:normal'方法更有用,因为它支持宏内的任何行移动,所以在行的形式不同时非常有用。我发现创建宏'a'来定义动作更容易,然后让宏'b'做递归位,即qb @ a @ bq。 – 2014-09-24 09:46:13

+2

如果您的宏涉及搜索,请避免此操作,因为它将从顶部继续。 'ctrl-c'停止,如果发生的话! – 2014-11-20 15:55:30

+2

@IainBallard,':set nowrapscan'使它失败并在到达文件末尾时停止。 – ericbn 2016-08-18 21:51:07

53

你可以这样做(在命令模式)

:%normal @x 
0

来自vim wiki,缩短版本: QQQQQ录制宏 @qq到完成录制 @q来执行它(并会持续到文件尾)

+1

请您可以添加对文档的引用吗? – aturegano 2016-10-20 09:46:27

+1

@aturegano我认为作者的意图是使用递归宏。请参阅[The Vim Wiki:记录递归宏](http://vim.wikia.com/wiki/Record_a_recursive_macro)了解更多信息。 – dylnmc 2018-01-11 22:30:32