Emacs für Autoren

In den beiden vorangegangenen Artikeln, Emacstipps für Einsteiger und Emacs Erweiterungen für Vielschreiber, habe ich versucht eine kleine Hilfestellung bei den ersten Gehversuchen mit diesem wundervollen Programm zu geben. Hier befasse ich mich unter anderem mit den Suchfunktionen des Emacs und erkläre, wie Sie selbst Tastenkombinationen für Emacs-Befehle festlegen können.

Emacs Suchfunktionen

Emacs bietet weitaus mehr für die Suche, als man von herkömmlichen Textverarbeitungssystemen vielleicht gewohnt ist. Wenn Sie eine Weile damit gearbeitet haben, stehen die Chancen gut, dass Sie zwangsläufig die eine oder andere Gewohnheit überdenken, mit der Sie bislang Ihr System nach Informationen durchforstet haben.

Find file

Eine der einfachsten Suchfunktionen im Emacs ist ein Befehl, den Sie vermutlich bereits verwendet haben: find-file bzw. C-x C-f. Wenn Sie das package vertico installiert haben, funktioniert die Dateisuche inkrementell. Sobald Sie Zeichen in der Eingabezeile hinzufügen oder löschen, aktualisiert vertico die Liste der in Frage kommenden Dateien und der Aufruf des Befehls find-file sieht in etwa so aus:

Ich habe das package marginalia installiert, das Listeneinträge mit zusätzlichen Informationen versieht. Der Befehl Find-file zeigt damit zusätzliche Attribute (Dateirechte, Größe, letzter Zugriff und Besitzer) der gesuchten Dateien an:

help-command

Etwa zur gleichen Kategorie der Suchfunktionen zählen für mich die zahlreichen integrierten Hilfebefehle des Emacs. Darin finden Sie jede Menge Informationen zu Befehlen und den zugehörigen Keybindings, zu Variablen, packages und Vieles mehr. Mit C-h bzw. F1 rufen Sie die Liste der verfügbaren Hilfen auf. Auch wenn Ihnen anfangs die meisten der angebotenen Informationen nicht viel zu sagen scheinen, lohnt sich das schmökern.

isearch

Mit dem Befehl isearch komme ich nun zu einer Suchfunktion, wie man sie in einfacher Form auch in anderen Textverarbeitungssystemen kennt. Von der aktuellen Cursorposition aus können Sie den buffer vorwärts oder rückwärts durchsuchen.

C-s (isearch-forward) durchsucht den Text bis zum Ende und C-r (isearch-backward) bis zum Anfang inkrementell nach den gesuchten Zeichenfolgen. Die Fundstellen werden farblich hervorgehoben. Geben Sie wiederholt C-s bzw. C-r ein, springt der Cursor zur jeweils nächsten bzw. vorherigen Fundstelle.

Für die inkrementelle Suche nach einer bestimmten Folge von Worten, ist der Befehl iserach-forward-word bzw. M-s w sehr nützlich. Dabei wird nur die eingegebene Wortfolge berücksichtigt und Leer- und Satzzeichen im Text ignoriert.

Isearch verfügt zwar über eine Reihe weiterer Befehle, ich nutze jedoch nur gelegentlich die oben beschriebenen Funktionen. Damit lassen sich zu häufig verwendete Ausdrücke in einem Text sehr gut enttarnen. Die meisten Suchaufgaben erledige ich mit der folgenden Erweiterung.

consult

Consult ist eine ähnliche Erweiterung wie das im letzten Artikel besprochene package vertico und stellt ebenfalls eine Schnittstelle für die emacseigenen Komplettierungsfunktionen bereit. Allerdings geht es hierbei mehr um die Arbeit mit bestimmten Funktionen:

consult-ripgrep

Auf meinem Linux-System habe ich z. B. ripgrep installiert, eine ultraschnelle Volltextsuche. Consult unterstützt mit consult-ripgrep direkt die Arbeit mit ripgrep.

consult-line

Für die incrementelle Suche in geöffneten Buffern verwende ich consult-line. Der Befehl öffnet im Minibuffer eine Liste mit den Fundstellen der Suchbegriffe. Bei der Auswahl der Listenpunkte wird die jeweilige Fundstelle im Text angesprungen. Besonders praktisch finde ich, dass der Kontext der Fundstelle ebenfalls sichtbar ist.

consult-find

