freeX: Emacs als Kommandozentrale
|
Emacs als Kommandozentrale
| |
Daß Emacs viel mehr als nur ein Editor ist, kann man schon an der liebevollen Bezeichnung Ëierlegende Wollmilchsau"erkennen. Dieser Artikel bietet daher auch keine herkömmliche Einführung in die Bedienung des Emacs sondern stellt verschiedene Möglichkeiten vor, das Programm zu erweitern, um es noch effizienter bei der täglichen Arbeit einzusetzen. In diesem Artikel werden bewußt viele Beispiele für die Anpassung und Verwendung von GNU Emacs gegeben. Der enthaltene LISP-Code kann direkt in die Konfigurationsdatei übernommen werden. Weitere Anpassungen werde analog dazu durchgeführt.
|
|
1. Emacs oder VI? |
Emacs oder VI?
Es ist ein beliebter Wettstreit zwischen Enthusiasten der zwei Lager, die entweder nur VI(M) oder nur Emacs einsetzen. Doch wozu, sollte man sich fragen? Sollten wir uns wirklich von diesen zwei sich gegenseitig kategorisch ablehnenden Lagern beeinflussen lassen? Sollte nicht stattdessen das Programm für die Aufgabe verwendet werden, für das es nach unseren eigenen Maßstäben am besten geeignet ist?
Für viele Leute ist ein kleiner, schneller, einfacher und leistungsstarker Editor für das Tagesgeschäft, sozusagen für die kleinen Dateien zwischendurch, der Editor der Wahl. Das könnte z.B. ein »vi« sein. Damit werden einzelne Dateien geschrieben, Inhalte modifiziert, Mails beantwortet etc. Für größere Aufgaben, die z.B. umfangreiches hin- und herkopieren aus mehreren Dateien erfordern, aufwendiges Neuformatieren, Programmieren und anderes könnte ein dafür gut geeignetes Programm eingesetzt werden: z.B. ein Emacs.
Tutorial – Einführung
Im folgenden wird davon ausgegangen, daß Sie bereits die wichtigsten Funktionen vom Emacs kennen und das Programm hinreichend bedienen können. Eine Einführung in die Basis-Funktionen wird daher nicht gegeben. Sie können jedoch zu jeder Zeit mit »Strg-h t« (bzw. in Emacs-Schreibweise »C-h t«, die im folgenden ausschließlich verwendet wird) das eingebaute Tutorial starten und erhalten eine geführte Tour durch die wichtigsten Editor-Funktionen.
In Tabelle 1 werden die Konventionen beschrieben, wie Tastendrücke in der Dokumentation von Emacs bezeichnet werden.
| »s« | Die Taste »s« wird gedrückt |
| »S« | Die Taste »s« wird zusammen mit der Shift-Taste gedrückt. In Verbindung mit Modifizierern kann es erforderlich sein, daneben die Alt- oder Control-Taste zu drücken |
| »C-s« | Die Control- bzw. Steuerungs-Taste wird gleichzeitig mit der Taste »s« gedrückt |
| »M-x« | Meta-X. Die Meta-Taste (bzw. »ESC«) wird gedrückt und anschließend die Taste »x«. Das ist jedoch relativ umständlich und da die Alt-Taste auf einer PC-Tastatur meist unbenutzt ist, kann stattdessen auch die Taste »x« bei gedrückter Alt-Taste verwendet werden. Diese Art wird auch meistens verwendet, solange die Alt-Taste mit der Meta-Funktion zur Verfügung steht |
| Tabelle 1: Tastaturkürzel und deren Bedeutung | |
Es ist erstaunlich, wie oft man eine Möglichkeit gebrauchen kann, ein Rechteck in eine Datei einzufügen oder auszuschneiden. Wie oft muß man in mehreren Zeilen die ersten drei Zeichen löschen oder vor jede Zeile z.B. »printf ("« einfügen? Bevor man weiß, daß es dafür eine sehr einfache Möglichkeit gibt, fällt es einem jedoch meistens nicht auf, wie oft man so eine tatsächlich Funktion benötigt.
Emacs stellt eine Klasse von Funktionen für die Arbeit mit rechteckigen Blöcken zur Verfügung. Sie werden mit dem Tasten-Präfix »C-x r« eingeleitet. Die meisten Funktionen benötigen ein Rechteck, auf dem sie arbeiten (z.B. Zeichen austauschen oder löschen). Dazu wird mit »C-Space« eine Ecke des Rechtecks markiert (bzw. mit »C-@«, was sich auf einer deutchen Tastatur allerdings nur recht umständlich eingeben läßt). Anschließend wird der Cursor an der gegenüberliegenden Ecke positioniert und dort der Befehl aufgerufen. Das Rechteck wird dabei von der Markierung bis zur aktuellen Cursorposition aufgespannt.
Auf diese Weise wird z.B. mit »C-x r k« ein Rechteck aus dem Puffer ausgeschnitten und in einem internen Puffer gespeichert. Aus diesem Puffer, der übrigens nicht dem normalen Yank-Puffer entspricht, kann das ausgeschnittene Rechteck jederzeit an anderer Stelle wieder eingefügt werden. Dazu wird der Cursor in der linken oberen Ecke positioniert und »C-x r y« gedrückt. Das Rechteck wird nun an der Stelle eingefügt und erstreckt sich nach unten und rechts, so daß die Spalten in den nächsten Zeilen teilweise nach rechts rausgeschoben werden.
Für den Fall, daß ein Rechteck aus dem aktuellen Puffer gelöscht werden soll, ohne daß dessen Inhalt in den Yank-Puffer übernommen werden soll, steht die Tastenkombination »C-x r d« zur Verfügung. Eine weitere Besonderheit unter den Rechteckoperationen stellt die Tastenkombination »C-x r c« dar, die dafür sorgt, daß der Bereich, den das ausgewählte Rechteck eingenommen hat, durch Leerzeichen ersetzt wird.
| »C-x r c« | Rechteck freimachen (clear) |
| »C-x r k« | Rechteck ausschneiden (kill) |
| »C-x r d« | Rechteck löschen (delete) |
| »C-x r y« | Ausgeschnittenes Rechteck einfügen (yank) |
| »C-x r t« | Rechteck mit zusätzlichen Zeichen einfügen oder ersetzen |
| »C-x r o« | Leeres Rechteck einfügen (open) |
| Tabelle 2: Die wichtigsten Rechteckfunktionen von Emacs | |
Der wahrscheinlich häufigste Befehl aus dieser Klasse wird jedoch »C-x r t« sein, mit dem eine Zeichenkette en bloc eingefügt wird. Dabei wird das zuvor aufgespannte Rechteck durch die angegebene Zeichenkette überschrieben, und zwar in jeder Zeile. Eine Spezialform liegt dann vor, wenn ein Rechteck mit der Breite 0 aufgespannt wird, wenn also eine Ecke markiert wird und anschließend nur die Zeile geändert wird, nicht aber die Spaltenposition. Dann wird nämlich die angegebene Zeichenkette in jeder Zeile an der entsprechenden Position eingefügt, ohne daß dafür Zeichen im Puffer gelöscht werden.
So werden zum Beispiel in einer Mail alle Zitatzeichen (»>«) in einem Abschnitt am Zeilenanfang gelöscht oder aus einer einfachen Liste wird in Windeseile eine HTML-Liste, in der jeder Punkt mit einem Tag »<li>« beginnt.
Emacs mit Menü
Wer den aktuellen GNU Emacs unter X11 startet, wird am oberen Rand des Fensters ein Menü vorfinden, das mit der Maus bedient wird. Wer das Programm auf einer Textconsole oder in einem X-Terminal mit dem Parameter »-nw« startet, findet das Menü ebenfalls. Wer mit Emacs auf der einer Textconsole arbeitet, wird jedoch mit großer Wahrscheinlichkeit kein Menü benutzen wollen und sich über die verschwendete Zeile ärgern.
Nichts läßt sich leichter ändern als dieses. Mit der Funktion »menu-bar-mode« wird das Menü ein- und ausgeschaltet. Um die Funktion ausführen zu können, sollte man wissen, daß man mit der Tastenkombination M-x im interaktiven Modus (dem normalen Bedienungsmodus) Emacs-Funktionen aufrufen kann. Mit
M-x menu-bar-mode
wird somit die Menüzeile ein- bzw. ausgeschaltet. Wer sie dauerhaft ausschalten möchte (da sie per Voreinstellung eingeschaltet ist, was unter X11 durchaus auch sinnvoll sein kann), schreibt den Funktionsaufruf einfach in seine »~/.emacs«-Datei, allerdings als Funktionsaufruf in LISP:
(menu-bar-mode nil)
Hier wird als Argument noch eine leere Liste übergeben, da die Funktion eigentlich Flags als Parameter erwartet. Wer unter X11 jedoch das Menü zur Verfügung haben, aber auf einer Textconsole die Zeile nicht verschwenden möchte, der muß etwas tiefer in die Programmierung einsteigen. In diesem speziellen Fall muß der Aufruf der Funktion davon abhängig gemacht werden, ob Emacs unter X11 läuft oder nicht.
Das läßt sich jedoch sehr einfach bewerkstelligen, denn in der Variable »window-system« wird festgehalten, unter welchem Window-System Emacs zur Zeit läuft, das kann z.B. »x« sein. Somit muß nur noch überprüft werden, ob die Variable einen anderen Wert als »x« gespeichert hat. Falls das der Fall ist, wird die Menüzeile abgeschaltet, sonst nicht. Das erledigt das folgende LISP-Fragment:
(if (not (eq window-system 'x))
(menu-bar-mode nil))
Die Zeit immer im Blick
Wer lange Zeit am Rechner arbeitet, viel schreibt oder programmiert, verliert nicht selten das Gefühl für die Zeit und wunder sich am Schluß, daß es plötzlich draußen so dunkel ist...
Wer unter X11 arbeitet, kann sich in der Taskbar eine Uhr einblenden oder irgendwo auf dem Desktop eine »xclock« oder ähnliches plazieren. Wer mit dem Emacs auf einer Textconsole arbeitet, kann jedoch nicht so einfach ein weiteres Programm auf dem Bildschirm plazieren.
Das ist auch gar nicht nötig, denn es gibt auch eine permanente Uhr für den Emacs, die mit dem Befehl »display-time« in der Statuszeile eingeblendet wird. Daneben wird zudem die aktuelle Auslastung des Rechners angezeigt. Auf Wunsch kann die Uhr zusätzlich das Datum und den Wochentag anzeigen. Dazu muß zusätzlich die Variable »display-time-day-and-date« auf etwas anderes als »nil« gesetzt werden, was z.B. der folgende Code übernimmt.
(setq display-time-day-and-date 't)
Den Batteriezustand im Blick
Es ist zwar nur für Laptop-Benutzer relevant, doch ist die Information für sie von extrem hoher Wichtigkeit: Wieviel Strom kann der Akko noch liefern? Benutzer von X11 würden sich wieder ein Applet in die Taskbar legen oder »xapm« bzw. »xbatt« starten und auf den Desktop legen.
Emacs-Benutzer auf der Textconsole eines Notebooks müssen weder auf diese Information nicht verzichten noch dauernd »/proc/apm« pollen. Auch Emacs bietet so etwas wie ein Applet an: Mit der Funktion »display-battery« wird der aktuelle Ladezustand des Akkus in der Statuszeile angezeigt.
Komprimierte Dateien
Je länger man mit einem System arbeitet, desto größer wird die Wahrscheinlichkeit, daß sich komprimierte Textdatien auf der Festplatte befinden, um Platz zu sparen. Hin und wieder müssen diese allerdings auch bearbeitet werden oder es muß etwas hinzugefügt werden. Bisher sah das dann wie folgt aus:
gunzip datei.txt.gz vi datei.txt gzip -9 datei.txt
Wie umständlich!
Drei Befehle müssen eingegeben werden, nur um eine einzige Datei zu bearbeiten. Zudem muß man noch aufpassen, wie die Datei komprimiert wurde, vielleicht wurde ja auch »bzip2« verwendet. Und nach dem Bearbeiten muß man sich noch daran erinnern, auf welche Weise die Datei vorher komprimiert war, um die gleiche Komprimierung zu verwenden.
Das muß doch auch einfacher möglich sein. Ist es auch. Emacs kann die Dateien doch auch selbst auspacken und beim Speichern erneut komprimieren. Wenn das Paket Crypt++ installiert und geladen ist, kann Emacs Dateien automatisch ver- und entschlüsseln sowie auspacken und komprimieren. Um das Paket bei jedem Start von Emacs zu laden, wird folgender Befehl in die ».emacs«-Datei aufgenommen:
(require 'crypt++)
Dabei hängt sich das Paket selbständig mit einigen Routinen in die Funktionen zum Öffnen und Speichern von Dateien ein, so daß selbständig erkannt wird, ob eine Datei beim Öffnen entschlüsselt oder ausgepackt und beim Speichern wieder verschlüsselt oder komprimiert werden muß.
Major und Minor Modi
Emacs unterstützt für jeden Puffer das Konzept der verschiedenen Modi. Jedem Puffer ist dabei ein Hauptmodus (Major Mode) und eine beliebige Anzahl Nebenmodi (Minor Mode) zugeordnet. Diese Modi legen das Verhalten im Puffer fest. Damit verbunden sind Tastenkombinationen, automatisch eingefügter Text im HTML-Mode, Variablen-Lookup mit Tab-Erweiterung im Makefile-Mode oder sinnvolles Einrücken im C++-Mode, sowie aufblinkende öffnende Klammern, wenn die zugehörige schließende Klammer eingegeben wird..
Das Verhalten kann natürlich anschließend wieder geändert werden. Die Modi sind auch nichts weiter als LISP-Erweiterungen, die für den jeweiligen Puffer aktiviert sind. Diese können erweitert, ersetzt oder in Teilen deaktiviert werden. Zusätzlich zu den Hauptmodi können weitere Nebenmodi geladen werden, die das Verhalten im Puffer weiter beeinflussen.
Darüberhinaus können beim Starten eines Modus' teilweise weitere Funktionen eingehängt werden. Diese Technik, "Haken" (englisch Hook) zur Verfügung zu stellen, findet man an vielen Stellen im Emacs und im zusätzlichen Code. So kann einem viel Programmierarbeit erspart werden.
Auf diese Weise kann man z.B. für den Text-Modus festlegen, daß er beim Start das automatische Umbrechen des Textes am rechten Rand aktivieren soll. So kann man konzentriert einen langen Text schreiben und Emacs bricht ihn selbständig um. Man muß sich nicht jedesmal selbst darum kümmern. Fügt man später Text ein oder wird später Text gelöscht, dann sieht der Absatz natürlich nicht mehr so toll aus. Das stellt jedoch auch kein Problem dar, denn mit der Funktion »fill-paragraph«, die im Text-Modus an die Tastenkombination »M-q« gebunden ist, wird der Absatz einfach neu formatiert.
Um nun einzuschalten, daß im Text-Modus Zeilen beim Schreiben automatisch umgebrochen werden, wenn sie rechts über den Rand herausragen, hilft folgender LISP-Code, der in die Datei ».emacs« eingefügt wird:
(setq text-mode-hook 'turn-on-auto-fill)
Tabulatoren abschalten
Bei strukturierten Texten, die von Dritten weiterbearbeitet werden (z.B. wenn auf eine Mail geantwortet wird, oder wenn mit Texte mit Satzsystemen nachbearbeitet werden), ist es oft unerwünscht, daß bis zu 8 Leerzeichen zu einem Tabulatorzeichen zusammengefaßt werden, da diese bei der Weiterverarbeitung stören und das Layout durcheinanderbringen.
Gesteuert wird dieses Verhalten von der Variablen »indent-tabs-mode«. Wenn sie auf »t« (was soviel wie »true« bedeutet) gesetzt ist, werden beim (automatischen) Einrücken bis zu 8 Leerzeichen in Tabulatorzeichen konvertiert. Wenn dieses nicht gewünscht wird, muß die Variable auf »nil« gesetzt werden, was in LISP soviel wie »false« bedeutet. Das geschieht mit dem folgenden Code-Fragment:
(setq indent-tabs-mode nil)
Man muß dabei allerdings beachten, daß das Setzen dieser Variable nur lokal zum aktuellen Puffer stattfindet. Dieser Code muß daher im aktuellen Puffer ausgeführt werden. Wie das erreicht wird, steht im nächsten Abschnitt.
LISP-Code ausführen
Wenn man sich etwas mehr mit Emacs beschäftigt, wird man bald feststellen, daß es hilfreich ist, wenn man sich wenigstens rudimentäre Kenntnisse zu LISP aneignet. Der große Vorteil von Emacs liegt in LISP, denn eigentlich ist es gar kein Editor, sondern ein LISP-Interpreter, der meistens zum Bearbeiten von Texten verwendet wird, weil sich der einfache Editor so schön leicht erweitern läßt.
Das bereits erwähnte Paket Crypt++ besteht zum Beispiel aus LISP-Code, der sich in die bisherige I/O-Struktur vom Emacs einhängt. Für jede etwas komplexere Konfigurationsänderung (wie z.B. die oben erwähnten) Emacs zu beenden und neu zu starten zu müssen, nur um die Datei ».emacs« wieder neu einzulesen, ist jedoch umständlich.
So muß es auch nicht sein. Zum einen lassen sich einfache Dinge, wie das Aufrufen einer einzigen Funktion, über die Kommando-Schnittstelle »M-x« auch im laufenden Betrieb erledigen. Zum anderen kann Emacs natürlich auch zur Laufzeit LISP-Code ausführen und zum Pool hinzufügen. Im Prinzip ist es dabei auch egal, wo der Code steht, ob in einer Datei, in einem Puffer oder ob der LISP-Code irgendwo im aktuellen Puffer eingestreut ist.
Wenn eine LISP-Datei zusätzlich geladen werden soll, die mit »require« aus der Start-Datei geladen werden würde, hilft, die Funktion »load-library« (also »M-x load-library« mit anschließender Angabe des Bibliotheksnamens). Wenn die LISP-Datei bereits geladen ist und sich im aktuellen Puffer befindet, wird der gesamte Puffer in einem Rutsch mit der Funktion »eval-buffer« ausgeführt.
Wenn sich der LISP-Code mitten im aktuellen Puffer befindet, versteckt im Text, zwischen ASCII-Grafiken oder anderem Programmcode, gibt es zwei einfache Möglichkeiten, Emacs zum ausführen zu bewegen. Zum einen kann man vor oder hinter dem Code mit »C-Space« eine Markierung setzen, den Cursor am anderen Ende plazieren und die Funktion »eval-region« aufrufen. Damit wird der gesamte markierte Bereich ausgeführt.
Wenn es sich um einen einzigen Funktionsaufruf handelt (der z.B. auch eine mathematische Berechnung darstellen kann wie »(* 6 7)« oder eine einzige Funktion definiert wird), dann reicht es aus, den Cursor hinter der letzten schließenden Klammer zu plazieren und die beiden Tasten »C-x C-e« zu drücken. Falls dabei ein Ergebnis berechnet wird, stellt Emacs dieses im Zeilenpuffer in der untersten Bildschirmzeile dar.
Auf diese Weise erhält man nebenbei einen kleinen Taschenrechner mit Präfix-Notation und muß für einfache Berechnungen nicht mehr auf externe Werkzeuge zurückgreifen.
Umlaute und Sonderzeichen
Wer mit einer amerikanischen Tastatur oder Tastaturbelegung arbeitet, weil sie zum Programmieren einfach die bessere Belegung und damit einfacheren Umgang bietet, oder wer zusätzliche Sonderzeichen eingeben möchte, wäre normalerweise aufgeschmissen. Auf einer US-Tastatur sind z.B. geschweifte und eckige Klammern sowie der Backslash ohne Knoten in der Hand erreichbar, was sie für das Programmieren mit C, Perl und ähnlichen Sprachen angenehmer macht als die Deutsche Tastaturbelegung.
Doch auch für diesen Fall ist beim Emacs vorgesorgt. Mit einem Nebenmodus, der zu jedem Hauptmodus geschaltet werden kann, werden Umlaute und viele Sonderzeichen ohne Probleme eingegeben. Für diesen Fall ist der »iso-accents-mode« (Dateiname »iso-acc.el«) vorgesehen. Eine vollständige Liste der unterstützten Sonderzeichen und Kodierungen befindet sich im Quellcode. Die wichtigsten sind jedoch in der nebenstehenden Tabelle aufgeführt.
| "s | ß |
| /a | å |
| ~a | ã |
| "a | ä |
| /e | æ |
| /A | Å |
| "A | Ä |
| "u | ü |
| "U | Ü |
| /o | ø |
| "o | ö |
| "O | Ö |
| "e | ë |
| "i | ï |
| "y | ÿ |
| "<space> | " |
| // | ° |
| /<space> | / |
| Tabelle 3: Kodierung von einigen Umlauten im »iso-accents-mode« | |
Eines sollte man beachten, bevor man diesen Modus dauerhaft einsetzt. Wenn er aktiv ist und mit der Maus wird eine größere Menge Text eingefügt, stehen die Chancen gut, daß der Text nicht sauber eingefügt wird. Das liegt in der Natur dieses Modus, denn verschiedene Zeichen werden zu Trigger-Zeichen, die Sonderzeichen einleiten (einfache und doppelte Hochhaken, Tilde, Caret und der Schrägstrich). Wenn diese im Text vorkommen und mit dem darauf folgenden Zeichen zufällig ein Sonderzeichen ergeben, wird das Sonderzeichen übernommen und nicht wie vielleicht erwartet die Zeichenkette aus beiden einzelnen Zeichen.
Passenden Modus aktivieren
Wenn es nicht anders eingerichtet ist, aktiviert Emacs für jede neue Datei den Modus »fundamental-mode«, in der Statuszeile steht daher »Fundamental«. Bei Textdateien soll oftmals jedoch stattdessen gleich der Text-Modus aktiviert werden, damit man nicht andauernd »M-x text-mode« eingeben muß. Wer öfter programmiert, wird sich auch über Unterstützung dabei freuen, allerdings sehen Perl-Programme anders aus als C-Programme und die sind wiederum anders aufgebaut als Tcl-Programme. Unterschiedliche Modi sind die Folge.
Es wäre doch schön, wenn Emacs gleich den passenden Modus laden würde. Meistens kann man am Dateinamen ja schon erkennen, um welchen Inhalt es sich bei einer Datei handelt. Nichts leichter als das, sagt sich der erfahrene Emacs-Anwender. Beim Öffnen einer Datei vergleicht Emacs den Dateinamen nämlich tatsächlich mit einer Liste und startet den dort eingetragenen Hauptmodus, falls es eine Übereinstimmung zwischen Dateiname und Muster gibt. Die Liste hängt an der Variablen »auto-mode-alist« und besteht im Prinzip aus Paaren (Dateiname, Hauptmodus).
Das folgende Beispiel legt einige dieser Paare fest. Die Angabe des Musters für Dateinamen erfolgt dabei als regulärer Ausdruck, wobei spezielle Zeichen für reguläre Ausdrücke mit einem doppelten Backslash geschützt werden müssen. Dabei wird allerdings nicht nur auf die Dateiendung geschaut sondern in drei Fällen sogar der vollständige Name angegeben sowie einmal nur der Anfang des Namens.
(setq auto-mode-alist
(mapcar 'purecopy
'(
("\\.c$" . c-mode)
("\\.h$" . c-mode)
("\\.tcl$" . tcl-mode)
("changelog$" . debian-changelog-mode)
("rules$" . makefile-mode)
("Makefile$" . makefile-mode)
("ChangeLog$" . change-log-mode)
("\\.wml$" . indented-text-mode)
("\\.txt$" . indented-text-mode)
("mutt-*" . indented-text-mode)
("\\.vhd$" . vhdl-mode)
("\\.vhdl$" . vhdl-mode)
("\\.php$" . php-mode)
("\\.pl$" . perl-mode)
)))
Je mehr unterschiedliche Dateitypen man mit dem Emacs bearbeitet und je fauler man ist, desto länger wird die Liste natürlich.
Tastaturbindungen justieren
Wenn die voreingestellten Tastaturbindungen nicht gefallen oder wenn sie für die persönliche Arbeit nicht ausreichen, müssen sie geändert werden. Wie man bereits erwarten kann, läßt sich das relativ leicht mit dem Emacs bewerkstelligen. Für die Arbeit mit Tastaturbelegungen verwaltet Emacs verschiedene Tabellen (genannt »map«). Prinzipiell kann jeder Modus eine eigene Tabelle mit Tastaturbelegungen installieren, die für die dort definierten Tastenkombinationen anstelle der globalen Tabelle in diesem Modus verwendet wird.
Die allgemeine Tabelle heißt »global-map«, die von den Text-Modi verwendete »text-mode-map«. Wenn man zusätzliche Tasten definieren möchte, sind dieses die wichtigsten Tabellen. Wenn eine Tastenkombination in einem Modus nicht umdefiniert wird, reicht es jedoch aus, sie in der »global-map« zu definieren. Sie gilt automatisch auch in der Tabelle des speziellen Modus', solange die Kombination dort nicht definiert ist.
Zum Hinzufügen von Bindungen steht die Funktion »define-key« zur Verfügung, die drei Parameter benötigt: die Tastaturtabelle, die Tastenkombination und den Namen der mit diesen Tasten zu verbindenden Funktion.
Mal angenommen, die Funktion, eine Zeile zu zentrieren, »center-line«, die normalerweise an »M-s« gebunden ist, wird nur selten benötigt und stattdessen soll es vereinfacht werden, den aktuellen Puffer zu speichern. Dazu wird zuerst global die Funktion »save-buffer« an die Tastenkombination »M-s« gebunden:
(define-key global-map "\M-s" 'save-buffer)
Wenn jetzt ein Text-Modus verwendet wird, wird man jedoch feststellen, daß die aktuelle Zeile weiterhin zentriert wird. Offenbar wurde diese Tastenkombination auch in der »text-mode-map« definiert und muß daher auch dort geändert werden. Daher wird die folgende Zeile ebenfalls in die Datei ».emacs« aufgenommen.
(define-key text-mode-map "\M-s" 'save-buffer)
Akzente setzen
Weiter oben wurde bereits der »iso-accents-mode« vorgestellt. Wenn mit der Maus Text eingefügt werden soll, z.B. URLs, dann muß dieser Modus vor dem Einfügen ausgeschaltet und anschließend wieder eingeschaltet werden. Dafür jedesmal »M-x iso-accents-mode« zu tippen, ist natürlich viel zu umständlich. Wieso legt man sich diesen Umschalter nicht auf eine Taste? Die Tastenkombination »M-i« ist in vielen Modi noch nicht belegt und läßt sich als »Alt-i« auch ganz gut tippen. Sie bietet sich daher für diese Funktion an. Um sie mit dem Schalter für diesen Minor Mode zu belegen, wird die folgende Zeile aufgenommen.
(define-key global-map "\M-i" 'iso-accents-mode)
Ähnlich sieht es mit mit dem Modus zum Überschreiben von Text aus. Der Schalter ist normalerweise an keine Tastenkombination gebunden, die Funktion zum Umschalten könnte man jedoch relativ häufig gebrauchen. Eigentlich unpraktisch so etwas.
Das Umschalten übernimmt die Funktion »overwrite-mode«, die sich zudem in der Statuszeile verewigt, wenn Überschreiben aktiviert ist. Eine meistens noch freie Tastenkombination ist »M-o«, daher soll sie mit dieser Funktion belegt werden, wie die folgende Zeile verdeutlicht.
(define-key global-map "\M-o" 'overwrite-mode)
Modus justieren
Emacs bietet nicht nur die Möglichkeit die zu verwendenden Modi anhand der Dateiendung zu bestimmen. Ans Ende jeder Datei können Anweisungen für Emacs geschrieben werden, die Emacs interpretiert und anhand dessen die Modi justiert. Da es sich bei den Dateien oftmals um den Quellcode von Programmen handelt, bei dem nicht einfach Text hinzugefügt werden kann, ohne Fehler beim Compilieren zu verursachen, dürfen die Zeilen ein Präfix tragen und müssen auch nicht in der allerletzten Zeile der Datei enden.
Eingeleitet wird dieser Bereich durch »Local variables:« und beendet mit »End:«. Die Doppelpunkte sind wichtig. Alles, was zwischen diesen beiden Bezeichnern steht, wird vom Emacs interpretiert und zur Konfiguration des jeweiligen Puffers verwendet.
Meistens werden in diesem Bereich nur die Haupt- und Neben-Modi aufgelistet, die für diesen Puffer aktiviert werden sollen. Am Ende des Manuskripts für diesen Artikel steht daher z.B. folgendes:
Local variables: mode: indented-text mode: iso-accents End:
Es werden also zwei Modi geladen, dabei ist »indented-text-mode« der Major Mode, und »iso-accents-mode« lediglich ein Minor Mode. Zusätzlich wird jedoch noch der »auto-fill-mode« verwendet, damit Zeilen automatisch umgebrochen werden, doch wird dieser Modus automatisch per Hook aktiviert, wenn ein »text-mode« aktiviert wird.
Emacs erlaubt es auch, in diesem Bereich Variablen mit Werten zu belegen und so den Modus zu tunen. Für C-Dateien, für die automatisch bereits der »c-mode« geladen wird, bietet es sich an, hier verschiedene Formatierungen oder zusätzliche Informationen festzulegen. Im Linux-Kernel findet man z.B. des öfteren folgenden Anhang:
/*
* Local variables:
* version-control: t
* kept-new-versions: 5
* c-indent-level: 4
* End:
*/
Tabulatoren justieren
Wenn keine Tabulatoren im Text gewünscht werden (siehe oben), wird die Variable »indent-tabs-mode« auf »nil« gesetzt. In diesem Fall schreibt man einfach die folgende Zeile hinzu:
indent-tabs-mode: nil
Wer mit der voreingestellten Tabulatorbreite von 8 Zeichen nicht einverstanden ist, kann sie problemlos z.B. auf 4 reduzieren. In diesem Fall wird die folgende Zeile in den Anhang aufgenommen:
tab-width: 4
Zeilen sortieren
Wer längere Dokumente mit Emacs verfaßt und der Text z.B. Namens- oder Stücklisten enthält, möchte diese vielleicht auch alphabetisch sortieren. Normalerweise würde man in einem solchen Fall beigehen und die Zeilen manuell sortieren, was natürlich relativ aufwendig ist. Eine Alternative dazu besteht darin, die Liste in einer Datei zu speichern, mit dem Unix-Befehl »sort« zu sortieren und wieder in das Dokument einzufügen.
Daß es auch viel einfacher möglich ist, beweist Emacs. Hier muß lediglich eine Markierung am Anfang der ersten Zeile oder nach der letzten Zeile gesetzt und an das andere Ende gesprungen werden. Anschließend sorgt der Befehl »sort-lines« dafür, daß die Zeilen alphabetisch sortiert werden.
ASCII-Art erstellen
In den normalen Modi ist es relativ umständlich, Textgrafiken zu erstellen, denn wenn man einen senkrechten Strich in Spalte 50 ziehen möchte, muß man in jeder neuen Zeile erst 49 Leerzeichen schreiben, um überhaupt wieder in Spalte 50 zu gelangen. Zudem muß man aufpassen, daß keine Tabulatorzeichen eingefügt werden.
Das kann man jedoch auch einfacher haben. Im speziellen »picture-mode« werden automatisch soviele Leerzeichen oder Tabulatorzeichen eingefügt, um an die gewünschte Position zu gelangen. Da der Modus letztendlich auch wieder Tabulatorzeichen verwendet, muß die Variable »indent-tabs-mode« ggf. rechtzeitig auf den passenden Wert gesetzt werden.
Dieser Modus wartet aber noch mit zwei weiteren Besonderheiten auf. Zum einen befindet man sich standardmäßig in einem Überschreib-Modus, damit man leichter Grafiken zeichnen kann. Zum anderen kann man in diesem Modus festlegen, wohin der Cursor nach dem Schreiben eines Zeichens bewegt wird.
Normalerweise wird der Cursor nach Schreiben eines Zeichens um ein Zeichen nach rechts bewegt. Wenn man jedoch eine Linie nach schräg links unten ziehen möchte, ist dieses Vorgehen ein wenig unpraktisch. Das wird mit einer Richtungsänderung abgefangen. In diesem Fall würde man vor dem ersten Zeichen »C-c /« eingeben, wodurch die Richtung auf links unten bzw. »south-west« geändert wird, was in der Statuszeile durch das Anhängsel »:sw« angedeutet wird. Die wichtigsten Richtungen und zugehörigen Tastenkombinationen sind in der nebenstehenden Tabelle zusammengefaßt.
| »C-c <« | Nach Einfügen ein Zeichen nach links gehen |
| »C-c>« | Nach Einfügen ein Zeichen nach rechts gehen |
| »C-c ^« | Nach Einfügen ein Zeichen nach oben gehen |
| »C-c .« | Nach Einfügen ein Zeichen nach unten gehen |
| »C-c `« | Nach Einfügen ein Zeichen nach links oben gehen (»north-west« bzw. »nw«) |
| »C-c '« | Nach Einfügen ein Zeichen nach rechts oben gehen (»north-east« bzw. »ne«) |
| »C-c /« | Nach Einfügen ein Zeichen nach links unten gehen (»south-west« bzw. »sw«) |
| »C-c « | Nach Einfügen ein Zeichen nach rechts unten gehen (»south-east« bzw. »se«) |
| Tabelle 4: Die Cursor-Steuerung im »picture-mode« | |
Mal eben einen Befehl aufrufen...
Das bedeutet normalerweise, die Konsole zu wechseln oder ein neues X-Terminal zu öffnen und den Befehl in einer Shell einzutippen. Dabei kann es viel einfacher sein. Wie wäre es denn, wenn man einfach nur »M-x shell« eingeben müßte, ohne das Programm beenden zu müssen, und gleich den Shell-Befehl eingeben könnte?
Wer dieses ausprobiert, wird erstaunt sein, da es tatsächlich funktioniert. Diese Shell beinhaltet sogar das von der Bash bekannte Command- und File-Completion, das automatische Ergänzen von Befehlen und Dateinamen mit der Tabulator-Taste. Darüberhinaus hat man quasi einen unendlich großen Scroll-Puffer, da es sich beim Shell-Puffer selbst wieder um einen Emacs-Puffer handelt.
Aus dem gleichen Grund läßt sich der Inhalt bzw. die Ausgabe eines dort aufgerufenen Programms problemlos in einen anderen Puffer übernehmen und weiterverarbeiten. Beendet bzw. geschlossen wird dieser Puffer wie sonst auch: mit »C-x k«
Dateien suchen und finden
Ähnlich einfach gestaltet sich die Suche nach Dateien im Dateisystem, wenn die Festplatten regelmäßig durchsucht werden. Das Programm »updatedb« läuft normalerweise einmal pro Nacht und sucht die gesamte Festplatte nach Dateien und Verzeichnissen ab. Diese werden anschließend in einer Datenbank gespeichert, so daß eine Suche später nur noch auf dieser Datei stattfinden muß und nicht mehr auf allen Festplatten.
Auf Shell-Ebene ruft man zum Suchen das Programm »locate« mit einem Teil des gesuchten Dateinamens auf. Im Emacs ruft man die Funktion »locate« auf und wird nach dem zu suchenden Begriff gefragt. Es funktioniert also genauso einfach.
Mails mit Emacs
Wer viel arbeitet und sich mit anderen Personen austauschen möchte oder muß, wird meistens über E-Mail mit anderen kommmunizieren. Normalerweise wird dafür ein externes Programm verwendet, das eingehende Mails aufbereitet und die eigenen verschickt. Wer mag, kann das jedoch auch mit Emacs erledigen. Es stehen (mindestens) zwei Systene zur Verfügung: rmail und Gnus. Gnus ist ein eigenes Paket und komfortabler als rmail. Auf beide wird allerdings aus Platzgründen hier nicht näher eingegangen.
Wer allerdings Teile seiner Dateien auch per Mail verschicken und dabei nicht dauernd zwischen Emacs und Mail-Programm hin- und herschalten möchte, für den bietet Emacs noch ein Bonbon. Mit einem einfachen Hauptmodus kann eine Mail verschickt werden.
Aktiviert wird der Modus mit »C-x m«. Man gelangt so in einen neuen Puffer, in dem in den ersten beiden Zeilen der Empfänger und der Betreff der Mail eingetragen werden. Nach einer Trennzeile folgt der Inhalt der Mail. Dort kann mit beliebigen Befehlen Inhalt kopiert werden. Ist alles vorhanden, wird die Mail mit »C-c C-c« abgeschickt.
| »C-c C-c« | Mail verschicken, zum alten Puffer zurückspringen |
| »C-c C-s« | Mail verschicken, Puffer aktiv belassen |
| »C-c C-f C-t« | Zum To:-Feld springen |
| »C-c C-f C-s« | Zum Subject:-Feld springen |
| »C-c C-f C-c« | Zum Cc:-Feld springen |
| »C-c C-f C-b« | Zum Bcc:-Feld springen |
| »C-c C-t« | Zum Mail-Text springen |
| »C-c C-w« | Signatur (»~/.signature«) anhängen |
| Tabelle 5: Die wichtigsten Tastenkürzel im Mail-Modus | |
Wem Mail wegen zu langer Antwortzeiten nicht ausreicht und sich stattdessen lieber in einem Echtzeit-System mit Gleichgesinnten (z.B. Kollegen oder Freunden) unterhalten möchte, der möchte vielleicht eher IRC (Internet Relay Chat) ausprobieren. Normalerweise nimmt man auch hier externe Programme, die speziell dafür ausgelegt sind.
Das muß natürlich auch nicht sein, denn es gibt auch Clients für IRC, die im Emacs laufen. Zu erwähnen seien hier erc, liece und ZenIRC, "a major mode for wasting time". Diese lassen sich in der üblichen Manier konfigurieren und in die tägliche Arbeit integrieren. Wer stattdessen ICQ bevorzugt, der sei auf EICQ verwiesen, ein Emacs-Client für ICQ.
Zusätzliche LISP-Dateien
Wer länger mit Emacs arbeitet, wird sich unter Umständen tiefer in die Materie einarbeiten. Vielleicht entstehen auf diese Weise eigene Erweiterungen oder es werden einfach fertige Werkzeuge (in Emacs LISP programmiert) aus dem Internet geladen. Diese müssen irgendwo abgelegt werden, so daß sie vom Emacs beim Programmstart auch gefunden werden, und damit auch geladen werden können.
Intern verwendet Emacs dafür die Variable »load-path«, die eine Liste von Verzeichnissen enthält, in denen Emacs nach zusätzlichen Dateien sucht. Eigene Erweiterungen können so z.B. im Verzeichnis »~/lib/elisp« abgelegt werden, ohne daß dafür Dateien mit Superuser-Rechten im sonst nicht beschreibbaren Verzeichnisbaum installiert werden müßten.
Wenn der Pfad sinnvoll erweitert wird, hat es zudem zur Folge, daß man lokal neuere Versionen der Dateien speichern kann, die Emacs dann den systemweiten vorziehen würde. Die Liste der Verzeichnisse wird von vorne nach hinten durchgegangen. In diesem Fall schreibt man das neue Verzeichnis an den Anfang, was darüberhinaus auch viel einfacher zu bewerkstelligen ist. Um die Tilde im Pfadnamen aufzulösen, wird die Funktion »expand-file-name« verwendet. Zusammengesetzt wird somit folgender Code in die Datei ».emacs« aufgenommen:
(setq load-path
(cons (expand-file-name "~/lib/elisp")
load-path
))
Für notorische Vertipper
Für diejenigen unter Ihnen, die sich notorisch vertippen und immer mal wieder aus Versehen »C-x C-c« tippen, was Emacs zum Verlassen auffordert, gibt es zum Abschluß noch die passende Medizin dagegen. Der Trick besteht darin, diese Tastenkombination global abzuschalten bzw. umzudefinieren. Ein harmloser Befehl wäre zum Beispiel das Anzeigen der verwendeten Emacs-Version. Dazu wird die folgende Definition in die Datei ».emacs« aufgenommen:
(define-key global-map "\C-x\C-c" 'emacs-version)
Jetzt muß man natürlich wissen, wie man Emacs dennoch beenden kann, sonst muß man archaische Methoden wie »killall -9 emacs« anwenden. Die Funktion, die vorher mit dieser Tastenkombination verbunden war, lautet »save-buffers-kill-emacs«. Sie wird von nun an direkt als Befehl eingegeben, wenn man Emacs verlassen möchte.
Wer Emacs jedoch tatsächlich als Kommandozentrale einsetzt, der startet das Programm einmal, nachdem der Rechner hochgefahren ist und man sich eingelogt hat, und beendet es gar nicht mehr, bis der Rechner wieder heruntergefahren wird.
Wer diese Tastenkombination nicht dauerhaft umbiegen möchte, sondern das nur auf direkten Wunsch aktivieren möchte, schreibt sich eine LISP-Funktion, mit der die Tastenbelegung geändert wird. Das könnte zum Beispiel die folgende sein, die anschließend als »emacs-disable-quit« aufgerufen wird.
(defun emacs-disable-quit ()
"Disables C-x C-c to quit Emacs since I misused it several times..."
(interactive)
(define-key global-map "\C-x\C-c" 'emacs-version)
)
Resources
- Crypt++ für Emacs
- ICQ für Emacs
- ZenIRC für Emacs
- Programmierung mit Emacs LISP
- The Emacs Lisp List, ein Verzeichnis zusätzlicher LISP-Dateien für Emacs
- Lispmeralda, ein weltweites LISP-Archiv
- Verzeichnis für Emacs LISP bei Google
- Emacs-Homepage