Emacs Macro definieren, benennen, speichern

Das Bearbeiten großer Datentabellen mit nur einem Texteditor kann sich sehr mühselig gestalten. Die monotone Arbeit, die sich etwa beim Löschen der gesamten 31 Spalte von insgesamt 211 aus einer Text-Datei entsteht, senkt die Motivation und steigert die Fehleranfälligkeit. Ist man jedoch glücklicher und zufriedener Benutzer des Emacs, so steht dem frühen Feierabend nichts im Wege.
Schnell ein sicheres Macro getippt und automatisiert beliebig oft ausgeführt, hat man die Aufgabe eher in Sekunden statt in Minuten erledigt.

Macros allgemein und Emacs-Macros

Macros stellen eine sehr praktische und einfache Möglichkeit dar, sich das Leben leichter zu machen und sich ständig wiederholende Aufgabe zu automatisieren. Sie stellen sich als unterstützender Helfer in diversen Aufgabe des Arbeitsalltags heraus. Dazu gehören zum Beispiel das Bearbeiten von Tabellen, wie eingangs bereits erwähnt, das Umformatieren von Dateien und das Auszeichen von Text, um nur einige zu nennen.

Auf das simpelste herunter gebrochen, lassen sich Emacs-Macros als eine Reihung von Tastaturbefehlen im Emacs-Style bezeichnen: C-a C-Space C-e M-w Emacs-Jünger haben es sofort erkannt: die Befehls-Kombination aus dem Beispiel kopiert eine ganze Zeile in die Zwischenablage. Abgesehen davon, dass es etwa unendlich viele Möglichkeiten gibt in Emacs eine Zeile in die Zwischenablage zu kopieren, ist mir bis heute kein Befehl bekannt, womit dies direkt geht. Ohne unnötige Bewegungen des Cursors im Text.

Diese Tatsache werden im folgenden zum Anlass genommen, um ein Macro aufzunehmen, zu benennen und zu speichern. Dadurch steht es in jeder Emacs-Session zur Verfügung und kann mit einer kurzen Kombination aufgerufen werden.
Doch zuvor noch ein einleitendes Beispiel.

Beispiel: Löschen einer Tabellenspalte

Bei Datensätzen in Tabellenform, die in Textdateien gespeichert sind, kommt es nicht selten vor, dass eine Spalte verschoben oder entfernt werden muss.
Betrachten wir folgenden Datensatz:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

Die dritte Spalte soll nun entfernt werden und in einer Datei namens scr.dat gespeichert werden.

Unabhängig davon, wo sich der Cursor zu Beginn befindet, lässt sich diese Aufgabe mit dieser Kombination vollständig lösen:
Neue Datei anlegen: C-x-f scr.dat ENTER C-x b
An den Dateianfang: M-<
Macro-Aufnehmen starten: C-x (
Macro-Befehle: C-a M-f M-f ENTER M-b M-b C-f C-k C-k C-n C-x b ENTER C-y C-x b ENTER
Macro-Aufnahme beenden: C-x )
Macro-Probe: C-x e
Macro automatisch 50 mal ausführen: C-u 50 C-x e

Das von Erfolg gekrönte Durchführen der genannten Befehle gipfelt in zwei Dateien:
1 2 4 5
1 2 4 5
1 2 4 5
1 2 4 5
1 2 4 5

und
3
3
3
3
3

Bleibt nur noch zwei schnelle C-x-s und die Dateien sind gespreichert.

Definieren und Speichern eines Emacs-Macros

Nachdem die Tragweite und Wichtigkeit der Emacs-Macros mit dem Beispiel angedeutet wurde, kommen wir nun zu einigen Details: wie wird eine Macro aufgenommen, ausgeführt und gespeichert?

Aufnehmen eines Macros

Das Aufnahme-Prinzip ist schon von diversen anderen Programmen auch aus der Windows-Welt bekannt. Ein Startbefehl und ein Endbefehl bilden den Rahmen, alle Befehle dazwischen das Macro:
Startbefehl: C-x (
Endbefehl: C-x )

Bei Auftreten eines Fehlers während der Definition eines Macros wird die Aufnahme beendet und Emacs vergisst die bis dahin eingegebenen Befehle. Das Gleiche tritt ein, wenn ein Macro mit C-g abgebrochen wird.

Testweise Ausführen eines Macros