Der Befehl consult-find dient der Dateisuche innerhalb des aktuellen Verzeichnisses. Da der Suchbegriff intern als regulärer Ausdruck interpretiert wird, kann man einzelne Suchbegriffe oder Sequenzen davon kombinieren und das Suchergebnis so auf die gesuchte Datei einengen. Auch consult-find verfügt über weitere Optionen zur Anpassung der Sucheigenschaften.

consult-mark

Ich finde es sehr nützlich, wenn man bei der Arbeit an sehr langen Texten bestimmte Passagen im Text schnell wiederfinden kann. Deshalb setze ich mit C-SPACE eine Markierung an die jeweils betreffende Stelle, zu der ich dann bei Bedarf einfach zurückspringen kann. Der Befehl consult-mark listet alle bisher gesetzten Markierungen und springt automatisch zur zugehörigen Textpassage. Leider geht die Liste der Markierungen mit einem Neustart des Programms verloren. Da auch perspective den mark ring (die Liste der Markierungen) nicht speichert, nutze ich dazu stattdessen das package desktop+, das diese Aufgabe sehr gut erfüllt.

occur

Der Vollständigkeit halber sei hier der Suchbefehl occur erwähnt. Er listet alle Zeilen des aktuellen buffers auf, die der Eingabe entsprechen. Benutze ich selten bis kaum, da ich mit consult-line das selbe Ergebnis erhalte.

Eigene Tastenkürzel definieren

Viele Befehle des Emacs lassen sich auch über Tastenkombinationen aufrufen. Aber eben nicht alle. Und einige davon sind auf der deutschen Tastatur nur nur mit mittelschwerer Fingerakrobatik zu erreichen. Daher macht es oft Sinn, eigene Tastenkombinationen für bestimmte Befehle zu definieren. Diese keybindings können sowohl global als auch für einzelne modes festgelegt werden. Globale keybindings sind dann in jedem buffer aktiv. Es sei denn, für den betreffenden buffer ist eine mode-map vorhanden. Mode-maps werden für einen einzelnen major- oder minor-mode festgelegt. Immer dann, wenn dieser mode in einem buffer aktiv ist, wird das in der zugehörigen mode-map definierte keybinding aktiviert.

Üblicherweise legen Sie ein globales keybinding mit dem Befehl global-set-key an. Damit ist es möglich, neue keybindings interaktiv festzulegen: Rufen sie den Befehl mit M-x global-set-key auf, drücken dann die gewünschte Tastenkombination und wählen daraufhin den auszuführenden Befehl aus. Sie können hierbei allerdings nur keybindings für Befehle festlegen, die Sie sonst mit M-x ... aufrufen.

Die so erstellte Tastenkombination geht beim Beenden des Programms verloren. Möchten Sie das binding dauerhaft festlegen, zeigen Sie es mit C-x ESC ESC im minibuffer an und übertragen es mit copy & paste in Ihre Konfigurationsdatei. Selbstverständlich können Sie ein keybinding auch ohne Umwege direkt in Ihre init.el schreiben.

Übrigens, Sie werden im Internet immer wieder auf unterschiedliche Schreibweisen treffen:

(global-set-key “^cs” ‘consult-line) ist dasselbe wie

(global-set-key “^c s” ‘consult-line) oder

(global-set-key (kbd “^cs”) ‘consult-line) oder

(global-set-key (kbd “C-c s”) ‘consult-line)

Es existieren sogar noch weitere – aber ich glaube, das reicht fürs Erste. Mitunter findet man im Internet auch andere Befehle für das keybinding, wie global-map oder define-key. Mein Tipp: Wenn Sie der Versuchung widerstehen können, bleiben Sie bei global-set-key.

Auch keybindings mit mehr als einer Tastenkombination sind möglich:

(global-set-key (kbd “C-c C-l”) ‘org-insert-link) wäre ein Beispiel.

Selbstverständlich sind Sie für eigene keybindings nicht an die control- Taste gebunden. Für meine Tastenkombinationen verwende ich sehr häufig auch die super- und alt- Taste.

Bevor Sie nun Ihre eigenen keybindings munter drauf los definieren, bedenken Sie bitte Folgendes. Mit jeder Änderung Ihrer Konfigurationsdatei wird Ihre Emacsinstallation individueller. Das ist gut so, aber Sie sollten darauf achten, bereits vorkonfigurierte Tastenkombinationen nicht wahllos zu überschreiben. Die Key Binding Conventions (eine Richtlinie für Entwickler) empfiehlt Programmierern, die Tastenkombinationen mit C-c Buchstabe für die Belegung durch den Nutzer frei zu halten.

