In Vim ist ein Makro eine Funktion, mit der Sie eine Folge von Befehlen aufzeichnen können, die Sie verwenden, um eine bestimmte Aufgabe auszuführen. Sie führen dieses Makro dann viele Male aus, um denselben Job automatisiert zu wiederholen.
Makros machen langwierige und wiederholbare Aufgaben handhabbar, indem sie die Aufgabe nur einmal ausführen und dann die Macht von Vim nutzen, um sie zu automatisieren. Makros verbessern Ihren Arbeitsablauf und sparen viel Zeit.
In diesem Artikel untersuchen wir das Konzept von Vim-Makros, indem wir es auf ein praktisches Beispiel anwenden.
Das Problem
Angenommen, Sie erhalten von einem hypothetischen Überwachungssystem eine CSV-Datei mit einer Liste von Hosts in Ihrem Netzwerk. Sie möchten es in /etc/hosts
konvertieren -Format, um die lokale Namensauflösung für die Hosts zu aktivieren.
Die Originaldatei ist diese:
$ cat hosts.csv
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca
Die erwartete Ausgabe ist diese:
192.168.0.20 ocpmaster01.home.ca ocpmaster01 #OCP Master Node 1
192.168.0.21 ocpmaster02.home.ca ocpmaster02 #OCP Master Node 2
192.168.0.22 ocpmaster03.home.ca ocpmaster03 #OCP Master Node 3
192.168.0.30 ocpnode01.home.ca ocpnode01 #OCP Worker Node 1
192.168.0.31 ocpnode02.home.ca ocpnode02 #OCP Worker Node 2
192.168.0.32 ocpnode03.home.ca ocpnode03 #OCP Worker Node 3
192.168.0.144 ansibleh01.home.ca ansibleh01 #Ansible Host 1
192.168.0.145 ansibleh02.home.ca ansibleh02 #Ansible Host 2
Um die erwartete Ausgabe zu erhalten, müssen Sie die Eingabe bearbeiten, indem Sie die Position einiger Felder ändern, die Anführungszeichen löschen und Tabulator- oder Kommentarzeichen (# ) passend. Lassen Sie uns Vim-Makros verwenden, um diese Aufgabe zu erledigen.
Lösen Sie das Problem und zeichnen Sie das Makro auf
Der grundlegende Arbeitsablauf eines Vim-Makros besteht darin, Ihre Befehle und Tastenanschläge aufzuzeichnen, während Sie die zur Lösung des Problems erforderlichen Änderungen in der ersten Zeile vornehmen, die Befehlssequenz in einem Register speichern und dann das Makro erneut abspielen, um dasselbe in den verbleibenden Zeilen zu tun.
Um ein Makro aufzuzeichnen und in einem Register zu speichern, geben Sie die Taste q ein gefolgt von einem Brief von a bis z das das Register zum Speichern des Makros darstellt, gefolgt von allen Befehlen, die Sie aufzeichnen möchten, und geben Sie dann die Taste q ein erneut, um die Aufnahme zu stoppen.
q<register><commands>q
Zum Beispiel, um ein einfaches Makro aufzuzeichnen, das eine neue Zeile einfügt, und es zu speichern, um a zu registrieren , verwenden Sie diese Sequenz:
qao<ESC>q
Obwohl dieses Makro nicht nützlich ist, veranschaulicht es die Sequenz, die zum Aufzeichnen anderer Makros erforderlich ist.
Das Aufzeichnen von Makros in Vim ist eine Übung in Logik und der angemessenen Verwendung von Vim-Befehlen. Denken Sie daran, dass dieses Makro in anderen Zeilen wiederholbar sein soll, auch wenn die Eingabe etwas variiert. Verwenden Sie zum Beispiel am besten den Befehl dw um ein Wort zu löschen, anstatt den Befehl x zu wiederholen Zeichen zu entfernen, da die Anzahl der Zeichen im Wort von Zeile zu Zeile variieren kann.
Lassen Sie uns nun ein Makro aufzeichnen, das die erste Zeile unserer CSV-Datei in das erforderliche Format konvertiert, und es im Register h speichern . Beginnen Sie, indem Sie den Cursor an einer beliebigen Stelle in der ersten Zeile platzieren, die wir in der Datei ändern möchten:
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
Starten Sie dann die Aufzeichnung des Makros, indem Sie q drücken und h um es zu speichern, um h zu registrieren :
qh
Während Sie das Makro aufzeichnen, zeigt die Statuszeile unten diese Meldung:
recording @h
Als nächstes ist es eine gute Übung, Ihren Charakter an eine bekannte Position zu bewegen, damit das Makro auf die gleiche Weise funktioniert, unabhängig davon, wo sich der Cursor beim Start des Makros befand. Lassen Sie uns den Anfang der Linie als Startpunkt verwenden, indem Sie 0 drücken :
0
Dieses erste Feld ist die Beschreibung, die in der Ausgabe zum Kommentar am Ende der Zeile wird. Ersetzen Sie dabei das Anführungszeichen " Zeichen mit dem Kommentarzeichen # , also müssen wir das nicht tun, wenn wir dieses Feld später an das Ende der Zeile verschieben:
r#
Löschen Sie anschließend das nächste Anführungszeichen, indem Sie den Cursor mit f darauf bewegen Befehl und drücken Sie x um es zu entfernen:
f"x
An dieser Stelle sieht Ihre erste Zeile wie folgt aus:
#OCP Master Node 1,ocpmaster01,192.168.0.20,ocpmaster01.home.ca
Als nächstes bewegen Sie den Cursor mit l um eine Position nach rechts , und löschen Sie den gesamten Hostnamen bis zum nächsten Komma:
ldf,
Denken Sie daran, wenn Sie Text in Vim löschen, kopieren Sie ihn auch. Jetzt fügen wir es am Ende der Zeile ein. Text am Ende mit A einfügen und Einfügen eines Kommas, dann drücken Sie
A,<ESC>p
Jetzt sind die Felder fast in der gewünschten Reihenfolge. Lassen Sie uns den Kommentar an das Ende der Zeile verschieben. Bewegen Sie dazu den Cursor mit 0 zurück an den Anfang , und den gesamten Kommentar bis zum nächsten Komma mit df, löschen :
0df,
Bewegen Sie dann den Cursor mit $ an das Ende der Zeile , fügen Sie den Text mit p ein , und löschen Sie das letzte Komma mit x :
$px
Alle Felder sind nun an der gewünschten Position und Ihre Zeile sieht so aus:
192.168.0.20,ocpmaster01.home.ca,ocpmaster01,#OCP Master Node 1
Ersetzen Sie schließlich alle Kommas durch ein Tabulatorzeichen, indem Sie das s verwenden Befehl:
:s/,/\t/g<ENTER>
Die Zeile entspricht der gewünschten Ausgabe:
192.168.0.20 ocpmaster01.home.ca ocpmaster01 #OCP Master Node 1
Beenden Sie Ihr Makro, indem Sie den Cursor in die nächste Zeile bewegen, indem Sie j drücken damit Sie das Makro wiederholt verwenden können. Stoppen Sie abschließend die Aufnahme, indem Sie q drücken :
jq
Sie haben ein Makro aufgezeichnet und es ist einsatzbereit. Mal sehen, wie Sie es als nächstes überprüfen können.
Makros anzeigen und laden
Da Makros in Vim-Registern gespeichert werden, können Sie gespeicherte Makros anzeigen, indem Sie den Befehl :reg verwenden um den Inhalt aller Register zu sehen:
:reg
--- Registers ---
"" ,
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
"- ,
...
Sie können auch das spezifische Register überprüfen, in unserem Fall das Register h, indem Sie es als Parameter für :reg bereitstellen Befehl:
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
Mit beiden Methoden können Sie den Inhalt des Registers h sehen entspricht dem Makro, das wir zuvor aufgezeichnet haben. Beachten Sie, dass Sonderzeichen wie ESC und ENTER wurden durch die Vim-Darstellung ^[ ersetzt und ^M bzw..
Sie können auch Makros in Register laden. Kopieren Sie zunächst den Makroinhalt und fügen Sie ihn in eine leere Zeile im Puffer ein. Ersetzen Sie dann Sonderzeichen durch ihre Vim-Darstellung, indem Sie Strg+V+
"hy$
Lassen Sie uns als Nächstes das Makro wiederholen, um die verbleibenden Zeilen in der Datei zu aktualisieren.
Makros wiedergeben
Nachdem Sie das Makro aufgezeichnet und seinen Inhalt überprüft haben, verwenden Sie das Makro, um dieselben Änderungen an den verbleibenden Zeilen vorzunehmen.
Um das Makro einmal abzuspielen, bewegen Sie den Cursor in die nächste Zeile und drücken Sie @h wo h stellt das Register dar, auf dem Sie das Makro gespeichert haben.
Beachten Sie, dass das Makro den Cursor bei Bedarf automatisch in die nächste Zeile bewegt. Auf diese Weise können Sie die Ausführung wiederholen. Um die Makroausführung zu wiederholen, drücken Sie @@ .
Schließlich können Sie das Makro auf allen verbleibenden Zeilen wiederholen, indem Sie Vim Nummer
Dies funktioniert gut, wenn Sie genau wissen, wie oft Sie das Makro ausführen möchten. Wenn Sie das Makro stattdessen in allen Zeilen bis zum Ende der Datei ausführen möchten, unabhängig davon, wie viele Zeilen vorhanden sind, verwenden Sie diese Syntax:
:%:normal @h
Alle Zeilen in der Datei stimmen jetzt mit der erwarteten Ausgabe überein. Um die Änderungen abzuschließen, löschen Sie die Titelzeile am Anfang.
Was kommt als nächstes?
Vim-Makros sind eine leistungsstarke Ressource, mit der Sie die Funktionalität von Vim erweitern und komplexe Aufgaben schnell ausführen können.
Sie können die Vorteile der Ausführung eines Makros in einer Datei mit acht Zeilen sehen. Stellen Sie sich vor, Sie müssten etwas Ähnliches in einer Datei mit Hunderten oder Tausenden von Einträgen tun. Sie können dies sogar testen, indem Sie diese acht Zeilen kopieren und hunderte Male einfügen und dann das Makro erneut anwenden.
Wenn Sie Makros für eine Datei mit Tausenden von Zeilen verwenden, werfen Sie einen Blick auf set lazyredraw Befehl zur Verbesserung der Leistung. Diese Einstellung hindert Vim daran, den Bildschirm für jede Iteration des Makros neu zu zeichnen.
Das Erstellen von Vim-Makros erfordert, dass Sie Aufgaben auf optimierte Weise denken und ausführen. Es ist eine gute Übung, bei der Verwendung von Vim darüber nachzudenken, wie man Aufgaben so ausführt, dass sie wiederholbar sind und es Ihnen ermöglicht, sie bei Bedarf in Makros umzuwandeln.
Dadurch werden Sie mit Vim vertrauter und profitieren im Gegenzug von erweiterten Funktionen, um Ihren Arbeitsablauf zu verbessern und Zeit zu sparen.
[ Wollen Sie mehr über Vim? Laden Sie diesen kostenlosen Vim-Spickzettel herunter. ]