Emacs

Aus wiki.archlinux.de

Emacs ist

  • ein sehr umfangreicher und mächtiger, enorm weit verbreiteter Editor,
  • eine Programmierplattform und Laufzeitumgebung für Lisp-Anwendungen, beispielsweise News- und Mail-Clients,
  • eine offene Entwicklungsumgebung,
  • ein Akronym für Editor Macros.

Manche witzeln, er sei ein eigenes Betriebssystem. Die folgende Präsentation gibt mit vielen Screenshots einen guten Überblick [1].

Geschichte Die Geschichte der verschiedenen Emacs-Implementierungen ist lang (ab 1972 mit einem Satz von Macros für den Editor Teco) und wechselvoll. Die Programmierung am GNU-Emacs wurde 1984 von Richard Stallman in C begonnen, da es für sein GNU-System noch kein Lisp gab. Als Erweiterungs- und zum großen Teil auch Implementierungssprache erfand er EmacsLisp (elisp).

Lizenz GNU-Emacs und seine Forks XEmacs und SXEmacs stehen unter der GPL. In diesem Artikel geht es ausschließlich um GNU-Emacs.

Abgrenzung Es kann nicht Sinn dieser Abhandlung sein, Emacs in seiner Funktion zu erklären oder gar zu dokumentieren. Zu Emacs gibt es tonnenweise Material im Internet (siehe Links), teilweise auch auf Deutsch, so daß man sich jederzeit konkret und detailliert informieren kann. Ziel ist hier, die Installation und Konfiguration zu erläutern und einen Überblick über die wichtigsten Funktionen zu geben, was als Anregung zum Ausprobieren verstanden werden soll. Arch way, erst machen, dann fragen und so ...

Installation

Das Programm ist als emacs in extra verfügbar, und kann von dort mittels Pacman installiert werden.

pacman -S emacs

Diese Binärdateien sind gegen GTK3 gelinkt und enthalten die typischen Dekorationen und Stile für Menü, Toolbar, Scrollbars usw., zudem auch die üblichen Datei-Dialoge.

Wer Emacs ohne GTK betreiben will, kann sich problemlos die Quellen beschaffen und selbst compilieren. Es besteht per configure-Option die Möglichkeit, die Verwendung der Motif-Bibliotheken zu erzwingen (diese stehen als pacman-Paket openmotif oder lesstif zur Verfügung) oder ganz auf die Verwendung eines Toolkits zu verzichten und rein für X11 zu compilieren, was Emacs ein rustikaleres Aussehen gibt, aber möglicherweise eine halbe Sekunde Ladezeit spart.

Es besteht sogar die Möglichkeit, ganz ohne X-Bibliotheken auszukommen. Die entsprechenden Pakete haben dann ein -nox im Paketnamen.

Starten

Um Emacs zu starten, muß man nur

emacs

in die Konsole eingeben. Unter X11 wird Emacs als X11-Programm in einem neuen X11-Fenster gestartet. Es wäre ratsam, in diesem Fall emacs mit & zu starten:

emacs &

da er sonst das Terminal blockiert, von dem aus der Aufruf erfolgte. Wenn man Emacs unter X11 im aktuellen Terminal starten möchte, ohne daß ein neues Fenster geöffnet wird, so kann man

emacs -nw 

eingeben, dann in jedem Falle ohne &.

Sofern gar kein X11 läuft, kann man Emacs auch auf der Kommandozeile starten, wobei der Zusatz -nw nicht notwendig ist. Möglicherweise funktionieren allerdings einige Tasten anders (ausprobieren). Das Menü wird aus Platzgründen normalerweise nicht angezeigt, man kann es mit der Funktionstaste F10 hervorholen.

Emacs bietet ein Modell an, bei dem quasi ein emacs-Dämon als Server läuft, während die später interaktiv vom Benutzer gestarteten emacs-Prozesse jeweils Clients dieses Servers werden. Der Vorteil liegt vor allem in geringerer Ladezeit. Näheres hier [2]

Man wird allerdings selten Emacs immer und immer wieder starten, wie man es vielleicht von vi her kennt. Emacs bietet (beispielsweise mit dired) andere Möglichkeiten an, schnell Dateien zu öffnen, so daß das ständige Laden eigentlich überflüssig wird. Viele Benutzer haben ihren Emacs stunden- und tagelang offen – eine Frage des persönlichen Geschmacks.

Bedienung

