Makros in Vim und Emacs (Regex, Teil 3)

Aus LinuxUser 08/2024

Makros in Vim und Emacs (Regex, Teil 3)

© Andrei Armiagov / 123RF.com

Trommelwirbel

Über das Emacs-Feature der Keyboard Macros fassen Sie mehrere Einzelschritte zu einem Aufruf zusammen und binden ihn an eine Tastenkombination. Was erst einmal harmlos klingt, hat es in sich.

Das Themenfeld Makros und Erweiterungen bedienen viele Programme zum Ver- und Bearbeiten von Text, beispielsweise Open- oder LibreOffice und Nedit. Vim und Emacs bilden dabei keine Ausnahme, aber sie verstecken die Informationen zum Erstellen und Bearbeiten von Makros gut. Obendrein sollten Sie sich Zeit zur intensiven Recherche und zum Ausprobieren nehmen. Bitte planen Sie ebenso zusätzliches Nachlesen für das Verständnis des hier Besprochenen ein.

Wie in den beiden vorherigen Artikeln erwähnt, bevorzugt Frank Vim, Gerold und Axel setzen auf Emacs. In dieser Artikelserie bringen wir das Wissen aus beiden Welten zusammen. Allerdings sollten Sie sich etwas in Acht nehmen – tatsächlich lauern im Zusammenhang mit beliebten Desktop-Umgebungen unerwartete Stolperfallen (siehe Kasten “Emacs und Gnome”). Das Vereinheitlichen von Tastenkombinationen im Open-Source-Universum fällt eben mitunter hakelig aus, doch dafür lebt die Vielfalt.

Im ersten Teil der Artikelserie [1] standen reguläre Ausdrücke (Regex) und deren Einsatz in Vim und Emacs im Mittelpunkt. Die nächste Stufe erklommen wir im zweiten Teil [2] mit der Definition und Benutzung von Makros in Vim. Die Einträge einer E-Mail-Liste wandelten wir schrittweise unter Zuhilfenahme von regulären Ausdrücken in ein einheitliches Format um. Das Ergebnis: ein Makro, das sämtliche Einzelschritte in einem einzigen Rutsch ausführt. Dasselbe steht nun in Emacs an.

Emacs und Gnome

Unter Gnome lässt sich Emacs (Abbildung 1) nicht vollständig nutzen. Der Hintergrund: Gnome belegt essenzielle Tastenkombinationen aus Emacs mit eigenen Funktionen [13] und gibt ihnen in der Auswertung den Vorzug, obwohl grundsätzlich die aktive Anwendung Priorität haben sollte. Konkret fiel das den Autoren bei der Funktion isearch-forward-regexp zur Vorwärtssuche mithilfe regulärer Ausdrücke auf. Emacs nutzt dazu die Tastenkombination [Strg]+[Alt]+[S]. Gnome steuert über denselben Shortcut allerdings die Fenstergröße und testet verschiedene Größen und Platzierungen auf dem Bildschirm.

Abgeleitet ist das von der Erweiterung für gnome-shell-extension-screenshot-window-sizer. Erschwerend kommt hinzu, dass das Kürzel in der Dokumentation und im Dconf-Editor unter [Alt]+[Strg]+[S] hinterlegt ist, was im Widerspruch zur üblichen Schreib- und Tippweise steht. Die Tastenkombination taucht außerdem bei weiteren IDEs auf der Basis von IntelliJ IDEA auf, beispielsweise Phpstorm, Webscore, PyCharm und Rubymine. Dort dient sie dazu, den Einstellungsdialog aufzurufen.

Lösen lässt sich das Problem nur, indem Sie sich von Gnome verabschieden und es durch eine andere Desktop-Umgebung wie XFCE ersetzen. Eine mögliche Alternative bestünde darin, die voreingestellten Tastenkombinationen in Gnome so umzustellen, dass sie Emacs nicht mehr ausbremsen. Das würde jedoch deutlich mehr Aufwand verursachen und weitere Seiteneffekte nach sich ziehen.

Ein dritter, Emacs-spezifischer Ausweg liegt darin, lediglich einmal [Esc]+ zu drücken und danach nicht [Alt] gedrückt zu halten. In der Fußzeile von Emacs erscheint dann die Angabe ESC-, auf die Sie jedoch nicht warten müssen. Anschließend drücken Sie [Strg]+[S].

Aufgrund eines anderen Bedienkonzepts ist Vim von der beschriebenen misslichen Lage nicht betroffen und lässt sich dementsprechend unter Gnome sauber bedienen.

