Emacs


(Photo by Paul Fehlerbauer on Unsplash)

Der Emacs ist eigentlich schon seit meiner Anfangszeit mit Unix ein treuer Wegbegleiter. Ich müßte eigentlich schon seit 34 Jahren mit ihm arbeiten (Emacs feiert dieses Jahr seinen 40.). Und es gab öfter Zeitpunkte, wo ich das System grundsätzlich neu angefaßt habe. Ja, bei mir ist es der Emacs und nicht der Vi…

Dabei habe ich das .emacs angepaßt und mit den neuesten technischen Möglichkeiten modifiziert. Das fing damals mit Highlighting an, dann habe ich jahrelang mit Gnus meine Mails gelesen und vor etwas mehr als zehn Jahren bin ich auf eine globale versionierte .dotfiles gegangen. Das war der Zeitpunkt, wo ich den Emacs dann mit dem Melpa Package Manager befüllt habe. Dazu gehörte auch der Org Mode, der mit Getting Things Done meine Projektplanungen bereichert hat.

Das hatte dann zur Folge, daß ich nach und nach neue Funktionalitäten einfach angeklebt hatte. Das .emacs wanderte nach ~/.config/emacs/init.el, aber eigentlich gab es keine wirkliche echte Neuerung seitdem.

Seit ich mit Asahi Linux arbeite, compiliere ich den Emacs selbst aus dem bleeding-Edge Zweig der kommenden Version 29, die mittels pgtk unter Wayland nativ läuft, was auf einem M1-Macbook gestochen scharfe Fonts zur Folge hat.

Dann bin ich Emacs From Scratch über den Weg gelaufen, welches auf einer Videoserie von System Crafters basiert. Diese Serie hat mich dann wiederum dazu bewogen, meine Konfiguration noch einmal über den Haufen zu schmeißen. Hier also eine Auflistung aller Neuerungen, die eine Bemerkung wert ist.

Konfiguration im Org-Mode

Die wohl wichtigste Neuerung ist die Konfiguration aus dem Org-Mode heraus. Durch Org-Babel ist man in der Lage, Code im Org-Mode zu schreiben und im Org-Mode laufen zu lassen. Das Ergebnis wird dann ebenfalls im Org-Dokument abgelegt. Ich bin mir nicht sicher, könnte aber sein, daß das vor Jupyter Notebook geschehen ist. Aber so kann man sich die Funktionalität in etwa vorstellen.

Was ich aber nicht wußte ist, daß man im Org-Mode Tanglen kann. Da werden dann die Codeschnipsel einer definierten Programmiersprache (man könnte ja Schnipsel unterschiedlicher Sprachen in einem Dokument haben) zusammenfassen und in einer anderen Datei ablegen.

Eine Headerzeile der Art

#+title: Emacs Konfiguration mit org-mode
#+PROPERTY: header-args:emacs-lisp :tangle init-neu.el :mkdirp yes

ist das einzige, was man dazu benötigt. In meiner .dotfiles gibt es also nun eine Emacs.org mit der Dokumentation und die darin enthaltene komplette Konfiguration. Wenn ich etwas neues ausprobiere, packe ich den Codeschnipsel in einen emacs-lisp Codeheader (der Codeschnipsel konfiguriert no-littering. welches die *~-Dateien zentral ablegt und damit nicht die Directories vollmüllt):

#+begin_src emacs-lisp

  ;; NOTE: If you want to move everything out of the ~/.emacs.d folder
  ;; reliably, set `user-emacs-directory` before loading no-littering!
  ;(setq user-emacs-directory "~/.cache/emacs")

  (use-package no-littering)

  ;; no-littering doesn't set this by default so we must place
  ;; auto save files in the same path as it uses for sessions
  (setq auto-save-file-name-transforms
        `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))

#+end_src

Natürlich hilft Babel bei der Formatierung der Zeilen, Highlighting included.

Dann kann ich das live mittels C-c C-c ausführen und testen. Gefällt mir der Code, wird der mittels C-c C-v t in das init.el geschrieben. Anschließend wird das noch mit Magit versioniert und direkt ins Repository hochgeladen. Man braucht den Emacs dazu also noch nicht mal zu beenden.

Das schönste aber: Git-Verwalter, wie z. B. GitHub, GitLab oder auch Gitea können nicht nur Markdown verarbeiten, sondern auch Org-Dateien. Damit ist die Dokumentation dann in meinem Gitea hübsch formatiert. Gitea kann sogar noch ein Inhaltsverzeichnis aus dem org-File bauen.

Wie sieht das dann am Ende aus? Am besten schaut man sich die Emacs.org bei Emacs From Scratch an.

use-package

Um den Melpa-Packagemanager auch über Rechner hinweg verwenden zu können, hatte ich in meinem .emacs so ein Stück Code, wo dann die ganzen Module aufgelistet wurden, die ich verwenden wollte. Wurde der Emacs das erste Mal aufgerufen, wurden diese Pakete dann alle von Melpa heruntergezogen und installiert.

Anschließend wurde dann für jedes Paket weiter unten im .emacs die Konfigurationen vorgenommen. Das konnte teilweise sehr unübersichtlich werden. Bei Emacs from Scratch wird das use-package-Modul verwendet. Dabei wird möglichst in einem Block sowohl das Melpa-Packaging, die Konfiguration und die Keybindings konfiguriert. Auch das obige no-littering verwendet das use-package. Damit kann man in seiner Dokumentation Modul für Modul dokumentieren und installieren.

Hier noch ein Beispiel, welches die Funktionalitäten von use-package gut ausnutzt: Das Installieren von emacs-which-key, welches einem die möglichen Tastaturkombinationen anzeigt, hier mal als Beispiel.

#+begin_src emacs-lisp

  (use-package which-key
    :defer 0
    :diminish which-key-mode
    :config
    (which-key-mode)
    (setq which-key-idle-delay 1))

#+end_src

Hier sind so einige Unterkategorien, wie z. B. config: enthalten.

ivy-mode

Mit dem iv-mode der aus dem Swiper-Modul kommt, macht die Completion auf dem Emacs besser. Swiper selbst ist ein Super-Grep und zusammen kann man wirklich alle Emacs-Befehle sehr schnell finden und Popups liefern schöne Library-Vorschläge…

An den Modus habe ich mich ursprünglich nicht herangewagt, weil das schon ziemlich in die Mimik des Emacsschen Completions hereingreift. Aber mittlerweile finde ich das Ding schon ziemlich praktisch.

Damit kommen wir zum Development und…

lsp-mode

Visual Studio ist ja so beliebt, weil die IDE immer schön Vorschläge macht, automatisch linted (also live Syntax-Reparaturen macht) und formatiert. Hat alles Microsoft erfunden, obwohl der Emacs das locker 20 Jahre länger konnte. Jedoch mußte beim Emacs für jede Sprache ein eigenes IDE-System entwickelt werden. Heute wird aber der lsp-mode verwendet.

Heute werden für jede Programmiersprache Server geliefert, mit denen der Emacs über eine definierte Schnittstelle spricht. So ist die Oberfläche auf der Emacs-Seite immer gleich und man hat die komplette IDE-Umgebung, wie man sie mag.

emacs-easy-hugo

Dieses Blog wird mit Hugo geschrieben, einem Offline Blogging Frameword. Natürlich stellte sich da für mich die Frage, ob man nicht vom Emacs irgendwie integriert mit Hugo arbeitet. Und, oh Wunder, Emacs Easy Hugo macht genau das.

emacs-easy-hugo

Dieser Post ist natürlich gerade auch mit diesem Modus endstanden.

Calibre

Irgendwann wird man dann natürlich neugierig. Ich organisiere meine Ebooks in Calibre., Kommt der Emacs da auch an die Daten? Natürlich. Mit calibre.el.

calibre.el

Zusammen mit dem Epub-Mode org-novelist, mit dem man Epubs im Emacs lesen kann, kann man also mit einer Calibre-Datenbank sogar komplett seine Bücher im Emacs organisieren und lesen.

devdocs

DevDocs ist eine Dokumentationssammlung, die man auch offline im Browser abonnieren kann. Diese Sammlung kann man im Emacs auch ansprechen, offline speichern und im Emacs dann auch lesen. Zusammen mit dem lsp-mode und ivy hat man dann ein völlig komplettes Doku/IDE-System.

Dazu verwendet man im Emacs devdocs.

mu4e

Früher habe ich meine Mails im Emacs mit Gnus gelesen. Das war ganz schön. Irgendwann wurden meine Mail-Setups aber auch wegen Self-Hosting komplexer und ich bin dann bin ich beim Thunderbird gelandet. Irgendwann hatte mal wer einen Super-Index von IMAP-Mailings gebaut, der zoe hieß. Das war ein fettes Java-Konstrukt, was eine Mailbox indizierte und man konnte in einer Weboberfläche in seinen Mails herumbrowsen. Das war hübsch, verschwand aber schon Anfang der 2010er.

So einen Indexer gibt es heute auch in Form eines kleinen Progrämmelchens: mu. Dieser Index greift auf ein Offline-Mailrepository zu, welches z. B. mit OfflineImap das eigenen IMAP-Mailaccount spiegelt. Hat mehrere Vorteile:

  • man hat schonmal eine Offline-Kopie seines IMAPs
  • die Mails können sehr schnell durchsucht werden
  • die Benutzeroberfläche des Systems ist mu4e und läuft auf dem Emacs.

mu4e

Damit räume ich nun jeden Tag meine ganzen täglichen Mails auf. Da der mu4e über alle Verzeichnisse geht, brauche ich nicht im Thunderbird alle Verzeichnisse zu durchwühlen. Der nächste Sync läßt das dann auch im Thunderbird auftauchen.

Super

Mit diesen und vielen anderen weiteren Helferlein, macht der Emacs noch mehr Spaß.

emacs  mail  calibre  lsp 

See also