Speichern Sie die letzte Aktion (.) In einem Makro


9

Anwendungsfall

Ich bin im normalen Modus. Ich habe nicht explizit darüber nachgedacht, ein Makro aufzuzeichnen, aber ich nehme eine einzelne Befehlsänderung vor. Ich kann diese Aktion jetzt mit Punkt wiederholen.

Mir ist jetzt klar, dass es eine nützliche Aktion ist, sie in einem Makro zu speichern, um sie später zu verwenden, anstatt jedes Mal den gesamten Befehl einzugeben. Ich kann mich entweder mit dot um alle Änderungen kümmern, die diesen Befehl gerade benötigen, oder ich kann mit der Bearbeitung fortfahren und diesen Befehl später verwenden, indem ich ihn in einem Makro speichere.

Letzteres ist das, was ich tun möchte, aber der einfachste Weg, den ich mir vorstellen kann, ist nicht einfach - machen Sie meine Änderung rückgängig, starten Sie die Aufzeichnung eines Makros und geben Sie den Befehl erneut ein, um die erforderliche Änderung vorzunehmen und die Aufzeichnung des Makros zu beenden.

Was ich bisher versucht habe:

Das Aufzeichnen von Punkten in einem Makro funktioniert nicht, da es den Punkt und nicht die Änderung aufzeichnet, die der Punkt ausführt. ( d5wNehmen wir zum Beispiel an, der in dot gespeicherte Befehl lautete: Wenn Sie mit der Aufzeichnung eines Makros beginnen und die Aktion über ausführen. Erwarten Sie, dass bei jeder Ausführung des Makros 5 Wörter gelöscht werden. Dies ist beim nächsten Ausführen nicht der Fall Das Makro wird Punkt und nicht der Befehl d5w. Dies bedeutet, dass, wenn Sie nach dem Aufzeichnen des Makros eine andere Änderung vorgenommen haben - sagen wir, 3 Wörter löschen mit d3wund es war die letzte Änderung, die Sie durchgeführt haben. Wenn Sie das Makro ausführen, werden 3 gelöscht Wörter und nicht 5, weil es nur läuft .)


Ich habe Mühe zu verstehen, was Sie tun möchten und warum Sie mit einem Makro nichts tun, was auch immer das ist.

1
@DrEval Das OP erkennt nach Ausführung eines Befehls im normalen Modus, dass es in einem Makro gespeichert werden sollte, und möchte es während der Aufzeichnung des Makros nicht erneut eingeben müssen.
Rich

Antworten:


2

Vim führt keinen Verlauf Ihrer normalen Modusbefehle. Wenn Sie einen Verlauf Ihres normalen Modus beibehalten möchten, können Sie diesen wie folgt in einer Datei speichern: /vi//a/587/13848

Befehle im normalen Modus sind normalerweise kurz, daher geben die Benutzer sie einfach im normalen Modus ein und versuchen nicht, Makros zu erstellen. Wenn Sie jedoch Makros aus normalen ExModusbefehlen erstellen möchten, können Sie sie in einen Modusbefehl konvertieren und dann in einem Makro speichern, wie @wmmso hervorhob. Sie können dies mit dem normBefehl tun . Wenn Sie also 2 Wörter ab der aktuellen Cursorposition löschen und im ExModus einen normalen Modusbefehl verwenden möchten :norm d2w. (Ref: http://vimdoc.sourceforge.net/htmldoc/various.html#:norm , Normalen Befehl über den Bereich ausführen )

Es ist besser, einen ExModusbefehl zu verwenden, wenn es sich um einen komplizierten Befehl handelt, da Sie den vollständigen Befehl in einen Puffer eingeben, sicherstellen können, dass er tatsächlich korrekt ist, und ihn auch im Befehlszeilenverlauf speichern.

Nachdem Sie Ihren normalen Modusbefehl im Ex-Modus haben, können Sie Ihren Befehl auch wie den Verlauf mit durchsuchen q:und ihn dann mit in ein Register kopieren "ay$, während Sie sich in der Zeile befinden, die die Befehlszeile enthält, die Sie in einem Makro speichern möchten. Wenn Sie das Makro dann ausführen möchten, können Sie es mit ausführen@a


Wie würden Sie einen normalen Modusbefehl in die Befehlszeile schreiben? zum Beispiel d2w?
Peeyush Kushwaha

In der Antwort wurden einige Klarstellungen hinzugefügt. Hilft das?
Alpha_989

0

Kopieren Sie den Inhalt des Registers ":" (was Sie gerade getan haben) in ein anderes Register, z. B. registrieren Sie a:

:let @a = @:

Sie können es mit erneut ausführen

@a

Dies funktioniert bei mir in Version 7.4 nicht. Scheint, dass das Register :den zuletzt ausgeführten Befehl über :command-name-goes-hereanstelle eines normalen d2w
Modusbefehls

2
Diese Lösung funktioniert nur für Ex-Befehle, nicht für Befehle im normalen Modus. Mir ist kein Register bekannt, das den letzten Befehl für den normalen Modus enthält. Wäre nützlich
Steve
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.