Hauptseite

Makros aufzeichnen mit vim

5. April 2009 von zimon

Da vim komplett per Tastatur bedienbar ist, lässt sich so ziemlich jede denkbare Aktion als Makro aufzeichnen.

Ähnlich wie bei den Registern kann man auch jedem Buchstaben ein Makro zuweisen. Eingeleitet wird die Aufzeichnung mittels q<name>, wobei <name> ein beliebiger Buchstabe ist. Beispiel wäre qa oder qb. Jede Taste, die man ab dort drückt wird aufgezeichnet, egal in welchem Modus. Möchte man die Aufnahme beenden, so drückt man einmal q.

Nun ist das Makro gespeichert und man kann es mittels @<name> also z.B. @a ausführen.
Mit @@ führt man das letzte Makro erneut aus. Man kann natürlich auch Quantifizierer benutzen und so z.B. 5 Mal das Makro a ausführen mit 5@a

Ein Beispiel:

Man möchte die Ausgabe von ls -lh, die in eine Datei gespeichert wurde so umschreiben, dass zuerst der Dateiname und dann die Größe kommt. Im Moment hat die Datei die Form

Rechte Hardlinks User Group Größe Bearbeitungszeit Dateiname

also z.B.

-rw-r--r-- 1 zimon zimon 13K 2009-04-04 16:24 beispiel.txt

Hinterher soll es so aussehen:

beispiel.txt 13K

Nun könnte man natürlich versuchen einen regulären Ausdruck zu finden wie z.B.

:%s/.\{10} [0-9]\+ [a-z0-9]\+[ ]\+[a-z0-9]\+[ ]\+\([0-9a-zA-Z\,]\+\) [0-9\-]\+ [0-9\:]\+ \(.\+\)/\2 \1/

der die Zeilen entsprechend ändert, aber man kann die Aufgabe auch mit einem Makro lösen. Dafür tippt man

qad4WWd2WdBA pj0q

um folgendes zu erreichen:

  • qa – startet die Aufnahme unter a
  • d4W – löscht die ersten 4 Wörter (durch Leerzeichen getrennte Strings)
  • W – überspringt das nächste Wort (die Größenangabe)
  • d2W – löscht die nächsten 2 Wörter
  • dB – löscht nun das vorherige Wort (die Größenangabe)
  • A <ESC> – fügt am Ende der Zeile ein Leerzeichen ein (Hier könnte man nun auch einen Bindestrich oder Ähnliches einfügen)
  • p – fügt das letzte gelöschte Wort (die Größenangabe) ein
  • j0 – springt an den Anfang der nächsten Zeile (damit man dort von vorne anfangen kann)
  • q – beendet die Makro-Aufzeichnung

Nun kann man diese Befehlssequenz mit @a ausführen, wobei immer an den Anfang der nächsten Zeile gesprungen wird. Besteht die Ausgabe aus 100 Zeilen, so kann man nach dem Aufzeichnen des Makros die restlichen 99 Zeilen mit 99@a bearbeiten.

Makros sind bei sehr vielen Änderungen extrem langsam, da sie die einzelnen Befehle immer wieder nacheinander ausführen müssen. Bei sehr vielen Änderungen sind regulären Ausdrücken daher der Vorzug zu geben, wenn es sich damit machen lässt. Beim obigen Beispiel benötigte das Makro für 2000 Zeilen einer ls -lh Ausgabe ca 40 Sekunden, während der obige reguläre Ausdruck alle Änderugnen innerhalb von einer Sekunde erledigte. Dafür kann man mit Makros Aufgaben erledigen, die mit regulären Ausdrücken nicht realisierbar sind.


Schlagworte: ,



3 Kommentare zu „Makros aufzeichnen mit vim“

  1. [...] Makros aufzeichnen mit vim [...]

  2. Alex sagt:

    Sehr gute Erklärung, danke :)

    MfG

  3. Martin sagt:

    Danke, sehr gute Erklärung.

    Gerade musste ich Strings isolieren, die zwischen jeweils zwei “” in einer Zeile standen. Hätte auch mit Suchen & Ersetzen funktioniert, da das darum herum immer gleich ist, aber das war sehr lehrreich!

Kommentieren

Kommentarlinks könnten nofollow frei sein.


Bloggeramt.de frisch gebloggt Blogverzeichnis - Blog Verzeichnis bloggerei.de