Fehler können sich bei der Macro-Definition leicht einschleichen, weswegen ein Probedurchlauf immer anzuraten ist. Um das zuletzt definierte Macro nun zu diesem Zweck einmal laufen zu lassen, bedient man sich des folgenden Befehls:
zuletzt definiertes Macro einmal ausführen: C-x e

Emacs-Macro speichern

Jetzt machen wir uns an das Eingemachte: Um ein Macro am nächsten Tag ohne erneute Definition wiederverwenden zu können, muss es auf einen Namen getauft und gespeichert werden.

Damit die ganzen Anstrengungen an dieser Stelle nicht umsonst sind, erinnern wir uns an das große Ziel: Macro zum Kopieren einer ganzen Zeile. Dazu nehmen wir das Macro erst auf, benennen es mit "copy-line" und speichern es in der Datei emacs.macros:
Macro aufnehmen: C-x ( C-a C-Space C-e M-w C-x )
Macro benennen: M-x name-last-kbd-macro ENTER copy-line ENTER
Datei emacs.macros öffnen: C-x-f /PFAD/ZU/emacs.macros ENTER
Macro schreiben: M-x insert-kbd-macro ENTER copy-line ENTER
Datei speichern: C-x-s

Das Ergebnis kann sich sehen lassen: in nur wenigen Sekunden haben wir das Macro gespeichert. Was noch fehlt ist der kurze Befehl, mit dem das Macro bei der nächsten Emacs-Session wieder verwendet werden kann.

Tastaturbefehl für ein Emacs-Macro festlegen

Standardmäßig sind für eigene Macros die folgende Keybinding, also Tastaturkurzbefehle, vorgesehen:

  • C-x C-k 0 ... 9
  • C-x C-k A ... Z

Ehrlich zugegeben, sind die für eigene Macros vorgesehenen Keybindings ziemlich lang, wenn man die "copy-line" Kombination vergleichsweise heranzieht. Nichtsdestotrotz wollen wir einen eigenen Befehl für "copy-line".

Wie bereits erkennbar wurde, ist das Macro in einer eigenen emacs.macros-Datei gespeichert worden. Diese muss nun in die .emacs-Datei geladen und ein globaler Key festgelegt werden. Das geschieht durch Eintragen der folgenden Zeilen in die .emacs-Datei:
(load-file "/PFAD/ZU/emacs.macros")
(global-set-key "\C-x\C-kK" 'copy-line)

Gesagt, getan und nun fehlt zum Glücklichsein nur noch ein Neustart von Emacs.

Merkmale guter Emacs-Macros

Emacs-Macros sollen uns Arbeit ersparen. Dieser Gewinn kann ganz schnell durch ein fehlerhaftes Macro wieder zunichte gemacht werden. Damit dieser Horror-Szenario so selten wie möglich auftritt, können einige wenige Richtlinien befolgt werden:

  • Absolute Befehle verwenden: nicht C-f C-f C-f sondern M-f um zum nächsten Wort zu springen
  • Eindeutige Befehle verwenden: nicht C-s C-s für die letzte Suche, sondern C-s SUCHTEXT ENTER
  • Keine Annahmen über Position des Cursors im Text, bzw. den Cursor zu Beginn eines Macros richtig positionieren.
  • Am Ende den Cursor so positionieren, dass einer Wiederholung nichts im Wege steht.

Mit diesen Ratschlägen sollten wir für die Emacs-Macros gerüstet sein.

Schlusswort

Buchcover: GNUEmacs

Buch von Debra Cameron*

Emacs ist ein beeindruckendes Stück Software. Auch bei einer intensiven Beschäftigung kann man beinahe jeden Tag etwas neues an dem Editor entdecken. Seien es Macros oder die verschiedenen Modes. Für Insider: es gibt sogar einen Emacs-Mode für ABAQUS-Input Dateien.


Bewährte Hilfe bei dem Erlernen der Bedienung und Verwendung des Emacs-Editors kann im "Learning GNU Emacs" von Debra Cameron* gefunden werden. Das Buch ist zwar auf englisch, jedoch einfach geschrieben und gut verständlich.

(* Partnerlink)

2 Kommentare

  1. Interessanter Artikel,
    ich kopiere eine Zeile immer so: C-a C-k C-_

  2. Danke für den Hinweis, jedoch habe ich diese Methode absichtlich nicht als Beispiel genommen, da es dann gar kein Vorteil mehr wäre ein Macro dafür zu speichern.

Kommentar absenden

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>