Aber vielleicht gefällt Ihnen die folgende, sehr elegante, Möglichkeit besser, Herrin oder Herr über die Befehlsvielfalt des Emacs zu werden.

Hydra

Dieses package dient dazu, Befehle für einen einfacheren Zugriff anhand eigener Kriterien zu gruppieren. Jede dieser Gruppen kann auf Tastendruck die in ihr enthaltenen Befehle zur Auswahl am Bildschirm darstellen. Auf meinem System habe ich z. B. eine Master-hydra angelegt, die mir eine Übersicht über die vorhandenen Gruppen anzeigt.

Normalerweise erscheint das Popupfenster am unteren Bildschirmrand. Das package hydra-posframe zentriert bei mir die Ausgabe allerdings in einem Popup innerhalb der Textfläche. Durch Eingabe des betreffenden Buchstabens erfolgt der Aufruf eines weiteren Popups mit den gesuchten Befehlen.

Die Definition eigener hydras ist relativ simpel. Zu Erläuterung nehme ich ein Beispiel von der github-Seite des packages.

(defhydra hydra-zoom ()
  "zoom"
  ("g" text-scale-increase "in")
  ("l" text-scale-decrease "out"))

Wenn Sie dieses Beispiel in Ihre init.el eintragen, können Sie die Zoom-Funktion fortan über den Befehl M-x hydra.zoom/body aufrufen. Dabei werden Sie feststellen, dass die zur Auswahl stehenden Zeichen „g“ und „l“ rot dargestellt werden. Darauf werde ich gleich zu sprechen kommen.

Statt hydra-zoom/body mit M-x auszuwählen, ist es übersichtlicher, die selbsterstellten Hydras mithilfe einer Master-hydra aufzurufen:

(defhydra hydra-master (:color blue)
"Master"
("z" hydra-zoom/body "zoom"))

Wenn Sie nun die Master-hydra an eine leicht zugänglich Tastenkombination binden, haben Sie blitzschnellen Zugriff auf Ihre Hydras. Durch eine sinnvolle Gruppierung und sprechende Namen, lassen sich so alle benötigten Befehle leicht auffinden und mit zwei oder drei Tastenkürzeln erreichen.

Vergleichen Sie die Kopfzeilen der letzten Beispiele, wird Ihnen der Parameter :color auffallen. Damit ist natürlich die Farbe gemeint, in der die Zeichen dargestellt werden sollen. Ihnen kommt eine besondere Bedeutung zu.

Ein blaues Zeichen weist auf das Ausführen des Befehls und das sofortige Schließen des Hydra-Fensters hin. Ein rotes Zeichen sagt Ihnen, dass der Befehl ausgeführt wird, das Fenster aber weiterhin für Eingaben auf dem Bildschirm sichtbar bleibt. Letzteres ist für das Umschalten von Zuständen, wie z. B. Schriftarten, oder für kontinuierliche Eingaben, wie z. B. den Zoom-Befehl, sehr sinnvoll. Wie Sie sehen, ist dies der Standard, wenn Sie gar keine Parameter bei der Definition angeben. Auf der Internetseite des packages finden Sie weitere Erläuterungen mit Beispielen zur Verwendung dieser und anderer Parameter.

Im Hydra-body können Sie auch die Darstellung im Popupfenster nach eigenen Vorstellungen gestalten:

  (defhydra hydra-master (:color blue :hint nil)
 "
======  Master ======
_z_: Zoom

"
("z" hydra-zoom/body)
("q" nil "Beenden"))

Beachten Sie den gesetzten Parameter :hint, der mit nil die Ausgabe des Zeichens für die Auswahl des Befehls unterdrückt. Das nun nicht mehr benötigt wird, da Sie ein eigenes Auswahlmenü erstellt haben.

Zusammenfassung

Das Potential des Emacs läßt sich, auch in drei Artikeln, nur andeutungsweise umreißen. Emacs ist ein mächtiges Programm aber die regelmäßige Beschäftigung damit wird sich auszahlen. In diesem Sinne auch weiterhin viel Erfolg mit Emacs und haben Sie ‘ne Gute Zeit.

Quellen

Consult:

https://github.com/minad/consult

Hydra:

https://github.com/abo-abo/hydra

Emacs Key Binding Conventions

https://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Binding-Conventions.html