Wiederholen Sie ein vim-Makro bis zum Ende des Puffers


84

Ich möchte ein Makro ausführen, das ich gerade im Register " x" in jeder einzelnen Zeile eines offenen Puffers von meinem Cursor bis zum Ende des Puffers in vim aufgezeichnet habe . Wie mache ich das?

Ich weiß, dass ich das Makro n-mal wiedergeben kann:

15@x

... oder einfach gedrückt halten, @bis ich die letzte Zeile erreicht habe, aber ich möchte nur ein paar Tastenanschläge drücken und damit fertig sein.

Danke im Voraus.


15 @ x funktioniert nicht unter Windows gVIM
Mingjiang Shi

Antworten:


99

Persönlich würde ich tun

VG:normal @x

Bearbeiten: Das Register wurde in das von Ihnen angegebene Register geändert.


Schön. Mir gefällt, dass diese Lösung nur in dem ausgewählten Bereich funktioniert.
Kevin

Ich habe dies auf nnoremap <C - @> VG: norm @ q <CR>
PAS

Ich habe dies mit dem Makro "1z =] s" versucht, aber es korrigiert nur das erste Wort jeder Zeile und überspringt den Rest.
Elig

@elig Sie möchten wahrscheinlich ein rekursives Makro erstellen, das fehlende Wörter in allen Zeilen findet.
Raman

67

Sie können (im Befehlsmodus)

:%normal @x

Ich mag diese Lösung, aber ich werde das Makro in jeder Zeile des Puffers ausführen, OP fragte nur von seinem Cursor bis zum Ende.
Porunga

24

rekursives Makro erstellen:

qa@aq

Ex:

qa0gUwj@aq

Das erste Wort von der aktuellen Zeile bis zum Ende der Datei wird mit einem einzelnen @a UPCASE. Aber stellen Sie sicher, dass "ein Register leer ist:

let @a=""

3
Ausgezeichnet. Dieser Ansatz ist nützlicher als der %:normalAnsatz, da er alle Linienbewegungen innerhalb des Makros berücksichtigt. Er ist daher nützlich, wenn die Linien in ihrer Form nicht identisch sind. Ich finde es einfacher, ein Makro 'a' zu erstellen, um die Aktion zu definieren, und dann das Makro 'b' das rekursive Bit ausführen zu lassen, dh qb @ a @ bq.
Paul Ruane

3
Vermeiden Sie dies, wenn Ihr Makro eine Suche beinhaltet, da es von oben fortgesetzt wird. ctrl-czu stoppen, wenn das passiert!
Iain Ballard

3
@IainBallard, :set nowrapscanlässt es fehlschlagen und stoppt, wenn das Ende der Datei erreicht ist.
Ericbn

1
Um Register a zu löschen, machen Sie einfach qaqvor dem Makro : qaqqa0gUwj@aq. Wenn Sie außerdem vergessen, das @qam Ende zu setzen, können Sie jederzeit qAein Register anhängen und dann tun @q. Normalerweise nehme ich aus irgendeinem Grund auf, um q zu registrieren, weil es einfach ist (besonders für rekursive Makros) und normalerweise qqqqqgUiwj@qqanstelle von zwei Makros ausgeführt wird. Die ersten drei qs löschen reg q, die zweiten zwei qs beginnen mit der Aufnahme. Siehe vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

Ich denke, um das aRegister zu löschen, könnte man einfach tippenqaq
Peter Perháč

11

999999@x, es sei denn, Sie haben einen sehr großen Puffer ...


6
warum nicht einfach %:normal @xoder 1,$:normal @x?
Nathan Fellman

3
Dies ist definitiv die elegantere Lösung - ich denke, es 99999@xist nur die natürliche Sache, die Sie sich einfallen lassen, wenn Sie es eilig haben :)
Peter

2
Wird 9999999 @ x es nicht viele Male in der letzten Zeile ausführen, es sei denn, Sie haben genau 999999 Zeilen?
David Oneill

2
Ich habe es gerade versucht. Hängt die Sitzung. Wahrscheinlich läuft es millionenfach weiter, ohne am Ende der Leitung anzuhalten.
CDR

1
Zumindest in einigen Fällen verhält sich dies nicht wie erwartet. Erwägen Sie ein Makro mit find next / find prev . Sobald die Makrowiederholung das Ende der Datei erreicht hat, wird sie von Anfang an fortgesetzt. vim doc zu diesem thema . Um Suchumbrüche zu vermeiden, sollten Sie Folgendes verwenden : set nowrapscan . Dies ist ein Beispiel, das ich mir einfallen lassen könnte, aber das bedeutet nicht, dass es keine mehr gibt. :% normal @x ist ein Weg, wie @ryan_s in seiner obigen Antwort vorgeschlagen hat.
Sergey Markelov

-1

Aus dem vim-Wiki, verkürzte Version: qqqqq zum Aufzeichnen des Makros @qq zum Beenden der Aufzeichnung von @q zum Ausführen (und wird bis zum Ende der Datei ausgeführt)


1
Bitte, können Sie einen Verweis auf die Dokumentation hinzufügen?
Aturegano

2
@aturegano Ich denke, der Autor wollte ein rekursives Makro verwenden. Siehe VIM Wiki: Nehmen Sie eine rekursive Makro für weitere Informationen.
dylnmc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.