Abbildung 1: Emacs l&auml;sst sich &uuml;ber das Men&uuml; <span class="ui-element">Optionen</span> an die eigenen Bed&uuml;rfnisse anpassen, unter Gnome allerdings nur begrenzt.

Abbildung 1: Emacs lässt sich über das Menü Optionen an die eigenen Bedürfnisse anpassen, unter Gnome allerdings nur begrenzt.

Inhalt des Beitrags

In Teil 2 dieser Serie nutzten wir den Begriff Macroscript – nachdem er allerdings nicht ganz korrekt ist, ersetzen wir ihn besser durch Keyboard Macros [3] oder kurz Macro. Unter den beiden Begriffen lassen sich zudem online recht gut Informationen aufstöbern [4]. Mit Keyboard Macros zeichnen Sie nicht nur Tastenfolgen auf und spielen sie wieder ab, sondern ändern auch die Ansicht des Editorfensters, rufen eine Shell auf oder nutzen Suchen und Ersetzen [5].

Als Basis für den vorliegenden Artikel dient dasselbe Szenario wie zuvor: Aus einer einfachen, mittels Kommata separierten Liste aus E-Mail-Adressen generieren wir eine neue Tabelle mit den drei Spalten Vor- und Nachname sowie der E-Mail-Adresse. Thunderbird benutzt diese Tabelle für ein Massen-Mailing [6] mit individueller Anrede in jeder versendeten Nachricht. Listing 1 enthält dazu eine Auswahl der Kontaktdaten der Abgeordneten der Provinz Alberta des kanadischen Parlaments mit dem Stand vom 3. Oktober 2023, die wir als Datenbasis für unser Makro heranziehen [7]. Listing 2 zeigt die ersten fünf Einträge der Zieltabelle samt Kopfzeile mit den Spaltennamen.

Listing 1

E-Mail-Liste als Datenbasis

shuvaloy.majumdar@parl.gc.ca, Ziad.aboultaif@parl.gc.ca,
john.barlow@parl.gc.ca, blaine.calkins@parl.gc.ca,
michael.cooper@parl.gc.ca, earl.dreeshen@parl.gc.ca,
garnett.genuis@parl.gc.ca, laila.goodridge@parl.gc.ca,
JasrajSingh.Hallan@parl.gc.ca, matt.jeneroux@parl.gc.ca,
pat.kelly@parl.gc.ca, tom.kmiec@parl.gc.ca, ...

Listing 2

Tabelle für Thunderbird

VORNAME,NAME,E-MAIL
Shuvaloy,Majumdar,shuvaloy.majumdar@parl.gc.ca
Ziad,Aboultaif,Ziad.aboultaif@parl.gc.ca
John,Barlow,john.barlow@parl.gc.ca
Blaine,Calkins,blaine.calkins@parl.gc.ca
Michael,Cooper,michael.cooper@parl.gc.ca
...

Für Thunderbird steckt dahinter eine CSV-Datei mit Kommas als Spaltentrenner. Der Mailclient leitet aus der ersten Zeile die Spaltentitel ab und erlaubt in der E-Mail entsprechende Platzhalter. Dort steht dann beispielsweise {{VORNAME}} für den jeweiligen Wert aus der Spalte VORNAME und {{E-MAIL}} für die E-Mail-Adresse des Empfängers aus der dritten Spalte der Tabelle. Unser Ziel besteht darin, mithilfe von Emacs-Makros eine passende Tabelle zu erzeugen, die daraufhin in Thunderbird als Adressliste für eine Rund-Mail zum Einsatz kommt.

Bisheriger Ablauf in Vim

Kurz zusammengefasst legen wir in Vim zunächst ein Makro an. Neben einem Namen weisen wir dem Makro eine Aktionsfolge zu. Um es permanent zur Verfügung zu haben, ergänzen wir die Makrodefinition in der Konfigurationsdatei von Vim:

let @a='s/,\s/\r/g'

Wie man unschwer erkennt, heißt das Makro @a und ersetzt in einer Zeile alle aufeinanderfolgenden Vorkommen aus Komma und Leerzeichen durch einen Zeilenumbruch.

Abkürzungen in Emacs

In Emacs gehen Sie analog zu Vim vor. Auch dort umfasst ein Makro eine Aufzeichnung von Tastendrücken und Maus- oder Menüaktionen, die Sie an eine neue Tastenkombination binden. Geht es hingegen um komplexere Vorgänge, bleibt nur die Umsetzung in Emacs Lisp (Elisp [8]), einem Emacs-spezifischen Dialekt der Programmiersprache Lisp.

