Wie wende ich in Vim ein Makro auf eine Reihe von Zeilen an?

222

Ich habe eine Datei mit ein paar Zeilen. Ich habe ein Makro aufgezeichnet, das eine Operation in einer einzelnen Zeile ausführt. Ich möchte dieses Makro in allen verbleibenden Zeilen der Datei wiederholen. Gibt es einen schnellen Weg, dies zu tun?

Ich habe Strg + Q ausprobiert, eine Reihe von Zeilen hervorgehoben und @@ gedrückt, aber das schien nicht den Trick zu tun.

Jordan Parmer
quelle
Offtopic Frage: Ich kannte keine VIM-Makros (oder wollte nicht wissen: P) Haben Sie einen netten "Lazy Reader" -orientierten Link zu VIM-Makros?
OscarRyz
Klar, das: oreillynet.com/mac/blog/2006/07/… fasst es ziemlich gut zusammen.
Jordan Parmer
Sie können auch überprüfen: er komplexe Wiederholung von innen vim
Sam

Antworten:

354

Verwenden Sie den normalen Befehl im Ex-Modus, um das Makro in mehreren / allen Zeilen auszuführen:

Führen Sie das in Register a in den Zeilen 5 bis 10 gespeicherte Makro aus .

:5,10norm! @a

Führen Sie das in Register a in Zeile 5 gespeicherte Makro bis zum Ende der Datei aus.

:5,$norm! @a

Führen Sie das in Register a gespeicherte Makro in allen Zeilen aus.

:%norm! @a

Führen Sie den Makrospeicher in Register a in allen Zeilen aus, die dem Muster entsprechen .

:g/pattern/norm! @a

Um das Makro auf visuell ausgewählten Linien auszuführen, drücken Sie V und j oder k, bis der gewünschte Bereich ausgewählt ist. Geben Sie dann :norm! @aFolgendes ein und beachten Sie, dass die folgende Eingabezeile angezeigt wird.

:'<,'>norm! @a

Enter : Hilfe normal in vim, um mehr zu lesen.

Richter Maygarden
quelle
1
Ja: Hilfe normal in vim oder dem Link, den ich gerade hinzugefügt habe.
Richter Maygarden
1
Alles, um einem anderen Nicht-Emacs-Benutzer zu helfen!
Richter Maygarden
48
Nett!! Anfängertipp: Verwenden Sie V und dann j / k, um die gewünschten Linien hervorzuheben, und geben Sie dann einfach ein:norm! @a
Kevin Bourrillion
7
Um den sehr hilfreichen Tipp von @KevinBourrillion zu ergänzen, wird beim Drücken :nach dem Hervorheben der Zeilen stattdessen die Ex-Eingabezeile gelesen, :'<,'>zu der Sie dann den Rest dessen hinzufügen, was Kevin vorgeschlagen hat. Dadurch wird der letzte Befehl gelesen : :'<,'>norm! @a.
Deiwin
3
@GabeMoothart Das !vermeidet, dass Benutzer Schlüssel neu zuordnen. Sie brauchen es vielleicht nicht, aber eine Antwort, die für alle funktioniert, erfordert es.
Richter Maygarden
60

Verwenden Sie global , um das Makro 'a' in allen Zeilen auszuführen, die 'Muster' enthalten.

:g/pattern/normal! @a

Um Hilfe zu erhalten, überprüfen Sie : :help global.

SergioAraujo
quelle
4
Nur zur Verdeutlichung für zukünftige Benutzer: Dies ist ein globaler Ex-Befehl.
Am
39

Sie können dies auch tun:

Im normalen Modus:

[number of times to apply the macro] @ [register]

Beispielsweise:

1000@q

Überträgt das Makro im Register q auf die nächsten 1000 Zeilen.

Update: Die akzeptierte Antwort ist viel besser

Update: Wie @kevinliu betonte, möchten Sie das Makro wahrscheinlich mit einem beenden j, um zur nächsten Zeile zu gelangen.

Max Heiber
quelle
4
Dies stoppt in der letzten Zeile und wird in der letzten Zeile nicht mehrmals ausgeführt, wovor ich Angst hatte.
Hubro
@ Hubro, diese Antworten von anderen Benutzern arbeiteten für mich: :%norm! @aundvGG :norm! @a
Max Heiber
2
Aus irgendeinem Grund funktionierte dies hervorragend und die akzeptierte Antwort nicht. Mein Makro bestand darin, eine neue Zeile einzufügen, Dinge zu erledigen und zur nächsten Zeile zu wechseln.
Jasonszhao
@ Jasonszhao ja gleich hier. aber gibt es sowieso nicht 1000 zu sagen, sondern alle Zeilen bis zum Ende .. und kümmern sich immer noch um die neue Zeile,
Dinge zu
2
Ich denke, es sollte darauf hingewiesen werden, dass Ihr Makro mit einem jBefehl enden muss , um zur nächsten Zeile zu gelangen, sonst wird es versuchen, es auf dieselbe Zeile anzuwenden.
Kevin Liu
2

Es gibt auch ein Plugin namens RangeMacro, das genau das macht, was Sie wollen! Für alle, die den Namen nicht erraten können, was es tut: Es wiederholt ein aufgezeichnetes Makro für jede Zeile in einem bestimmten Bereich, egal ob durch visuelle Auswahl oder durch: 40,50 /: +10

Siehe http://www.vim.org/scripts/script.php?script_id=3271

phux
quelle