Wie kann ich meine Aufzeichnung (dh das aufgezeichnete Makro) anzeigen und bearbeiten?

38

Ich benutze komplexe Wiederholungen, um meine Operationen aufzuzeichnen ( qqum einige Operationen aufzuzeichnen , qum anzuhalten), und ich habe einen Fehler gemacht.

Ist es möglich, zu sehen, was ich aufgezeichnet habe, und den Fehler zu korrigieren, anstatt es erneut zu tun?

Aufgezeichnete Zeichen durch @qArbeiten aufrufen , aber ich kann es in meinen Zuordnungen nicht sehen ( :map q- No mapping found).

Und es gibt nicht viele Informationen in Hilfe durch Eingabe: :help recording.

Kenorb
quelle

Antworten:

41

Hinweis: Ich gehe davon aus, dass Sie das aRegister für die gesamte Antwort verwenden, aber Sie können jedes Register verwenden

Anmerkung2: <1b>ist Esc; Sie können dies mit Ctrl+vund dann einfügen Esc. Es kann auch angezeigt werden als ^[(abhängig von der displayEinstellung).


Es ist keine Zuordnung; Es macht also Sinn, dass :mapdas nicht funktioniert. Es ist in einem Register aufgezeichnet, und Sie können es wie jedes Register anzeigen und bearbeiten.

Alles, was Sie qtun müssen, ist, "dieses Register zu löschen und einen beliebigen Tastendruck daran anzuhängen" , und alles, was Sie @tun müssen, ist "ein Register als Befehle auszuwerten" .

Es gibt nichts "anderes" an einem Makro, Sie können jedes Register als Makro aufrufen.


Zum Anschauen einfach benutzen:

:echo @a

Genau wie bei jedem Register.

Sie können auch verwenden :registers, um alle Register anzuzeigen.


Zum Bearbeiten können Sie verschiedene Dinge tun:

Der einfachste Weg, dem Sie etwas zuweisen können, @aist:

:let @a='iasd<1b>'

Dies startet den Einfügemodus ( i), das Einfügen asdund die Rückkehr zum normalen Modus.

Dies ist für umfangreiche Bearbeitungen nicht sehr nützlich. Sie könnten Funktionen verwenden (zB substitute()) oder vielleicht etwas anhängen ( :let @a=@a . 'more'), aber etwas in der Mitte zu ändern ist nicht so einfach.

Ich habe herausgefunden, dass der beste Weg dafür ist, einen neuen Puffer mit :splitoder zu starten :tabnewund das Register zu bearbeiten, indem es dort eingefügt, bearbeitet und dann zurückkopiert wird.

Sie können verwenden, "apwelche den Text in den Puffer einfügen (wo aist Ihr Register):

iThis is A<1b>

Jetzt kann ich nur die Zeile ändern, um vielleicht:

iThis is an edited macro<1b>

Dann ^v$"ayziehe ich diese Zeile in das aRegister:

  • ^ für den Zeilenanfang
  • v für den visuellen Modus
  • $ für Zeilenende
  • "ay Ziehen Sie die Auswahl zur Registrierung a

Wenn Sie möchten, können Sie dies tun, ohne den visuellen Modus mit zu verwenden ^"ay$.

Sie können jetzt verwenden @a, als ob dies das ist, was Sie ursprünglich aufgenommen haben.

Sie können auch einfach yyund dann verwenden @", was ein bisschen schneller ist. Dies kopiert jedoch auch die nachfolgende Newline und kann zu Nebenwirkungen führen. Eine andere Möglichkeit, dies zu beschleunigen, ist die Verwendung eines Makros :-)

Martin Tournoij
quelle
2
Ich würde bemerken, dass das Ziehen einer Zeilenbewegung in Ihr Register den Nebeneffekt hat, dass ein Zeilenumbruch-Zeichen eingefügt wird, als hätten Sie Enteram Ende Ihrer Aufnahme gedrückt . In vielen Fällen mag dies harmlos sein, aber in Szenarien, in denen Sie die Cursorposition am Ende der Aufzeichnung sorgfältig festgelegt haben, kann dies die Wiederholbarkeit beeinträchtigen.
tommcdo
@tommcdo Richtig; Sie können einfach vdie gesamte Zeile (ohne die neue Zeile) verwenden und auswählen.
Martin Tournoij
@Carpetsmoker " v^$"ayum diese Zeile in das aRegister zu kopieren ." Sollte das nicht ^vor dem kommen v, und mit $kopierst du nicht immer noch die neue Zeile? Ich denke, es sollte sein: 0v$h"ay(ja schmerzhaft lange!)
Joeytwiddle
2
@joeytwiddle nein, $bewegt sich an das Ende der Zeile, enthält jedoch nicht die neue Zeile. Es ist der Unterschied zwischen 0y$und yy. Das Setzen hnach $würde nur bedeuten, dass Sie das letzte Zeichen vermissen würden.
Übelsuppe
Um die Bearbeitung zu vereinfachen, können Sie Folgendes eingeben: Wenn Sie @ a = Befehle einfacher bearbeiten möchten, geben Sie Folgendes ein: <Strg-F>, wählen Sie die betreffende Zeile aus und bearbeiten Sie sie (die letzte Zeile, die standardmäßig verwendet wird, wenn Sie die bearbeiten) letzte eingegebene Zeile) mit vim wie gewohnt. Drücken Sie die Eingabetaste, wenn Sie fertig sind, um die Zeile auszuführen, oder <Strg-C>, um sie zu beenden.
9

