Open Source im professionellen Einsatz

© photocase.com, anmanie

Workshop: Major Modes für (X)Emacs

Groß in Mode

Die Anpassung an spezielle Dateiformate führt beim Editor-Urgestein Emacs über so genannten Major Modes in der Programmiersprache Elisp. Dieser Workshop demonstriert die Technik am Beispiel eines Mode zum Schreiben von Manuskripten für das Linux-Magazin.

Als kürzlich sage und schreibe die Version 22 des Editors GNU Emacs erschien, kursierten in den Internetforen der News-Seiten die altbekannten Witze mit langem grauen Bart: Es handle sich ja gar nicht um einen bloßen Editor, sondern um ein ganzes Betriebssystem und so fort. Ganz grundlos sind die Seitenhiebe nicht, bringt Emacs 22 doch als eines seiner Highlights einen eingebauten Chat-Client mit.

Die Erweiterbarkeit des Editors gehörte von Anfang an zu seinen Grundtugenden. In der ihm eigenen Programmiersprache Elisp, einer Lisp-Variante, lassen sich vom Syntax-Highlighting bis zum Mail- und Newsreader alle denkbaren Funktionen implementieren.

Dieser Artikel bereichert Ihren Emacs um die Fähigkeit, das auf [1] beschriebene Autorenformat des Linux-Magazins zu verstehen und dafür Syntax-Highlighting und andere Nettigkeiten zur Verfügung zu stellen. Solche Funktionen, die sich mit einem spezifischen Dateiformat beschäftigen, werden durch so genannte Major Modes bereitgestellt, von denen es schon zahlreiche fertige gibt: für diverse Programmier- (C, C++, Perl, Python, Java, Emacs Lisp ...) und Markup-Sprachen (HTML, XML, Latex ...), aber auch fürs Lesen und Schreiben von Mails oder News und vieles mehr.

Emacs mit oder ohne X

Beim Schreiben von Code in Emacs Lisp müssen Sie daran denken, dass es zwei Varianten des Emacs gibt, deren eingebauter Sprachumfang sich an einigen Stellen unterscheidet: den klassischen Emacs, auch GNU Emacs genannt [2], sowie den Xemacs [3]. Die Trennung hat historische Gründe, wer die Nutzer beider Varianten als Zielgruppe vor Augen hat, muss an einigen Stellen für Kompatibilität sorgen. Was die Ankunft einer weiteren Variante (Sxemacs, [4]) für die Zukunft bedeuten wird, bleibt abzuwarten. Der hier entstehende Code wurde unter Xemacs entwickelt und zum Schreiben dieses Artikels mit GNU Emacs verwendet, ist also kompatibel.

Interaktive Entwicklung

In den meisten Programmiersprachen läuft es so, dass der Entwickler mit einem Editor oder einer IDE das Programm schreibt, danach eventuell einen Compiler hinzuzieht und schließlich das Programm über Mausklick oder in einer Shell startet. Bei der Entwicklung mit Emacs Lisp funktioniert das grundlegend anders: Ist der Editor einmal gestartet, läuft der Interpreter bereits und die neuen Funktionen sind ihm nur noch bekannt zu machen. Das passiert, indem Sie den Cursor ans Ende eines Ausdrucks stellen und die Tastenkombination [Strg] +[X] und dann [Strg]+[E] drücken.

Als Einstieg soll ein ganz einfaches Hello-World-Beispiel dienen, dessen Code Sie im »*scratch*«-Buffer einfügen können, der für solche Arbeiten zur Verfügung steht:

(defun simple-hello-world ()
  "Write "hello world" to the echo area."
  (interactive)
  (message "Hello World"))

Platzieren Sie den Cursor wie in Abbildung 1 hinter die letzte schließende Klammer. Evaluieren Sie diesen Emacs-Lisp-Ausdruck, der die interaktive Funktion »simple-hello-world« erzeugt, durch die erwähnte Tastenkombination. Danach steht die Funktion im Editor zur Verfügung und Sie können sie dank des »(interactive)« mit »M-x simple-hello-world« ausführen. Die folgende Entwicklung des Linmag-Mode verläuft ebenfalls interaktiv.

Abbildung 1: Zum Ausführen von Hello World im »*scratch*«-Buffer stellen Sie den Cursor hinter die Funktion.

Abbildung 1: Zum Ausführen von Hello World im »*scratch*«-Buffer stellen Sie den Cursor hinter die Funktion.

Die wohl wichtigste Funktion bei der Unterstützung eines Dateiformats ist die syntaktische Einfärbung von Schlüsselwörtern und anderen Sprachkonstrukten. Der Mechanismus dazu trägt im Emacs den Namen Font-Lock und wird über Variablen gesteuert, die für den jeweiligen Buffer lokal gelten. Dazu erzeugen Sie zunächst eine Liste jener Schlüsselwörter, die das Dateiformat definiert (Listing 1). Im Fall dieses Beispiels sind dies die beim Linux-Magazin verwendeten Markup-Tags, die mit einem @-Zeichen beginnen.

Listing 1: Variable
definieren

01 (defvar linmag-commands
02   '("@R:"  "@SW:" "@D:"
03     "@T:"  "@V:"  "@A:"
04     "@L:"  "@ZT:" "@LI:"
05     "@B:"  "@Bi:" "@#:"
06     "@IT:" "@IL:" "@IE:"
07     "@KT:" "@KL:" "@KE:"
08     "@TT:" "@TH:" "@TL:"
09     "@TE:")
10   "List of available markup commands for linmag-mode.")

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook