2011-01-05 50 views
2

考慮:是否有可能用Vim的正常命令記錄和運行遞歸宏?

https://stackoverflow.com/questions/ask 

從正常模式下的第一個字符,在qaqqaf/[email protected]@a鍵入清除所有的斜槓。

  1. QAQ清除寄存器
  2. QA開始記錄到
  3. F/X刪除下一個正斜槓
  4. @a重新運行宏
  5. q結束記錄

但在運行normal qaqqaf/[email protected]@a後停止 - 它似乎在遞歸調用保釋。如果您嘗試使用映射命令,則會發生同樣的情況。

我的語法有什麼問題嗎?或者是不可能用normal記錄一個遞歸宏?


注:我知道這是可以寫一個遞歸宏與let。我想知道,如果這是寫了遞歸宏無需手動記錄的唯一途徑:

let @a = "f/[email protected]" 
normal @a 

(我問,因爲這個答案:Remove everything except regex match in Vim

+0

Vim可以在寄存器宏執行任何更改的功能。因此,無論如何,將命令放入寄存器都是一種方式,就像在文本中一樣。我相信'讓'是做這個映射的最好方法。 – 2011-01-07 23:58:58

+0

對,但是有可能用'normal' **來記錄一個遞歸宏**嗎? – idbrii 2011-01-09 03:21:02

+0

似乎'正常'不能很好地處理遞歸宏。我似乎無法得到一個適當的記錄。但是,您可以像這樣一起使用'execute'和'feedkeys()':'exe feedkeys(「qaqqar_l @ aq @ a」,'t')'來記錄和執行宏。 – 2011-01-11 21:33:50

回答

2

如果你想創建一個映射到遞歸宏我建議你開始做的東西像這樣:

nmap <f2> :let @a = "f/[email protected]"|normal @a 

當然,這則會覆蓋的@a註冊,如果你發現你自己做許多這類映射的也許職能將更好地滿足您的需求。

這裏是做出了遞歸宏映射一個更安全的替代:

function! RecMacroExe(cmds) 
    let a = @a 
    let @a = a:cmds . "@a" 
    try 
    normal @a 
    finally 
    let @a = a 
    endtry 
endfunction 

nmap <f2> :call RecMacroExe("f/xb")<cr> 

編輯:根據@Luc Hermitte評論

+0

在這些情況下,最好將可能失敗的部分封裝到try塊中,並將@a恢復到finally塊中。 – 2011-01-06 09:16:19

+0

好抓住@Luc。我已更新與您的更正功能 – 2011-01-06 16:07:34

+0

本質上接受爲「不使用正常,使用讓」,你的功能也是一個好主意。 – idbrii 2011-01-13 00:08:27

相關問題