Um etwas zum Arbeiten zu bringen ...

qajjjq

Startet die Aufzeichnung eines Makros im aRegister.

Mit dem :regBefehl können Sie viele Ihrer aktuellen Register anzeigen (die für Makros, Reißen, Löschen usw. verwendet werden) , oder Sie können ein anzuzeigendes Register angeben, indem Sie seinen Namen angeben. Zum Beispiel, um das Register anzuzeigen a:

:reg a

Ausbeuten

--- Registers ---
"a   jjj

Sie können ein vorhandenes Namensregister mit dem entsprechenden Großbuchstaben anhängen. Dies funktioniert nicht nur zum Aufnehmen von Makros, sondern auch zum Ruckeln. Beispielsweise:

qAkkkq
:reg a

Ausbeuten

--- Registers ---
"a   jjjkkk

Wenn Sie die let-Syntax zum Bearbeiten eines vorhandenen Makros verwenden möchten, haben Sie folgende Möglichkeiten:

let @a='<C-r>a'

das wird zu erweitern

let @a='jjjkkk'

und Sie können dann die einzelnen Tastenanschläge ändern.

Beachten Sie, dass Sie die Tastenkombination <C-r>(d. H. Strg + r) verwenden können, um aus einem beliebigen Register in den Befehlszeilenmodus (oder in den Einfügemodus) einzufügen.

Wenn Sie im Befehlszeilenmodus <C-f>Folgendes eingeben, wird außerdem das Befehlszeilenfenster geöffnet, in dem Sie frühere Befehle anzeigen / bearbeiten und Ihren aktuellen Befehl bearbeiten können, bevor Sie ihn aufrufen. Drücken Sie die Eingabetaste für den Befehl, den Sie senden möchten.

Dies hat den Vorteil, dass Sie Ihre normalen Bewegungs- / Ersetzungsbefehle in diesem Puffer verwenden können, um Ihr Makro zu bearbeiten. Beispielsweise:

let @a='<C-r>a'<C-f>

wird bringen:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Wenn Sie Befehl 120 ausführen, können Sie Folgendes tun:

s/kkk/}
<return>
:reg a

Ausbeuten

--- Registers ---
"a   jjj}

Sie können natürlich den Inhalt des Registers in Ihren Puffer einfügen und dort ändern. Sie können jedoch alles tun, ohne den Arbeitspuffer zu verschmutzen.

Zach Ingbretsen
quelle