GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rekursive Vim-Makros:Ein Schritt weiter zur Automatisierung sich wiederholender Aufgaben

Der kürzlich erschienene Artikel Use Vim macros to automatise frequent task von Ricardo Gerardi untersuchte, was ein Makro ist und welche Vorteile die Verwendung von Makros zur Automatisierung sich wiederholender Aufgaben hat. In diesem Artikel gehen Sie einen Schritt weiter und untersuchen, welche rekursiven Makros einige Beispiele sind, wo sie nützlich sein könnten, und einige Fallstricke, auf die Sie stoßen könnten.

Der grundlegende Makro-Workflow besteht aus Aufzeichnung, Wiedergabe und Gewinn. Wählen Sie bei der Aufnahme aus, in welchem ​​Register die Aufnahme erfolgen soll. Es gibt Register von a bis z verfügbar.

[Das könnte Ihnen auch gefallen: How to use Ansible to configure Vim ]

Sobald Sie Vim geöffnet haben, beginnen Sie, um ein Makro aufzuzeichnen, indem Sie q drücken und geben Sie das Register an, in dem es gespeichert werden soll. Geben Sie dann eine Folge von auszuführenden Befehlen und q ein um die Aufnahme zu beenden und zu speichern. Spielen Sie danach das Makro erneut ab, indem Sie @ drücken und das Register.

Zeichnen Sie beispielsweise ein Makro wie qaA - suffixESCjq auf , und spielen Sie es dann ab, indem Sie @a drücken wie oft benötigt. Um die Wiedergabe des Makros zu vereinfachen, geben Sie nach einmaliger Ausführung @@ ein um es wiederzugeben.

Mehr darüber, wie Makros funktionieren

Tauchen Sie ein wenig mehr in Makros ein und erkunden Sie einige ihrer Interna. Ein Makro stoppt die Ausführung, falls es einen seiner Befehle nicht ausführen kann. Wenn beispielsweise f ( (was bedeutet finde ( und positionieren Sie den Cursor darauf ) nicht ausgeführt werden kann, wird die Makrowiedergabe sofort beendet. Sie denken vielleicht, dass dies ein Problem ist, aber es handelt sich tatsächlich um eine Funktion, die Sie zu Ihren Gunsten nutzen können.

Beim Aufzeichnen eines Makros wird eine Folge von Befehlen eingegeben. Das bedeutet, dass Sie jeden Befehl verwenden können, einschließlich des Ausführungsmakros (@ ). Dies ist die Essenz rekursiver Makros, die sich selbst aufrufen, wenn sie ausgeführt werden.

An diesem Punkt könnten Sie einfach mit der Aufzeichnung und Wiedergabe einiger rekursiver Makros beginnen. Aber bevor Sie das tun, schauen Sie sich noch etwas an, bevor Sie direkt damit beginnen. Beim Aufzeichnen eines Makros werden die eingegebenen Befehle während der Aufzeichnung ausgeführt. Wenn Sie also ein Makro als Teil der Aufzeichnung wiedergeben und das zugehörige Register bereits etwas aufgezeichnet hat, wird es ausgeführt und wird wahrscheinlich unerwartete Ergebnisse bringen.

Hier kommt der erste Tipp:Stellen Sie sicher, dass das Register leer ist, bevor Sie ein rekursives Makro aufzeichnen. Löschen Sie ein Register, indem Sie q ausführen q , was dasselbe ist wie das Starten einer Aufnahme auf , nichts ausführen und die Aufnahme beenden.

Mit all dem ist es endlich an der Zeit, einige Szenarien zu erkunden, in denen rekursive Makros Ihnen zusätzliche Bearbeitungszeit sparen.

Aufzeichnen und Wiedergeben rekursiver Makros

Nehmen wir zunächst das im vorherigen Artikel gelöste Problem:Konvertieren Sie die folgende CSV-Datei, die von einem hypothetischen Überwachungssystem erstellt wurde, in eine /etc/hosts Formatdatei.

$ 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

Hier ist die erwartete Ausgabe:

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

Das Makro, das aufgezeichnet wurde, um beim Konvertieren des Dateiformats zu helfen, ist das folgende:

0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j

Angenommen, Sie haben gerade Vim geöffnet und das obige Makro ist noch nicht aufgezeichnet, haben Sie einige Optionen, um jedes Register mit den Makroinhalten zu füllen:

1) Zeichnen Sie das Makro auf und geben Sie alle Befehle ein

Beginnen Sie mit q dann , geben Sie alle obigen Befehle ein und beenden Sie mit q .

2) Setzen Sie das Register

Sie können ein Register mit dem folgenden Befehl :let festlegen @='' und später als Makrowiedergabe verwenden. In diesem Fall können Sie diesen Befehl nicht direkt ausführen, da das Makro einige Sondertasten wie Esc hat und Enter . Um dies zu umgehen, verwenden Sie :execute Befehl. Es ermöglicht die Eingabe der Sondertasten als Escape-Sequenzen. Geben Sie im normalen Modus : ein und fügen Sie dann die folgende Zeile ein und drücken Sie Enter :

execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"

Stellen Sie sicher, dass Sie h registrieren Inhalte wurden richtig eingestellt. Dies kann durch Ausführen von :reg erfolgen oder : reg h in diesem Fall:

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj

Der Inhalt des Registers unterscheidet sich geringfügig von dem, was durch :execute festgelegt wurde Befehl. Das liegt daran, dass :execute umgewandelt \ und \ zu ihrem Schlüsselcode ^[ und ^M bzw. Das ist es, was Vim intern verwendet, um die Tasten tatsächlich zu "drücken".

An dieser Stelle wird das Register h enthält genau das gleiche Makro, das im Artikel Verwenden Sie Vim-Makros zur Automatisierung häufiger Aufgaben aufgezeichnet wurde. Der nächste Schritt besteht darin, es rekursiv zu machen. Auf diese Weise können Sie es einmal auslösen und es wird rekursiv wiederholt, bis es das Ende der Datei erreicht.

Es gibt einen kleinen Trick, um das bereits aufgezeichnete Makro zu bearbeiten und rekursiv zu machen. Sie können damit auch fehlende Befehle hinzufügen und Änderungen vornehmen, ohne das gesamte Makro aufzuzeichnen.

Beginnen Sie mit :let @h=' , dann Ctrl-r Ctrl-r h , geben Sie @h' ein am Ende und drücken Sie abschließend Enter . Ctrl-r Ctrl-r fügt buchstäblich den Inhalt des Registers ein. Dies ist derselbe Inhalt, der beim Untersuchen von :reg h angezeigt wird .

Um zu überprüfen, ob Sie alles haben, führen Sie :reg aus und überprüfen Sie den Inhalt. Es sollte wie folgt aussehen:

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj@h

Gehen Sie damit zur zweiten Zeile von hosts.csv und wiederholen Sie das Makro @ oder @h in diesem Beispiel. Es wird bis zum Ende der Datei fortgesetzt, wobei alle Zeilen aktualisiert werden. Es war möglich, weil das Makro 0 hatte am Anfang und j bevor es sich selbst rekursiv wiedergibt. Dadurch ging es eine Zeile nach unten, und beim erneuten Ausführen des Makros positionierte es den Cursor am Anfang der Zeile.

Beachten Sie auch, dass das Makro bis zum Ende der Datei gegangen ist und angehalten hat, weil es mit j nicht mehr heruntergefahren werden kann das war unsere Abbruchbedingung für die rekursive Ausführung.

[ Suchen Sie nach mehr Informationen zur Systemautomatisierung? Beginnen Sie mit The Automated Enterprise, einem kostenlosen Buch von Red Hat. ] 

Abschluss

Dies war ein langer Weg, aber jetzt steht Ihnen ein weiteres Tool zur Verfügung, mit dem Sie sich wiederholende Aufgaben automatisieren können, selbst wenn diese sich wiederholende Aufgabe darin besteht, ein Makro immer wieder zu wiederholen.

Sie haben sich auch mit der Bearbeitung eines Makros beschäftigt, daher sind Sie an dieser Stelle möglicherweise damit vertraut, ein Makro von Grund auf neu aufzuzeichnen. Wenn Sie ein Makro aufzeichnen, anstatt es zu bearbeiten, achten Sie darauf, das Zielregister vor dem Start zu leeren und @ zu haben als letzten Befehl. Denken Sie auch an einen Haltepunkt für Ihr Makro. Wenn Sie bis zum Ende der Datei bearbeiten, verwenden Sie j werde es tun.

Ein weiterer Vorteil eines rekursiven Makros besteht darin, dass, wenn etwas schief geht, es mit einem einzigen Rückgängigmachen rückgängig gemacht werden kann .


Linux
  1. Ein Feld aus einem Json-Array in ein Bash-Array parsen?

  2. Wie ordnet man einen Vim-Befehl zu, um Bash-Befehle basierend auf Os auszuführen?

  3. Mehrere PDF-Dateien in ein PDF zusammenführen / konvertieren

  4. Wie füge ich zwei statische Bibliotheken zu einer zusammen?

  5. Gibt es ein Linux-Äquivalent zu Programmer's Notepad oder Notepad++

So verbinden Sie mehrere Zeilen in einer Datei in Linux zu einer

So führen Sie unter Linux mehrere PDF-Dateien zu einem PDF zusammen

So verbinden/verschmelzen Sie mehrere Audiodateien zu einer in Linux

3 leistungsstarke Musketiere des Vim-Editors – Makro, Markierung und Karte

Wie teilt man eine Textdatei in mehrere *.txt-Dateien auf?

Rekursives Cat alle Dateien in einer einzigen Datei