2011-01-05 5 views
2

Gegeben:Ist es möglich, rekursive Makros mit dem normalen Befehl von Vim aufzuzeichnen und auszuführen?

https://stackoverflow.com/questions/ask 

Vom Normalbetrieb mit dem ersten Zeichen, in qaqqaf/[email protected]@a eingeben schlitzt das sich auf alle löscht.

  1. QAQ löscht den ein Register
  2. qa zu einem
  3. Aufzeichnung beginnt
  4. f/x löscht den nächsten Schrägstrich
  5. @a erneut läuft das Makro
  6. q beendet die Aufzeichnung

Aber läuft normal qaqqaf/[email protected]@a stoppt nach b - es scheint bei dem rekursiven Anruf zu bailen. Das Gleiche passiert, wenn Sie versuchen, den Befehl zu mappen.

Stimmt etwas mit meiner Syntax nicht? Oder ist es nicht möglich, ein rekursives Makro mit normal aufzuzeichnen?


Hinweis: Ich weiß, es ist möglich, eine rekursive Makro mit let zu schreiben. Ich frage mich, ob dies der einzige Weg ist, eine rekursive Makro zu schreiben, ohne es manuell Aufnahme:

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

(Ich frage, weil dieser Antwort: Remove everything except regex match in Vim)

+0

Vim kann alles in einem Register als Makro auszuführen. Also, wie auch immer Sie Ihre Befehle in ein Register bekommen, wäre ein Weg, wie im Text zu reißen. Ich glaube, es sei der beste Weg, dies für ein Mapping zu tun. –

+0

Richtig, aber ist es möglich, ein rekursives Makro ** mit 'normal' ** aufzunehmen? – idbrii

+0

es scheint, dass "normal" rekursive Makros nicht gut behandelt. Ich kann nicht scheinen, um einen richtig aufzunehmen. Sie können aber 'execute' und' feedkeys() 'wie folgt verwenden:' exe feedkeys ("qaqqar_l @ aq @ a", "t") 'um sowohl das Makro aufzunehmen als auch auszuführen. –

Antwort

2

Wenn Sie eine Karte ein erstellen möchten rekursive Makro ich schlage vor, Sie beginnen, durch so etwas wie so tun:

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

natürlich ist dies die Sie @a registrieren und wenn Sie clobbers finden viele dieser Arten von Mappings selbst tun vielleicht eine Funktion besser würde Ihre Bedürfnisse.

Hier ist eine sicherere Alternative rekursive Makrozuordnungen zu machen:

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> 

bearbeiten: Geänderte Funktion nach @Luc Hermitte Kommentar

+0

In diesen Fällen ist es besser, den fehlerhaften Teil in einen try Block zu verpacken und die Restitution von @a in den finally Block zu bringen. –

+0

Guter Fang @ Luc. Ich habe die Funktion mit Ihren Korrekturen aktualisiert –

+0

Akzeptiert als im Wesentlichen "nicht normal verwenden, verwenden lassen" und Ihre Funktion ist auch eine gute Idee. – idbrii

Verwandte Themen