Für unsere Zwecke genügen Makros allerdings vollkommen. Das Erstellen umfasst mehrere Schritte. Dazu benötigen Sie diverse Tastenkombinationen [9] sowie das Wissen um deren Bedeutung (siehe Tabelle “Grundlegende Tastenkombinationen”). Für einige davon gibt es mehrere mögliche Tastenkombinationen, von denen die mit Funktionstasten beim Einloggen aus der Ferne (Remote-Login) nicht sauber ankommen.

Bei den nachfolgend beschriebenen Schritten finden sich stets die überall funktionierenden Tastenkürzel in Klammern dahinter, und zwar in der Emacs-typischen Schreibweise mit Abkürzungen aus nur einem Buchstaben, beispielsweise C- (C wie Control) statt [Strg]+[+] oder M- (M wie Meta) statt [Alt]+[+].

TIPP

Dass die Tasten Hyper, Super, Meta und Control tatsächlich existieren, lässt sich unter einer echten Tastatur einer Lisp Machine (Abbildung 2) nachvollziehen [14].

Abbildung 2: Auf dem Space-Cadet-Keyboard einer LM-2 Lisp Machine finden sich <span class="key-sequence">[Hyper]+[Super]+[Meta]</span> und [Control] links unten. Quelle: Wikimedia Commons, CC-BY-SA 3.0 Unported, https://commons.wikimedia.org/wiki/File:Space-cadet.jpg

Abbildung 2: Auf dem Space-Cadet-Keyboard einer LM-2 Lisp Machine finden sich [Hyper]+[Super]+[Meta] und [Control] links unten. Quelle: Wikimedia Commons, CC-BY-SA 3.0 Unported, https://commons.wikimedia.org/wiki/File:Space-cadet.jpg

Bedeutung

Taste

Alternative Tastenkombination

Aufzeichnen eines Makros (Beginn)

[F3]

C-x (

Aufzeichnen eines Makros (Ende)

[F4]

C-x )

Wiederholen des letzten Makros

[F4]

C-x e

Suchen und Ersetzen

[Alt]+[Umschalt]+[5]

M-%

Keyboard Macro

Als erstes Beispiel gilt es, die Zeichenkette “Windows” zu suchen und durch “Linux” zu ersetzen. Die Schreibmarke befindet sich dazu am Anfang der ersten Zeile des Texts. Der Ablauf unterteilt sich in mehrere Schritte (siehe Tabelle “Zeichenkette ersetzen”). Mittels der Funktionstaste [F4] rufen Sie dann das soeben definierte Makro wieder auf. Ausgehend von der aktuellen Position der Schreibmarke ersetzt Emacs anschließend das nächste Vorkommen des Suchbegriffs im Text.

Aktion

Bedeutung

Kürzel

[F3] drücken

Beginn der Makro-Aufzeichnung

C-x (

[Alt]+[Umschalt]+[5]

Beginn der Suche

M-%

Suchbegriff “Windows” eingeben

Windows

[Eingabe]

return

Ersetzung “Linux” eingeben

Linux

[Eingabe]

return

[Umschalt]+[1]

Alle Vorkommen des Suchbegriffs ersetzen

!

Drücken von [F4]

Ende der Makro-Aufzeichnung

C-x )

Makros benennen

Jetzt fehlt noch ein Name für das Makro sowie eine Tastenfolge, mit der Sie es später wieder aufrufen. Emacs bietet dazu das interne Kommando name-last-kbd-macro. Mithilfe von [Alt]+[X] (M-x) rufen Sie es auf (Kasten “Makro benennen und speichern”, erste Zeile). Am Prompt vergeben Sie als Namen ersetze-windows und bestätigen das mit der Eingabetaste. Ab sofort steht das Makro unter diesem Namen zur Verfügung. Der Aufruf [Alt]+[X],ersetze-windows,[Eingabe] führt es erneut aus.

Makro benennen und speichern

[Alt]+[X],name-last-kbd-macro,[Eingabe]+,ersetze-windows,[Eingabe]

[Strg]+[X][Strg]+[F],~/.emacs[Eingabe]

[Alt]+[>]

[Alt]+[X],insert-kbd-macro[Eingabe]

