2009-08-18 91 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