Emacs wird üblicherweise vollständig über die Tastatur gesteuert. Er besitzt die Besonderheit, daß auch mehrere separate Tasten(kombinationen) hintereinander einen einzelnen Befehl auslösen können, beispielsweise nacheinander C-x und C-f (Datei öffnen). Tastenkombinationen können zudem (zumindest auf europäischen Tastaturen) auch aus drei Tasten bestehen, beispielsweise M-% (Suchen und Ersetzen), was auf einer deutschen oder schweizer Tastatur zu S-M-5 wird. (Zur Notation von Tastenkombinationen siehe hier [3] und [4])

Die enorme Anzahl der Tastenkombinationen und ihre oft merkwürdige Anordnung auf der Tastatur haben in den letzten 20 Jahren zu viel Spott geführt. Man benötigt aber in der Tat nur einen kleinen Teil davon, wenige Prozent, und diese kann man lernen, es ist weit weniger schwer als es zunächst aussieht.

Eine vollständige, aus der jeweils aktuellen Konfiguration des Editors heraus gebildete Liste aller Tastenkombinationen erreicht man mit

C-h b

Die Tastenkombinationen sind dort mit den durch sie ausgelösten Lisp-Funktionen aufgeführt, auf welche auch hypertextartig geklickt werden kann, um an nähere Informationen zu gelangen.

Es existiert darüberhinaus eine zentrale Möglichkeit, im sog. Mini-Buffer, den man über M-x erreicht, eine Lisp-Funktion mit ihrem Namen und ggf. Argumenten anzugeben und auszuführen. Dies scheint oft die komfortablere Möglichkeit, da man sich ggf. eher noch an verbale Begriffe erinnert als an Tastenkombinationen.

Aufgrund der begrenzten Möglichkeiten, die ihre zwei oder drei Knöpfe bieten, gibt es nur wenige Funktionen, die auf der Maus liegen. Allerdings sind die Mausknöpfe auch mehrfach, nämlich noch im Zusammenhang mit Shift und Ctrl belegt.

Ein sehr gut brauchbares Tutorial findet man im Editor selbst:

C-h t

oder im Help-Menü gleich der erste Eintrag. Es lohnt sich, dieses mal abzuarbeiten. Siehe ferner auch hier [5]

Weitere Hinweise zur Bedienung gibt emacs selbst auf seinem Startbildschirm.

Emacs konfigurieren

In emacs ist praktisch alles konfigurierbar. Und es gibt nicht zwei emacse, die gleich konfiguriert sind. So wird jeder emacs zu einem ganz individuellen Werkzeug, abgestimmt auf die persönlichen Bedürfnisse und Fähigkeiten seines Benutzers.

Konfigurationsdateien

Emacs selbst entnimmt seine Konfiguration aus der Datei ~/.emacs, die auch ~/.emacs.el oder ~/.emacs.d/init.el heißen darf, denn es ist eine echte Lisp-Datei. Die dritte Möglichkeit sollte bei Neuinstallationen bevorzugt werden, da die beiden anderen Varianten Anachronismen sind. Emacs liest außerdem die ~/.Xdefaults.

Komponenten von emacs besitzen ggf. eigene Konfigurationsdateien, vor allem Gnus gleich eine ganze Liste: ~/.gnus oder ~/.gnus.el, dazu ~/.authinfo, ~/.newsrc, ~/.newsrc.eld. Die letzten beiden kann man getrost ignorieren, sie enthalten vollautomatisch geführte Metainformationen (lieber nicht darin schreiben).

Optionen sind nichts weiter als mit Werten belegte Lisp-Variablen. Einstellungen machen heißt also Variablen setzen. Dies kann man an verschiedenen Orten innerhalb der Konfigurationsdateien machen und auch auf verschiedene Arten.

Man kann, sofern man weiß, was man tut, die gesamte Konfiguration in diesen Dateien von Hand erledigen. Dies ist praktisch, wenn man beispielsweise auch kleine Code-Blöcke (Lambda-Funktionen) usw. benutzen will. Üblicherweise benutzt man jedoch emacs selbst, um sich menügesteuert oder über sog. Customizing zu konfigurieren. Die dabei gemachten Einstellungen gelangen dann in diese Dateien und können später (auch von Hand) bearbeitet werden.

Menügesteuerte Konfiguration

Das emacs-Menü "Options" erlaubt das Setzen bestimmter, häufig gebrauchter Optionen, ohne daß man erst aufwendig danach suchen müßte. Meist betreffen sie das Aussehen oder grundlegende Verhaltensweisen von emacs, beispielsweise ob der Cursor blinken oder ob Scrollbars angezeigt werden sollen. Solche sind selbsterklärend. Allerdings stellt man unter "Options|Mule|Set Language Environment" auch ziemlich wichtige Dinge wie den standardmäßig verwendeten Zeichensatz ein, mit dem neu erstellte Dateien gespeichert werden. Auch die Anzeige von Umlauten kann davon abhängen.

Werden im Options-Menü Einstellungen verändert, muß man diese mit dem Menüpunkt "Options|Save Options" explizit speichern, sonst gehen sie beim Programmende verloren. Diese Optionen gelangen nach ~/.emacs, die jetzt ggf. erstellt wird. Eine bereits bestehende Datei wird nicht überschrieben, sondern erweitert.

Customizing

Customizing ist nichts anderes als das Setzen von Optionen, allerdings mit Hilfe des emacs-eigenen, hierarchisch organisierten Customization Browsers. Man wird ihn schätzen lernen. Seine Handhabung ist allerdings wegen nicht immer gegebener Strenge bzgl. der Hierarchie auch nicht unproblematisch. (Manche Einstellungen erscheinen an mehreren Orten.) Man öffnet ihn am besten mit dem Menüpunkt "Options|Customize Emacs|Browse Customization Groups" oder

M-x customize-browse RET

Ein Baum mit expandierbaren Knoten sollte angezeigt werden. (Die [+]-Zeichen sind anklickbar.) Die eigentlichen Optionen stehen in den Blättern dieses Baumes. Man klicke beispielsweise auf [+] vor "Programming" und dann auf das [+] vor "Languages" und es öffnet sich eine lange Liste von Programmiersprachen, für die man jetzt ganz individuelle Einstellungen vornehmen kann, unter "C" beispielsweise den "C Basic Offset", d.h. die standardmäßige Tabulatorbreite, üblicherweise 8 Zeichen.

Häufig gemachte Einstellungen

.emacs

(custom-set-variables
 '(auto-save-default nil)                                        ; Dateien nie zwischenspeichern
 '(blink-cursor-mode nil nil (frame))                            ; Cursor nicht blinken lassen
 '(c-backspace-function (quote backward-delete-char))            ; cc-mode: Backspace ist Backspace (und nichts anderes!)
 '(c-basic-offset 8)                                             ; cc-mode: Tabulatorbreite
 '(c-syntactic-indentation nil)                                  ; cc-mode: keine Indentation
 '(case-fold-search nil)                                         ; Suchen am Ende der Datei beenden
 '(column-number-mode t)                                         ; Zeilennummer in Statuszeile anzeigen
 '(compilation-scroll-output t)                                  ; im compilation buffer scrollen
 '(current-language-environment "Latin-9")                       ; Zeichensatz
 '(delete-selection-mode t nil (delsel))                         ; markierten Text mit Entf löschen
 '(dired-recursive-deletes (quote top))                          ; dired: Verzeichnisse rekursiv löschen
 '(display-time-mode t)                                          ; Uhrzeit in Statuszeile anzeigen
 '(gdb-many-windows t)                                           ; Debugger mit komplexem Layout starten
 '(global-font-lock-mode t nil (font-lock))                      ; font-locking einschalten, wenn's geht
 '(gnus-inhibit-startup-message t)                               ; für Gnus keinen startup screen anzeien
 '(inhibit-startup-screen t)                                     ; für emacs keinen startup screen anzeigen
 '(make-backup-files nil)                                        ; keine doofen backup files
 '(mouse-autoselect-window t)                                    ; Eingabefokus wandert mit der Maus mit
 '(require-final-newline (quote ask))                            ; Zeilenende an letzter Zeile erzwingen
 '(scroll-bar-mode nil)                                          ; keine scrollbars
 '(sentence-end-double-space nil)                                ; keine zwei Leerzeichen nach einem .
 '(show-paren-mode t nil (paren))                                ; zusammengehörende Klammern anzeigen ...
 '(show-paren-style (quote expression))                          ; ... und zwar durch farbige Markierung
 '(show-trailing-whitespace t)                                   ; Leerzeichen am Zeilenende anzeigen
 '(tool-bar-mode nil nil (tool-bar))                             ; keine Toolbar
 '(transient-mark-mode t)                                        ; sichtbare Markierung von Text
 '(truncate-lines t)                                             ; lange Zeilen nicht umbrechen, sondern abschneiden
 '(visible-bell t)                                               ; nicht piepsen
 '(x-stretch-cursor t)                                           ; Cursor bei Tabulatoren breit machen
)

Tipps und Tricks

Mit der Zeile

(fset 'yes-or-no-p 'y-or-n-p)

lassen sich gelegentlich vollzogene Rückfragen, die eigentlich mit "yes RET" oder "no RET" beantwortet werden müssen, mit einem wesentlich bequemeren "y" oder "n" beantworten, ohne RET.

Als sehr lästig mag man auch das Bestätigen beim Schließen eines Buffers über C-x k empfinden. Man kann dies elegant verhindern, indem man C-x k auf eine andere Funktion legt, die immer den aktuellen Buffer schließt, ohne diese dumme Rückfrage:

(global-set-key (read-kbd-macro "C-x k") 'kill-this-buffer-and-window)

Die Funktion kill-this-buffer-and-window hat folgendes Aussehen:

(defun kill-this-buffer-and-window ()
 "Kill the current buffer and delete the selected window."
 (interactive)
 (let (buffer current-buffer)
  (if (kill-buffer (current-buffer))
   (if (> (count-windows) 1)
    (delete-window (selected-window))))))

Möglicherweise funktioniert im Mini-buffer die Dateinamensvervollständigung nicht auf Anhieb. Wenn man mit C-x C-f eine Datei öffnen will und deren Namen nicht genau kennt, kann man emacs eine Liste von in Frage kommenden Dateien anzeigen lassen. Mit den folgenden zwei Zeilen kann man dies mit der Leertaste auslösen:

(define-key minibuffer-local-filename-completion-map " " 'minibuffer-complete-word)
(define-key minibuffer-local-must-match-filename-map " " 'minibuffer-complete-word)

Die oben in der Tabelle unter "Häufig gemachte Einstellungen" genannten Variablen auto-save-default und make-backup-files auf nil zu setzen, geht manchem vielleicht zu weit. Backups von den gerade geänderten Dateien zu haben, kann manchmal doch ganz angenehm sein, sie stören allerdings, wenn sie im aktuellen Verzeichnis angelegt werden. Mit der folgenden Funktion kann ein benutzerspezifisches Verzeichnis unter /tmp angelegt werden, in das die Dateien und Autosave-Metadaten abgelegt werden.

(defvar user-temporary-file-directory
  (concat temporary-file-directory user-login-name "/"))
(make-directory user-temporary-file-directory t)
(setq backup-by-copying t)
(setq backup-directory-alist
      `(("." . ,user-temporary-file-directory)))
(setq auto-save-list-file-prefix
      (concat user-temporary-file-directory ".auto-saves-"))
(setq auto-save-file-name-transforms
      `((".*" ,user-temporary-file-directory t)))

Es werden nun unter /tmp/<benutzer> Dateien als Backup angelegt, deren Name sehr lang werden kann: Der Pfad wird mitgespeichert, indem die Slashes zu Ausrufungszeichen umgewandelt werden.


Falls man im Emacs als normaler Benutzer eingeloggt ist und eine Datei bearbeiten möchte, die root gehört, so ist dies normalerweise nicht ohne Öffnen einer root-Shell und Start von Emacs aus dieser Shell heraus möglich. Da Emacs recht lange zum Start braucht, ist dies eine unschöne Sache.

Mit folgendem Lisp-Code kann man es aber auch einfacher und flinker haben. Benötigt wird allerdings sudo und ein Eintrag der folgenden Art in der /etc/sudoers:

<user> ALL=(ALL) /bin/bash

(wenn man will auch mit :NOPASSWD, aber das ist nicht empfehlenswert), wobei dort die Loginshell von root einzutragen ist.

Der Lisp-Code ist dann

(defun find-alternative-file-with-sudo ()
  "Open current buffer as root!"
  (interactive)
  (when buffer-file-name
    (find-alternate-file
     (concat "/sudo:root@localhost:"
 	     buffer-file-name))))
(global-set-key (kbd "C-x C-v") 'find-alternative-file-with-sudo)

Man kann natürlich eine andere Tastenkombination als C-x C-v nehmen.


Wer viel mit mehreren Fenstern arbeitet, kann mit Hilfe der Option

(windmove-default-keybindings)

ein einfacheres Durchschalten der Fenster mittels Shift-Cursortaste aktivieren.

Funktionsüberblick

Dateiverwaltung in Emacs

Es gibt mehrere Implementierungen von Dateiverwaltungen unter Emacs (selbst solche mit zwei gegenüberliegenden Seiten). Die bekannteste davon, die auch standardmäßig mit jedem Emacs mitgeliefert wird, ist dired (directory editor). Man startet dired über

M-x dired RET   oder   C-x d

wobei man in letzterem Falle noch das Startverzeichnis bekanntgeben oder RET drücken muß. Dired listet dann augenblicklich in einem eigenen Puffer die Dateien und Verzeichnisse unterhalb des Startverzeichnisses auf, meist so wie "ls -alF" und hoffentlich auch in Farbe. Auf diesen Einträgen kann man eine Vielzahl an üblichen Datei- bzw. Verzeichnisoperationen ausführen. Erwähnt sei die Möglichkeit, auch mehrere Verzeichnisse untereinander in einem dired-buffer darzustellen, was oft sehr praktisch ist.

Shell in Emacs

Es gibt drei Implementierungen für shell-Betriebsarten unter Emacs: shell, term und eshell.

M-x shell RET 

oder

M-X term  

oder

M-x eshell RET 

Man kann nicht sagen, welche besser oder komfortabler sei - sie sind verschieden. Beide Varianten nehmen an einem Prompt gewöhnliche Benutzereingaben entgegen, führen diese aus und stellen die Ausgaben wieder im gleichen Buffer dar. Sie tun dies aber mit sehr verschiedenen Konzepten im Hintergrund, und werden daher bis auf weiteres koexistieren.

shell startet eine Instanz der Standard-shell des Benutzers, meist also bash, mit vorschriftsmäßiger Initialisierung, so daß also beispielsweise auch in .bashrc definierte Aliase gleich funktionieren. Es wird aber kein echtes X-Terminal implementiert, so dass es z.B. nicht möglich ist, aus dieser Shell Programme zu starten, die auf ein solches angewiesen sind. vim oder mc sind solche Programme. Vorteil dieses Vorgehens ist, dass man einen echten Emacs-Buffer hat, auf den alle Emacs-Kommandos prinzipiell anwendbar sind.

term startet ein echtes Terminal, und darin eine Instanz der Standard-Shell des Nutzers.

eshell ist in Lisp programmiert, funktioniert also unabhängig von der verwendeten Standard-Shell des Benutzers immer gleich, auch z.B. unter Windows, und startet nur die eingegebenen Kommandos als externe Prozesse. Eshell kann deshalb auch einfach über Schließen des Puffers (C-x k RET) beendet werden, während man in shell und term explizit exit schreiben oder Ctrl-D drücken muß, um den im Hintergrund laufenden sh-Prozeß zu beenden, und erst dann den Buffer schließen darf. Wer zsh als Standard-Shell benutzt, sollte für eine korrekte Darstellung des Prompts folgende Zeile zu seiner .emacs hinzufügen:

(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

Emacs als Entwicklungsumgebung

Man kann emacs hervorragend als Entwicklungsumgebung benutzen, sofern man unter "entwickeln" Quelltexte editieren, compilieren und debuggen meint. Emacs bietet für fast alle dieser Vorgänge hilfreiche Unterstützungen an, ohne daß man allerdings von echter Integration sprechen könnte. Der Vorteil liegt in der Offenheit in so ziemlich jeder Hinsicht.

Editieren

Emacs lädt verschiedene Modi, sobald er erkennt, daß es sich um eine Quelldatei eines bestimmten Typs handelt, um beispielsweise Syntax-Einfärbung und Einrückung durchzuführen. Welchen Modus emacs erkannt hat, wird in der Modeline angezeigt. So wird bei Dateien mit der Endung .c oder .cc (.cpp, .c++, .cxx, .C, .h, .hpp, .H, ...) automatisch der cc-mode geladen, der C- und C++-Dateien farbig anzeigt. Ähnliches gilt für Java-, Lisp- oder XML- und unzählige andere Dateien.

Das automatische Einrücken ist nicht jedermanns Sache. Es verwirrt auch leicht oder wird lästig, wenn es nicht den eigenen Gewohnheiten entspricht. Man kann es in gewissen Grenzen konfigurieren. Einige Modi bieten die Möglichkeit, es ganz abzuschalten, beispielsweise der cc-mode:

M-x c-syntactic-indentation nil

Browser für Quellcode

Wer niveauvollere Möglichkeiten sucht, in seinen Quelltexten zu navigieren, dem stehen verschiedene Varianten zur Verfügung.

Wer gewohnt ist, mit tags (beispielsweise ctags) zu arbeiten, kann seine tags-Dateien unter emacs benutzen:

M-x tags-search RET   oder   M-x tags-apropos RET

emacs listet daraufhin alle Vorkommen des gesuchten tags in einem eigenen buffer auf, so daß man sie einfach durchlaufen kann.

Etwas anderes ist die Speedbar.

M-x speedbar RET

Dies öffnet ein (normalerweise separates) Fenster, das die aktuelle Quelldatei (oder ein ganzes Verzeichnis) nach bestimmten Regeln parst und quasi ein dynamisches Inhaltsverzeichnis mit den darin gefundenen Klassen und Funktionen anzeigt (screenshot [[6]]). Die Speedbar erfordert überlicherweise keinerlei Konfiguration und zeigt sofort brauchbare Ergebnisse, um sehr schnell zu navigieren. Es gibt mehrere Versuche, die Speedbar in einen buffer des aktuellen Fensters zu integrieren, damit nicht ein separates Fenster auf dem Bildschirm geöffnet wird (siehe [[7]]).

Ein vergleichsweise komplexes Werkzeug ist der Emacs Code Browser (ECB [[8]], screenshot [9]), der separat installiert werden muß:

pacman -S ecb

Nicht vergessen, einen load-path in das Verzeichnis zu setzen, wie es pacman vorschlägt. Dann kann man mit

M-x ecb RET

den ECB öffnen und erhält mehrere kleine Puffer, die Verschiedenes anzeigen. Man muß später noch ein wenig daran konfigurieren. Im Gegensatz zu Speedbar legt ECB Metainformationen in eigenen Dateien ab, weshalb ECB bzgl. der Quelldateien auch dateiübergreifende Informationen liefern und Operationen ausführen kann. ECB geht allerdings auf Kosten der Performance.

Compilieren

Das Compilieren (und Linken und alles, was man noch so darunter versteht) startet man unter emacs mit

M-x compile RET

Dies ruft normalerweise make auf, so daß ein Makefile im aktuellen Verzeichnis existieren sollte. Wer ein anderes Build-Werkzeug verwendet, kann dies konfigurieren. Die Ausgaben dieses Werkzeugs gelangen in den compilation buffer, wo eventuelle Fehler später leicht durchlaufen werden können. In den übrigen Buffern kann man selbstverständlich weitereditieren.

Debuggen

Das Debuggen erfolgt üblicherweise mit gdb, wofür emacs ein eigenes Frontend zur Verfügung stellt, den Grand Unified Debugger (GUD). Man startet ihn mit

M-x gdb RET

wobei nach dem Namen des executables gefragt wird, was man meist mit RET bestätigen kann. Man bekommt zunächst zwei Puffer, in einem läuft gdb mit seinem Prompt, in dem anderen wird die aktuelle Ausführungsposition in einer Quelldatei angezeigt.

GUD beherrscht allerdings noch eine wesentlich komfortablere Darstellungsform mit Toolbar und mehreren kleinen Puffern, wo auch der stack frame, lokale Variablen, Watches usw. dargestellt werden (screenshot [[10]]). Dazu muß man GUD aber explizit konfigurieren: (gdb-many-windows t).

Emacs und (La)TeX

Da sowohl Emacs als auch TeX und LaTeX schon recht alt sind, nimmt es nicht wunder, dass es mehrere Versuche gegeben hat, die beiden Systeme miteinander zu verheiraten. Mitgeliefert mit emacs wird ein tex-mode und ein latex-mode. Weithin durchgesetzt hat sich allerdings das Paket AucTeX [11], da es wesentlich mächtiger und benutzerfreundlicher ist als die ursprünglichen Modi.

AucTeX kann mit

pacman -S auctex

installiert werden.

Die Aktivierung im emacs erfolgt z.B. über Einträge in der Datei ~/.emacs

;; Auctex
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
(setq auto-mode-alist (cons '("\\.tex$"  . LaTeX-mode) auto-mode-alist)
     auto-mode-alist (cons '("\\.dtx$"         . LaTeX-mode) auto-mode-alist))

Dies stellt einen TeX-mode für Plain TeX, einen LaTeX-mode und inzwischen auch einen ConTeXt-mode zur Verfügung, und verknüpft Dateien mit den Endungen .tex bzw .dtx mit diesen Modi (man beachte die andere Schreibweisen). Die alten, emacs-eigenen Modi bleiben aber verfügbar.

AucTeX kann über Menüs bedient und angepasst werden. Diese Menüs wird man für seltener benutzte Dinge auch nutzen wollen, aber für die grundlegenden Dinge muss man sich nur eine Tastenkombination merken: C-c C-c startet einen LaTeX (oder modiabhängig einen TeX-Lauf, wenn es nötig ist; ist es nicht nötig, bietet AucTeX gleich einen Viewer (Standard ist xpdf) an.

Ansonsten gibt es zu AucTeX eine umfangreiche Dokumentation im Info-Format.

Eine Möglichkeit, emacs selbst als Previewer für pdf-Dateien zu benutzen, wurde im englischsprachigen Forum zu Arch Linux aufgezeigt. Er nutzt den doc-view-mode, den emacs 23 erstmals liefert. Es ist damit sogar möglich, eine rudimentäre SyncTeX-Funktionalität (naja, fast) herzustellen.

Zunächst ist folgender Code, sofern noch nicht vorhanden, in die .emacs einzufügen:

(add-hook 'doc-view-mode-hook 'auto-revert-mode)

Dies sorgt dafür, dass Änderungen an pdf-Dateien (z.B. nach einem LaTeX-Lauf) automatisch zu einer Aktualisierung des entsprechenden Buffers führen.

Dann muss man noch über das AucTeX-Menü folgende Anpassung vornehmen:

LaTeX->Customize AUCTeX->(expand)->Tex command->Tex output view style

In dem Annpassungsbuffer nach ^pdf suchen und das dort konfigurierte Kommando ändern zu:

emacs "(find-file \"%o\")"

Mit dvi-Dateien funktioniert dies möglicherweise völlig analog.

News und Mail in emacs

Emacs besitzt standardmäßig mehrere mail-Betriebsarten (mail, mh, rmail) unterschiedlichen Funktionsumfangs, sowie einen universalen mail/news/rss-Client in Lisp (Gnus). Letzterer ist die umfassendste Variante, erfordert aber auch die komplexeste Konfiguration sowie einige Übung im Umgang. Dafür erhält man eines der leistungsfähigsten Programme dieser Art auf der Welt (screenshots [[12]], [[13]]).

M-x mail RET

öffnet einen Puffer, in dem man eine E-Mail-Nachricht schreiben kann. Oben stehen ein paar Headerzeilen, die man ausfüllt, darunter der Text der Nachricht. Mit C-c C-c kann man diese Nachricht dann abschicken, wobei sie dem default-Programm zum Senden vom E-Mail übergeben wird, wahrscheinlich sendmail, möglicherweise aber auch einer GUI-Applikation wie Thunderbird.


(wer kennt sich mit mh und/oder rmail aus? Ein paar Worte bitte ...)


M-x gnus RET

öffnet Gnus. man gelangt in den sog. group buffer, in welchem (ggf. thematisch sortiert) die news groups aufgelistet sind, die der Benutzer abboniert hat. Dort erscheinen auch seine E-Mail-Postfächer sowie RSS-feeds. Jeweils neu eingetroffene Nachrichten werden hinter diesen Gruppen als Anzahl angezeigt und man kann durch RET in den summary buffer wechseln, um die Subjects und Poster der neuen Nachrichten zu sehen. Im summary buffer kann man wiederum RET drücken und gelangt in den article buffer, wo man die ausgewählte Nachricht lesen und auch beantworten kann.

Gnus kann POP3- und IMAP-Postfächer und selbst den Inhalt von Verzeichnissen auf der Festplatte abfragen, ist in der Lage, beim Senden und Empfangen verschiedene Verschlüsselungen anzuwenden und kann bedingt auch HTML rendern oder Artikel "waschen" (insbesondere solche, die von Outlook stammen). Gnus kann auch mit Hilfe des Gnus Agent als Offline-News-Reader eingesetzt werden. Dabei werden die Artikel lokal in einem Verzeichnis(baum) gespeichert. Gnus besitzt ausgeklügelte Filter- und Scoring-Möglichkeiten.

Der Leistungsumfang von Gnus ist so vielfältig, daß ihm ein eigenes Manual gewidmet ist [14]. Es lohnt sich, dieses Manual durchzuarbeiten, um die obligatorische Konfiguration durchführen zu können. Die resultierende Konfigurationsdatei .gnus ist zwar meist überschaubar, allerdings etwas knifflig in der Erstellung. Erschwert wird die Konfiguration dadurch, daß Gnus auf anderen Komponenten (message) aufbaut, die separat konfiguriert werden. Siehe ferner auch hier [15]

WWW in emacs

Ab Version 24.4 liefert Emacs auch einen eigenen Browser namens eww mit, der, wenn emacs unter X läuft, auch Bilder darstellen kann.

Eine sehr interessante Erweiterung für Emacs ist das Lisp-Paket emacs-w3m [[16]], eine Schicht, die es erlaubt, den Textbrowser w3m in Emacs laufen zu lassen, d.h. von Emacs aus vollständig zu bedienen. Man muß dann Emacs nicht mehr verlassen, um mal schnell eine Internetsuche durchzuführen.

emacs-w3m wird nicht mitgeliefert. w3m (der eigentliche Browser) und emacs-w3m können über pacman installiert werden:

pacman -S w3m emacs-w3m

Man muß anschließend den load-path in die .emacs einfügen, damit Emacs das Paket findet. Die grundlegende Aktivierung erfolgt dann so:

(add-to-list 'load-path "/usr/share/emacs/site-lisp/w3m")
(setq browse-url-browser-function 'w3m-browse-url)
(autoload 'w3m-browse-url "w3m" "Ask a WWW browser to show a URL." t)

Optional kann ma noch einen Shortcut definieren:

(global-set-key "\C-xm" 'browse-url-at-point)

Man startet emacs-w3m über

M-x w3m-browse-url RET

Man kann emacs-w3m später konfigurieren, es wird aber auch ohne Konfiguration schon brauchbare Ergebnisse liefern.

Weitere Betriebsarten

  • Für IRC bringt emacs mit erc ein eigenes Modul mit. Für XMPP (Jabber) müssen emacs-jabberAUR oder emacs-jabber-gitAUR nachinstalliert werden.
  • Kalender
  • Todo-Listen
  • Lisp-Interpreter
  • emacs bringt Tetris, Snakes und einen eigenen Psychologen mit, der einem (auf Englisch) tiefschürfende Gegenfragen stellt. Mit emacs-chess-gitAUR kann man emacs auch zu einem Frontend für bekannte Schach-Engines machen.
  • Twitter-Client

Emacs erweitern

Emacs ist offen für Erweiterungen in Lisp. Man kann entweder bestehende Lisp-Dateien und -Pakete hinzufügen oder selbst welche schreiben. Es existieren zahlreiche Verzeichnisse, auf denen man sehr interessante Pakete für die unterschiedlichsten Zwecke findet. Eines der ältesten ist die Emacs Lisp List (ELL [17]), die seit vielen Jahren schon existiert. Viele dieser Erweiterungen sind aber inzwischen schon in Emacs integriert oder als Pakete im AUR zu finden.

Auf Unix-artigen Systemen wird man nicht im globalen Lisp-Verzeichnis Änderungen an pacman vorbei vornehmen wollen oder dürfen. Deshalb ist es ratsam, im home-Verzeichnis des Benutzers ein lokales Lisp-Verzeichnis anzulegen. Dieses ist in der .emacs mit einem load-path zu konfigurieren, damit emacs auch dort nach Lisp-Dateien sucht.

Üblicherweise wird man dieses Verzeichnis ~/.emacs.d nennen.

Es empfiehlt sich, die dort liegenden .el-Dateien in .elc-Dateien zu compilieren, um die Ausführung etwas zu beschleunigen.

Eine andere Möglichkeit ist es, ELPA [18] und/oder MELPA [19] (oder/und Marmalade [20], letzteres kann aber nicht mehr empfohlen werden) zu benutzen. Diese Repos verwenden package.el, einen Paketmanager zum installieren lokaler (im Sinne von User-bezogener, nicht systemweiter) Pakete für Emacs nach dem Vorbild von pip, rubygems et.al.

Als Alternative zu package.el wird straight.el [21] immer populärer.

Dokumentation

Emacs ist self documenting, das heißt, in jedem Belang ausführlich dokumentiert. Diese Dokumentation ist jederzeit im Editor selbst abrufbar. Man startet sie über Strg + H R und gelangt in den Emacs-eigenen Info-Browser.

Den Umgang mit dem Info-System, der im GNU-Projekt allgemein verwendeten, hypertextartigen Alternative zu Man-Pages, muss man etwas üben. Die dazu nötigen Tasten stehen am oberen Rand des Puffers. Merken muss man sich vor allem U (up).

Es gibt auch eine FAQ-Liste, die man über Strg + H Strg + F erreicht.

Für elisp-Programmierer interessant sind außerdem die Funktionen describe-variable und describe-function. Hier kann man Infos zu definierten Variablen bzw. Funktionen bekommen, deren Namen man allerdings ungefähr kennen muss.

Ausblicke

Mit Version 28 wird Emacs, eine beim Kompilieren gesetzte Option vorausgesetzt, die Möglichkeit bieten, den bislang nur als Bytecode kompilierten Elisp-Code (Endung .elc) in nativen Binärcode zu kompilieren (Endung .eln), was erheblich performanter sein wird.

Spätestens in Emacs 29, vermutlich aber auch schon in 28, wird als graphisches Toolkit pgtk (pure-GTK) zur Verfügung stehen. Damit läuft Emacs dann beispielsweise auch als reine Wayland-Applikation also ohne Umweg über xwayland. Im AUR kann gibt es das PKGBUILD emacs-git, das man verwenden kann, um sich einen Emacs zu kompilieren, der diese Features hat. Sie sind schon sehr stabil.

Darüber hinaus gibt es inzwischen einen noch nicht ganz ausgereiften Fork emacs-ng (emacs-new-generation). Hier wurden Teile der in C geschriebenen Funktionalitäten in Rust neu geschrieben, es können über dune Erweiterungen in Javascript oder Typescript (aber natürlich weiterhin auch in Elisp) geschrieben werden, und als Renderer kann Webrender verwendet werden.

Weblinks