Noch ist das Makro flüchtig, also lediglich in der aktuellen Emacs-Sitzung vorhanden. Mithilfe des Emacs-Kommandos insert-kbd-macro speichern Sie es permanent in der Konfigurationsdatei von Emacs: Mit der Tastenfolge aus der zweiten Zeile des Kastens öffnen Sie die Datei, mit der aus der dritten Zeile springen Sie zum Dateiende. Mit der Tastenfolge aus der letzten Zeile ergänzen Sie das Makro.

Shortcuts zuweisen

Damit Sie Ihr Makro direkt aufrufen können, hinterlegen Sie dafür eine Tastenfolge, beispielsweise [Strg]+[C]+[A]. Dazu greifen Sie auf die Emacs-Funktion kbd mit der Tastenfolge als Parameter zurück. Deren Ergebnis nutzen Sie als ersten Parameter für die Funktion global-set-key, der Name des zuvor definierten Makros dient als zweiter Parameter. Die Angabe mit nur einem Apostroph vor dem Makro-Namen wirkt als Schreibweise etwas schräg, ist aber in Lisp syntaktisch korrekt:

(global-set-key (kbd "C-c a") 'ersetze-windows)

Bezüglich der Shortcuts [10] haben die Emacs-Entwickler einen Bereich von Tastenkombinationen vorgesehen, aus dem Sie frei wählen können. Das Ziel liegt dabei darin, zu verhindern, bei einer Neuvergabe bereits bestehende Tastenkürzel ungewollt zu überschreiben. Die Bereiche erstrecken sich von [Strg]+[X][Strg]+[K][ 0] bis [Strg]+[X][Strg]+[K][ 9] sowie von [Strg]+[X][Strg]+[K][A] bis [Strg]+[X][Strg]+[K][Z]. Außerdem dürfen Sie die Funktionstasten [F5]+ bis [F9] verwenden.

Allerdings sind Sie keineswegs gezwungen, eine Tastenkombination aus diesen Bereichen [11] zu verwenden. Im Zweifelsfall sehen Sie einfach nach, ob die gewünschte Tastenkombination schon belegt ist. Emacs kennt dafür eine eigene Tastenkombination, die wiederum eine beliebige Tastenkombination sozusagen als Parameter erwartet: [Strg]+[H][K] oder in der Emacs-eigenen Notation C-h k. Dabei fungiert [Strg]+[H] als Präfix für alle möglichen Funktionen rund um die internen Hilfefunktionen.

Um zu klären, ob zum Beispiel die Tastenkombination [Strg]+[C]+[A] belegt ist, tippen Sie [Strg]+[H]+[K][Strg]+[C]+[A]. Sofern der Shortcut noch zur Verfügung steht, zeigt Emacs in der Fußzeile die Meldung C-c a is undefined an. Ist er dagegen vergeben, teilt sich das aktuelle Fenster, und in der unteren Hälfte blendet das Programm einen Text wie den aus Listing 3 ein. Mit [Q] schließen Sie die Anzeige wieder.

Listing 3

Bereits belegte Tastenkombination

C-c a runs the command ersetze-windows (found in global-map), which is
an interactive byte-compiled Lisp function in ~/.emacs.
It is bound to C-c a.
(ersetze-windows &optional ARG1)
Not documented.

E-Mail-Liste bearbeiten

Zum Modifizieren der E-Mail-Liste öffnen Sie die Datei maildaten-einzeiler in einem neuen Emacs-Puffer gleichen Namens über den Aufruf [Strg]+[X][Strg]+[F],maildaten-einzeiler,[Eingabe]. Der Inhalt der Datei entspricht Listing 1 – lauter E-Mail-Adressen in einer Zeile, jeweils mit Komma und Leerzeichen voneinander getrennt.

Im ersten Schritt ersetzen Sie das Komma , durch einen Zeilenumbruch. Hierzu könnten Sie das oben per [Alt]+[Umschalt]+[ 5] beziehungsweise M-% aufgerufene, interaktive Suchen und Ersetzen (Funktionsname query-replace) verwenden. Beim automatisierten Abarbeiten stört diese Interaktivität jedoch: Liefert die Suche beispielsweise keinen Treffer, beendet sich das interaktive Suchen und Ersetzen sofort und ohne Nachfrage. Das Ausrufezeichen, also die Bestätigung des Ersetzens aller Vorkommen, gibt das Makro dann trotzdem noch ein, woraufhin es im Text landet.

Deswegen kommt an dieser Stelle die ebenfalls interaktive Funktion replace-string zum Einsatz. Sie fragt nur noch genau zwei Dinge ab: die gesuchte Zeichenkette und den String, der sie ersetzen soll. Danach erledigt die Funktion das einfach ohne weitere Nachfragen. Allerdings ist replace-string standardmäßig keine Tastenkombination zugewiesen. Deswegen rufen Sie die Funktion über die Kommandozeile mit [Alt]+[X] (M-x) auf. Weil Sie das Ganze nachher als Keyboard Macro abspeichern möchten, zeichnen Sie es außerdem mit [F3] auf.

Um sicherzustellen, dass Sie die gesamte Datei bearbeiten, springen Sie eingangs vorsichtshalber zum Dateianfang. In Emacs klappt das mit [Alt]+[<] (M-<). Die komplette Abfolge zeigt der Kasten “Aufruf zum Ersetzen mit Aufzeichnung als Makro”.

Aufruf zum Ersetzen mit Aufzeichnung als Makro

[F3]

[Alt]+[<]

[Alt]+[X],replace-string,[Eingabe]+[Leer]+[Eingabe]+[Strg]+[Q][Strg]+[J][Eingabe]

[F4]

[Alt]+[X],name-last-kbd-macro,[Eingabe]+,ersetze-komma-durch-zeilenumbruch,[Eingabe]

Da Sie den als Ersatzzeichenkette gewünschten Zeilenumbruch nicht einfach durch Drücken der Eingabetaste angeben können, müssen Sie dazu tief in die Quoting-Trickkiste greifen. In Emacs lässt sich fast überall ein beliebiges Zeichen literal eingeben, indem Sie direkt davor [Strg]+[Q] (C-q) drücken. Nutzen Sie dagegen [Strg]+[Q]+[Eingabe], folgt kein Zeilenumbruch (Line Feed, LF), sondern ein Zeilenvorschub (Carriage Return, CR). Dabei handelt es sich um Begriffe, die auf die Zeit von Schreibmaschinen und Zeilendruckern zurückgehen: Ein Carriage Return entspricht dem Wagenrücklauf, das heißt, das Blatt wird wieder so ausgerichtet, dass der Schreibkopf am Zeilenanfang steht. Ein Line Feed dreht die Papierrolle um eine Zeile weiter.

MS-DOS und Windows verwenden für einen Zeilenumbruch in Texten beide Zeichen hintereinander (CRLF), in der Mac-Welt dient dazu die umgekehrte Reihenfolge. In der Unix-Welt kommt dagegen nur Line Feed vor. LF und CR sind im ASCII-Standard Control-Zeichen, gehören also zu den 32 ersten Zeichen, und lassen sich typischerweise mit [Strg]+[Buchstabe] ausdrücken. Dabei entspricht LF der Kombination [Strg]+[J], CR den Tasten [Strg]+[M]. Deswegen geben Sie im Kasten “Aufruf zum Ersetzen mit Aufzeichnung als Makro” in der dritten Zeile nach dem [Strg]+[Q] zum Quoten des nächsten Zeichens ein [Strg]+[J] ein.

Schlussendlich speichern Sie alles als Keyboard Macro durch Drücken von [F4]+ ab und vergeben mit [Alt]+[X],name-last-kbd-macro,[Eingabe] einen Namen dafür, im Beispiel ersetze-komma-durch-zeilenumbruch. Den bestätigen Sie zu guter Letzt nochmals durch einen Druck auf die Eingabetaste.

Zeile umsortieren

Nun geht es an den zweiten Schritt, das Komma-getrennte Voranstellen von Vor- und Nachname basierend auf der bereits vorhandenen E-Mail-Adresse. Erneut beginnen Sie mit der Aufzeichnung eines Keyboard Macros und dem Sprung zum Dateianfang. Sie drücken also wieder [F3][Alt]+[<].

Zum Extrahieren und Neuarrangieren von Bestandteilen einer Zeile genügt ein simples Suchen und Ersetzen nicht. Dazu greifen Sie auf reguläre Ausdrücke und die interaktive Funktion replace-regexp zurück. Der passende Aufruf lautet [Alt]+[X],replace-regexp,[Eingabe].

Die Funktion replace-regexp benötigt zwei Parameter. Als erster Parameter dient der reguläre Ausdruck \(\w\)\(\w+\)\.\(\w\)\(\w+\)@. Insgesamt suchen Sie nach Zeichenketten, die mit einem Wort beginnen, auf das ein Punkt folgt, woraufhin sich nochmals ein Wort und danach ein Klammeraffe (@) anschließen. Diesen Treffer teilen Sie in vier Teile auf, die Sie nachher wieder in Ihre Ersetzung einbauen: Den ersten Buchstaben des ersten Worts, da Sie ihn später in einen Großbuchstaben umwandeln möchten (\w), die restlichen Buchstaben des ersten Worts (\w+), den zweiten Buchstaben des ersten Worts (\w) zum Umwandeln in einen Großbuchstaben und die übrigen Buchstaben des zweiten Worts (>\w+).

Die Backslashes braucht es, da Sie in Emacs runde Klammern zur Gruppierung mit einem vorangestellten Backslash markieren müssen. \w steht für ein beliebiges Zeichen, wie es in Wörtern vorkommt, also ein Buchstabe, eine Ziffer oder ein Unterstrich, \w+ hingegen für mindestens ein beliebiges Zeichen. Das mehrfach vorkommende \. steht für einen literalen Punkt – er matcht auf ein beliebiges Zeichen.

Den Punkt und den Klammeraffen packen Sie nicht mit runden Klammern in eine Gruppe: Es fällt wesentlich leichter, die beiden später wieder literal in die Ersetzung einzubauen. Ähnliches gilt für den Domain-Teil der E-Mail-Adresse, der hinter dem Klammeraffen kommt: Dieser Teil bleibt unverändert stehen. Sie benötigen keine Teile davon, weswegen Sie ihn beim Suchen und Ersetzen vernachlässigen dürfen.

Danach drücken Sie die Eingabetaste, und Emacs erkundigt sich, womit Sie das Suchmuster ersetzen möchten. Dabei lassen sich die im Suchbegriff mittels \( und \) markierten Gruppen als \1, \2, \3 und so weiter referenzieren. Normalerweise werden solche Referenzierungen eins zu eins übernommen. Möchten Sie sie noch modifizieren, müssen Sie Emacs-Lisp-Funktionen darin aufrufen, beispielsweise capitalize [12], um Kleinbuchstaben in Großbuchstaben umzuwandeln. Das funktioniert, indem Sie \, voranstellen.

Um aus den im Suchbegriff gebildeten Gruppen Vor- und Nachname mit groß geschriebenem Anfangsbuchstaben und weiterhin unverändert geschriebener E-Mail-Adresse zu erhalten, geben Sie als zweiten Parameter für replace-regexp den folgenden Ausdruck an:

\,(capitalize \1)\2,\,(capitalize \3)\4,\1\2.\3\4@

Nach dem Aufruf von replace-regexp drücken Sie wieder die Eingabetaste und die Ersetzung erfolgt vollautomatisch. Daraufhin beenden Sie mit [F4] die Makro-Aufzeichnung und benennen das Makro mithilfe von [Alt]+[X],name-last-kbd-macro, etwa als ersetze-email-durch-namen-und-email. Der Kasten “Suchen und Ersetzen” fasst alle Schritte zum Suchen und Ersetzen einer Zeile mit einer E-Mail-Adresse zusammen.

Suchen und Ersetzen

[F3]

[Alt]+[<]

[Alt]+[X],replace-regexp,[Eingabe]+,\(\w\)\(\w+\)\.\(\w\)\(\w+\)@,[Eingabe]+,\,(capitalize \1)\2,\,(capitalize \3)\4,\1\2.\3\4@[Eingabe]

[F4]

[Alt]+[X],name-last-kbd-macro,[Eingabe]+,ersetze-email-durch-namen-und-email,[Eingabe]

Noch fehlt in der Ausgabe die Kopfzeile. Im dritten Schritt hilft Ihnen die Funktion insert weiter, die den als Parameter übergebenen Text an der aktuellen Position der Schreibmarke einfügt. Um sicherzustellen, dass das Makro am Textanfang mit der Arbeit beginnt, nutzen Sie vor dem Ausführen von insert den Shortcut [Alt]+[<]. Diese Schritte fassen Sie wieder als Makro zusammen, diesmal unter dem Namen ergaenze-kopfzeile (siehe Kasten “Insert”).

Insert

[F3]

[Alt]+[<]

[Alt]+[X],insert,[Eingabe],VORNAME,NAME,E-MAIL,[Strg]+[Q][Strg]+[J][Eingabe]

[F4]

[Alt]+[X],name-last-kbd-macro,[Eingabe]+,ergaenze-kopfzeile,[Eingabe]

Das Speichern der geänderten Datei bildet den vierten Schritt. Dazu nutzen Sie entweder den Menüeintrag Datei |Speichern unter, oder Sie verwenden die Tastenkombination [Strg]+[X][Strg]+[W] und einen Dateinamen: [Strg]+[X][Strg]+[W],maildaten.csv,[Eingabe].

Permanent verfügbar

Der fünfte Schritt umfasst das Speichern der zuvor erstellten Keyboard Macros in der Emacs-Konfigurationsdatei, meist ~/.emacs oder ~/.emacs.d/init.el. Öffnen Sie die Datei mittels [Strg]+[X][Strg]+[F] und springen Sie via [Alt]+[>] an deren Ende. Dort rufen Sie drei Mal [Alt]+[X],insert-kbd-macro auf: einmal mit ersetze-komma-durch-zeilenumbruch, einmal mit ersetze-email-durch-namen-und-email und einmal mit ergaenze-kopfzeile als Parameter. Listing 4 veranschaulicht die damit generierte Makro-Definition.

Listing 4

Automatisch generierte Makro-Definitionen

(defalias 'ersetze-komma-durch-zeilenumbruch
  (kmacro "M-< M-x r e p l a c e - s t r i n g <return> , SPC <return> C-q C-j <return>"))
(defalias 'ersetze-email-durch-namen-und-email
  (kmacro "M-< M-x r e p l a c e - r e g e x p <return> \\ ( \\ w \\ ) \\ ( \\ w + \\ ) \\ . \\ ( \\w \\ ) \\ ( \\ w + \\ ) @ <return> \\ , ( c a p i t a l i z e SPC \\ 1 ) \\ 2 , \\ , ( c a p i t a l i z e SPC \\ 3 ) \\ 4 , \\ 1 \\ 2 . \\ 3 \\ 4 @ <return>"))
(defalias 'ergaenze-kopfzeile
  (kmacro "M-< M-x i n s e r t <return> V O R N A M E , N A M E , E - M A I L C-q C-j <return>"))

Danach weisen Sie den Makros aus Listing 4 passende Tastenkombinationen zu. Im Beispiel aus Listing 5 sind es [Strg]+[C]+[B][Strg]+[C]+[C] und [Strg]+[C]+[D]. Damit Emacs diese Tastenkombinationen lernt, müssen Sie sie dem Editor beibringen. Dazu markieren Sie genau diese drei Zeilen und lassen sie von Emacs mittels [Alt]+[X],eval-region,[Eingabe] evaluieren.

Listing 5

Keybindings für Keyboard Macros

(global-set-key (kbd "C-c b") 'ersetze-komma-durch-zeilenumbruch)
(global-set-key (kbd "C-c c") 'ersetze-email-durch-namen-und-email)
(global-set-key (kbd "C-c d") 'ergaenze-kopfzeile)

Aktion vereinfachen

Nun gilt es im siebten und letzten Schritt noch die drei bestehenden Tastenkombinationen in einem abschließenden Makro erstelle-csv-aus-email-zeile zu einem einzigen Aufruf zusammenzufassen. Dazu öffnen Sie erneut die Datei maildaten-einzeiler mittels [Strg]+[X] und [Strg]+[F]. Wie gewohnt, drücken Sie [F3]+ zum Aufzeichnen eines Makros. Der Kasten “Komplettes Makro aufzeichnen” zeigt die sechs Tastendrücke inklusive abschließendem [F4] und dem Speichern als Macro.

Komplettes Makro aufzeichnen

[F3]

[Strg]+[C][B]

[Strg]+[C][C]

[Strg]+[C][D]

[F4]

[Alt]+[X],name-last-kbd-macro,[Eingabe]+,erstelle-csv-aus-email-zeile,[Eingabe]

Anschließend wechseln Sie mit [Strg]+[X]+[B] wieder zurück zur Datei ~/.emacs, setzen die Schreibmarke mit [Alt]+[>] (M->) ans Dateiende und fügen mittels [Alt]+[X],insert-kbd-macro,[Eingabe]+ noch den Code für das soeben erstellte Keyboard Macro erstelle-csv-aus-email-zeile ein. Danach vergeben Sie mittels [Strg]+[C]+[E] ein Tastenkürzel, markieren diesen Text wieder und rufen nochmals [Alt]+[X],eval-region,[Eingabe] auf. Nun kennt Emacs die Definition.

Um das Makro erstelle-csv-aus-email-zeile zu testen, öffnen Sie die Datei mit den E-Mail-Adressen ein weiteres Mal und drücken [Strg]+[C]+[E]. Damit machen Sie in einem einzigen Rutsch daraus eine CSV-Datei mit Namen und E-Mail-Adressen, analog zu Listing 2. Die Datei können Sie jetzt in Thunderbird als Adressliste einsetzen.

Fazit

Emacs lässt sich vollständig programmieren und bringt von sich aus bereits eine große Menge an Funktionen mit. Die Lernkurve fällt dabei jedoch recht steil aus.

Mit Keyboard Macros eröffnen sich zusätzliche Möglichkeiten, um eigene, sich wiederholende Bedienschritte noch weiter zu automatisieren. Trickreich und mitunter unübersichtlich wirken die bestehenden Emacs-Funktionen, die sich erst mit der Zeit erschließen. Wie beschrieben entsteht am Ende kompakter und leistungsstarker Code, um komplexe Situationen zu meistern.

Emacs bietet eine eingebaute, englischsprachige Hilfe. Mit welchen Tastenkombinationen Sie Hilfe wofür bekommen, fördern Sie über den Shortcut [Strg]+[H][Strg]+[H] zutage. Alle Hilfe-Tastenkommandos beginnen mit [Strg]+[H]. Eines davon haben Sie schon kennengelernt, [Strg]+[H]+[K] für die Hilfe zu Tastenkombinationen.

Ein anderes sehr hilfreiches Tastenkürzel lautet [Strg]+[H]+[A] für “Apropos”, eine Stichwortsuche innerhalb der interaktiven Hilfe. Sie findet Funktionen, Variablen, Einstellungen und vieles mehr. Einem Link folgen Sie in Emacs übrigens, indem Sie ihn auswählen und dann [Alt]+[X],browse-url,[Eingabe] tippen. Der Link öffnet sich daraufhin im Webbrowser. (csi)

Danksagung

Die Autoren bedanken sich bei Tassilo Horn für seine Hilfe und Kritik bei der Vorbereitung des Artikels.

Die Autoren

Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor, bevorzugt in Berlin, Genf und Kapstadt. Der gebürtige Kanadier Gerold Rupprecht wohnt seit 30 Jahren in Genf und hat sich auf Finanzsoftware sowie die Evaluierung und die Optimierung IT-bezogener Prozessabläufe spezialisiert. Axel Beckert (http://axel.beckert.ch/) benutzt Linux und Emacs seit über 25 Jahren. Er ist Mitglied im Debian-Emacsen-Team und pflegt für Debian unter anderem die Pakete des Mini-Emacs GNU Zile und des Emacs-Minor-Modes Ligature (Paket elpa-ligature).

Infos

  1. Regex in Vim/Emacs (Teil 1): Frank Hofmann, Gerold Rupprecht, “Die Zeichenzauberer”, LU 05/2024, S. 82, https://www.linux-community.de/49980

  2. Regex in Vim/Emacs (Teil 2): Frank Hofmann, Gerold Rupprecht, “Automatisiert”, LU 06/2024, S. 32, https://www.linux-community.de/50682

  3. “Introduction to Emacs: Keyboard Macros”: https://www.computerhope.com/unix/uemacs.htm#Keyboard-Macros

  4. “Emacs Keyboard Macros”: https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html

  5. “Keyboard Macros are Misunderstood”: https://www.masteringemacs.org/article/keyboard-macros-are-misunderstood

  6. Serien-Mails in Thunderbird: https://www.brevo.com/de/blog/thunderbird-serienmails-versenden/

  7. “Contact your senator”: https://www.4mycanada.com/contact-mp-senator

  8. GNU Emacs Common Lisp Emulation: https://www.gnu.org/software/emacs/manual/html_mono/cl.html

  9. Keyboard Macros: https://www.emacswiki.org/emacs/KeyboardMacros

  10. “Mastering Key Bindings in Emacs”: https://www.masteringemacs.org/article/mastering-key-bindings-emacs

  11. “Key Binding Conventions”: http://xahlee.info/emacs/emacs_manual/elisp/Key-Binding-Conventions.html

  12. Capitalize-Funktion in Lisp: https://www.gnu.org/software/emacs/manual/html_node/elisp/Case-Conversion.html

  13. “GNOME Useful Keyboard Shortcuts”: https://help.gnome.org/users/gnome-help/stable/shell-keyboard-shortcuts.html.en

  14. “Emacs M-key Notation vs Alt+key Notation”: http://xahlee.info/emacs/emacs/modernization_meta_key.html

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 08/2024 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben