Fullscreen Emacs.App durch Homebrew

Nachdem ich gestern schrieb, dass der Emacs.App eine Unterstützung für den Vollbildmodus unter Lion fehlt, begann ich noch etwas tiefer zu graben. Und es gibt sie doch. Die Lösung möchte ich hier kurz beschrieben.

Homebrew

Wer aptitude oder yum auf Linuxsystemen kennt, ist mit dem Prinzip des Paketmanagers[1] vertraut. Für Apples Plattform gab es schon sehr früh (Mac-) Ports als Alternative. Doch merkt man Ports sein Alter an. Viele neue Pakete gibt es nicht oder nur in alten Versionen. Auf der Suche nach einem Substitut stößt man recht schnell auf Homebrew. Die in Ruby geschriebene Software ist mit nur einer Zeile installiert:

/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)" 

Eventuell muss der geneigte Nutzer noch Apples Developer Command Line Tools installieren. Die findet man dann hier.

Emacs.App

Ist Homebrew erfolgreich installiert[2], kann mit einem beherzten

brew install emacs --cocoa --lion

Emacs auf OS X Lion geladen werden. Nun befindet sich die Installation aber unter /usr/local/Cellar/emacs/… und dürfte für die meisten etwas schwierig zu erreichen sein. Abhilfe schafft hier eine Verknüpfung in das Verzeichnis für Programme /Applications:

ln -s /usr/local/Cellar/emacs/24.1/Emacs.app /Applications

Fullscreen

Jetzt kann Emacs über Applications > Emacs.App gestartet werden. Über Eingabe von

M-x ns-toggle-fullscreen

kommt man in den Genuss eines (fast) echten Fullscreen unter Lion. Ich habe Emacs dann in Mission Control (F3) auf einen eigenen Space geschoben. Et voilá, Emacs.App in Vollbild.

__

[1] Wer Paketmanager nicht kennt, sollte sich damit schnellstens anfreunden. Es gibt einfach keinen bequemeren Weg, seinen Computer mit Software zu versorgen.

[2] Wenn nicht, hilft brew doctor um dessen Herr zu werden.

Emacs auf dem Mac

Wie jedem Leser dieses Blogs bekannt sein dürfte, habe ich mich in den letzten Monaten hingebungsvoll mit dem Emacs Editor beschäftigt. Ich empfand es immer etwas eigenartig, wie viel Konfiguration der Editor braucht, um halbwegs komfortabel auf dem Mac zu laufen, hatte mich aber damit abgefunden und dachte, dass so alte Software vermutlich einfach etwas länger braucht, um moderne Features, wie etwa den von mir hoch geschätzten Fullscreen-Mode zu nutzen. Bis ich dann am letzten Wochenende in den Genuss kam, Emacs auf einem Fedora-getriebenen Thinkpad nutzen zu müssen.

Jeder der mich kennt weiß, dass ich auf den Apfel eingeschworen bin. Mir gefallen viele Details an dem Gerät. Die Hardware stimmt von vorne bis hinten und alles ist genau an dem Ort, an den es gehört. Doch an diesem Wochenende dachte ich das erste Mal seit  über fünf Jahren darüber nach, den Mac zu verlassen.

Doch bevor ich mich hier in einem Rant verliere, möchte ich einfach einmal die Emacs-Situation auf dem Mac darlegen.

Emacs

Eine Terminalversion des Editors wird mit dem Betriebssystem ausgeliefert. Was zuerst einmal eine löbliche Ausnahme ist. Andere Betriebssysteme, wie etwa diverse Linuxdistributionen, oder auch Windows kommen ohne Emacs, in manchen Fällen sogar ohne Vim. In vielen Betriebssystemen wird man auf  Nano oder Pico verwiesen, Editoren deren Name bereits beschreibt, mit welcher Featurelast der Anwender zu rechnen hat.

Doch tippt man dann frohgemut “emacs -version” in seinen Terminal, erwartet den Nutzer schon das Grauen. Denn die vorinstallierte Version ist dem aktuellen Release mindestens zwei Major-Versionen hinterher. Wen das noch nicht stört, den wird spätestens die unmögliche Tastaturbelegung des vorinstallierten Emacs’ daran hindern, damit zu arbeiten. Es gibt keine Meta-Taste[1], Umlaute werden zu den interessantesten Sonderzeichen interpretiert und wechselt man den Space kann es schon mal passieren, dass Emacs gar keinen Inhalt mehr zeigt, wenn man zum Fullscreen-Terminal zurückkehrt.

Apropos Fullscreen …

Emacs.App

Als Alternative Variante bietet sich EmacsForMacOSX an. Diese in Cocoa geschriebene Applikation, häufig auch als Emacs.App referenziert, verspricht das volle Emacs-Erlebnis auf dem Mac, ohne krude Tastenbelegung und mit voller OS-Integration. Viel versprochen, kaum etwas gehalten. Die Tastenbelegung erscheint auf den ersten Blick tatsächlich intelligenter, so nutzt Emacs.App immerhin die Alt-Taste als Meta, doch läuft der Nutzer hier spätestens in ein Problem, wenn er versucht ein @-Symbol oder etwa {, [, ], }, oder ~ zu tippen. Denn die Tasten wurden einfach überschrieben und dienen nun als Meta-Aufrufe. Ist ja nicht so, als bräuchte man die ständig. Als Programmierer. In Ruby. Das lässt sich natürlich alles durch beherztes Selbstschreiben der init.el beheben. Was ich auch getan habe. Meine Konfiguration umfasst inzwischen für den Mac über 180 Zeilen Code. Tendenz steigend.

Zurück zum Fullscreen-Mode. Den hat Emacs.App natürlich auch nicht. Weder nativ, noch per Funktion. Es gibt die Möglichkeit, per ns-toggle-fullscreen den Emacs über den gesamten Bildschirm zu spannen. Diese Funktion ist aber weit von der nativen Lösung entfernt. So wird weder ein eigener Space kreiert, noch Menü und Dock ausgeblendet. Der Editor wird durch diese Funktion tatsächlich einfach nur gestreckt. Auf der aktuellen Arbeitsfläche und ist dadurch in 9 von 10 Fällen einfach nur im Weg.

Hinzu kommt, dass die Konfiguration von Emacs.App über Skripte deutlich schwieriger ist, als es sein sollte. Denn auf viele Eingaben reagiert Emacs.App gar nicht. So durfte ich bereits Stunden damit verbringen, dieser App AUCTeX beizubringen und weitere Stunden, dafür globale Variablen anzulegen.

Ich habe das alles stillschweigend[2] auf mich genommen, weil ich dachte, dass es einfach so ist und wenn ich einen solch mächtigen Editor wie Emacs nutzen möchte, ich eben ein paar Hürden überwinden muss. Das dachte ich genau bis letzten Freitag, als ich Emacs das erste mal auf einer aktuellen Fedorakiste startete.

Emacs, wie es sein sollte

Ich installierte Emacs aus den offiziellen Quellen, startete es und bekam das gleiche Fenster zu sehen, das Emacs.App bietet. Damit hören die Gemeinsamkeiten aber auch schon auf. Als Metataste dient auch hier Alt, allerdings werden durch Alt aufgerufene Sonderzeichen nicht blockiert. Umlaute, Sonderzeichen und sogar der Theme-Manager funktionieren ohne Probleme. Pakete lassen sich tatsächlich über die interne Paketverwaltung installieren. Die gesicherte Konfiguration wird ordentlich in ~/.emacs.d/init.el ausgeschrieben und der Fullscreen-Mode funktioniert exakt wie von Fedora vorgesehen.

Da ich Emacs inzwischen für meine gesamte tägliche Arbeit verwende, bis auf Mail (da bleibe ich vorerst bei dem ganz hervorragenden Sparrow) und Web (Chrome oder Safari), muss ich mir nun natürlich Gedanken darüber machen, ob sich die Arbeit auf dem Mac für mich weiterhin lohnt. Ich werde zuerst einmal den Versuch wagen, Fedora auf dem Air zu installieren und hier sicher darüber berichten. Die Hardware ist einfach unschlagbar. Nur die Software ist totaler Mist.

__

Fußnoten:
[1] Tatsächlich muss die ESC-Taste als Meta-Ersatz herhalten. Die kann aber nicht als Meta-Taste bezeichnet werden, da man sie wieder loslassen muss, um die nächste Taste zu aktivieren. Hält man ESC gedrückt, passiert nämlich gar nichts.
[2] Ok, das war gelogen. Ich schimpfte wie ein Rohrspatz.

Verschlungene Pfade

Auf der Tastatur eines Mac gibt es keine Meta-Taste. Also wird von den Terminal Emulationen ein Druck auf die ESC-Taste als Meta übersetzt. Das ist in Emacs aber umständlich und behindert die tägliche Arbeit ungemein. Dabei ist die Command-Taste (⌘) vollkommen ungenutzt.

Das Mapping von Meta auf ⌘ ist nicht sehr intuitiv. Ich habe meiner Emacs-Konfigurationsdatei die Zeilen

(setq mac-option-modifier 'none)
(setq mac-command-modifier 'meta)
(setq ns-function-modifier 'hyper)

hinzugefügt, was aber genau nichts bewirkt hat.

In iTerm2 gibt es dafür aber folgenden Work-Around:

  1. iTerm2 Menu > Preferences > Profiles > Keys: Right option key act as ‘+ESC’
  2. iTerm2 Menu > Preferences > Keys: Left command key: ‘Right Option’
Man muss sich dann daran gewöhnen, im Terminal für alle alternativen Symbole, wie geschweifte Klammern, oder das ‘@’-Symbol die linke Option-Taste zu benutzen, den Komfort ist es jedoch allemal wert.

Emacs Tutorial (Pt. 4)

Bisher wurde beschrieben, wie Emacs gestartet, ein Dokument in einen Buffer eingelesen und sich in diesem Buffer sinnvoll bewegt wird. In diesem Teil soll es darum gehen, Dinge zu finden.

Vom Suchen und Finden

Mit C-s wird eine Suche in Schreibrichtung initiiert. Gefunden wird also das nächste Vorkommen des gesuchten Wortes. Dabei funktioniert die Suche inkrementell, das heißt C-s kann beliebig oft wiederholt werden, um alle Vorkommen des gesuchten Wortes nacheinander zu besuchen. Kommt die Suche dabei ans Ende des Buffers, beginnt sie wieder am Anfang.

Ist bekannt, dass sich das Vorkommen des gesuchten Wortes vor der aktuellen Position des Pointers befindet, kann auf den gesamten Durchlauf des Buffers verzichtet werden, indem mit C-r eine Suche entgegen der Schreibrichtung begonnen wird. Auch diese Suche funktioniert inkrementell.

Ersatz

Es ist mühsam, jedes Vorkommen eines Wortes in einem längeren Text einzeln zu ersetzen. Wenn das Wort an jeder Stelle des Textes ersetzt werden soll, kann dazu M-x replace-string ENTER AltesWort ENTER NeuesWort verwendet werden. Dabei wird nach der exakten Entsprechung von AltesWort gesucht. Für das ersetzen von Wörtern, in denen Teilausdrücke vorkommen, oder die nach einem bestimmten Muster angelegt sind, werden reguläre Ausdrücke benutzt: M-x replace-regexp ENTER RegAusdruck ENTER NeuerAusdruck. Weil das Ersetzen von Wörtern oder Ausdrücken nur für alle Vorkommen nach der aktuellen Pointerposition geschieht, sollte zuerst mittel M-< an den Anfang des Textes gesprungen werden.

Lesezeichen

Eine sehr angenehme Art, Textstellen zu markieren, sind Lesezeichen (Bookmarks). C-x r m setzt ein Lesezeichen, dem dann noch ein Name gegeben werden muss. Mit C-x r b wird später jedes beliebige Lesezeichen angesprungen.

__

Dieser Artikel schließt vorerst das Tutorial zur Bedienung von Emacs. Die Befehlsreferenz ist inzwischen auch kräftig gewachsen und enthält noch etwas zusätzliche Information, wie etwa die Handhabung mehrere Fenster innerhalb eines Rahmens, oder den Vergleich von Dateien. Feedback erwünscht! 

Muttersprachler

[Update: Seit dem Update von Emacs auf die Version 24.1 reicht es, das Encoding der Terminal Emulation auf ISO Latin 9 umzustellen.]

Eines hat mich an Emacs bis zu diesem Moment wirklich genervt: Ich bekam partout keine Unterstützung für deutsche Umlaute eingestellt. Oder wenn, dann brachen andere Sonderzeichen auf meiner Tastatur. Jetzt funktioniert’s und ich bin glücklich. Und so geht es: [1]

An die Datei .zshrc [2] folgende Zeilen anhängen:

LANG=de_DE.ISO8859-1
MM_CHARSET=ISO-8859-1
export LANG MM_CHARSET

Außerdem sollte die Datei ~/.MacOSX/environment.plist [3] wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyLi\
st-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>LANG</key>
    <string>de_DE</string>
  </dict>
</plist>

Zuletzt muss noch die Konfigurationsdatei [4] von Emacs um

(set-keyboard-coding-system 'iso-latin-1)

erweitert werden. Einmal den Terminal (und damit Emacs) neu starten. E voilá.

__

Fußnoten:
[1] Ich verwende Emacs 24.1 in der Terminalapplikation iTerm unter OSX Lion. Für genau diese Konfiguration funktioniert die hier vorgestellte Lösung.
[2] Die Konfigurationsdatei der benutzten Shell. Bei den meisten Nutzern dürfte das ~/.bashrc, ~/.bash_profile, ~/.profile, oder ~/.zshrc sein.
[3] Eventuell muss diese Datei erst angelegt werden.
[4] Das ist entweder ~/.emacs, ~/.emacs.el oder ~/.emacs.d/init.el.

Emacs Tutorial (Pt. 3)

In den ersten beiden Artikeln dieser Reihe wurden die Grundlagen gelegt. Es ist inzwischen bekannt, wie Emacs geöffnet und geschlossen wird, wie ein Buffer in eine Datei geschrieben wird und was genau es mit Buffern, Files, Windows, Frames und Pointern auf sich hat. Der vorliegende Artikel beschäftigt sich mit der Bewegung innerhalb eines Textdokuments und grundlegenden Operationen, wie Kopieren, Ausschneiden und Einfügen von Textabschnitten.

Zur Wiederholung sei erwähnt, dass C-x für das Drücken der CTRL-Taste und dem Buchstaben ‘x’ steht. M-x steht dann für die Meta-Taste (ESC oder ALT auf modernen Tastaturen) und den Buchstaben ‘x’.

Bewegung in die Sache bringen
Kleine Schritte

Mit den Pfeiltasten bewegt man den Pointer in Emacs um jeweils eine Position in die angegebene Richtung. Frühe Tastaturen hatten keine Pfeiltasten, weswegen es auch dafür Tastenkombinantionen gibt, die hier nur der Vollständigkeit halber aufgelistet sein sollen. C-f enspricht der Bewegung um ein Zeichen nach rechts (control forward) und C-b der Bewegung um ein Zeichen nach links (control backward). Mit C-p erreicht man die selbe Pointerposition eine Zeile über der aktuellen und mit C-n die Position in der Zeile darunter (Control previous / next).

Weiter ausschreiten

Die Bewegung um einzelne Zeichen ist in großen Dokumenten eine mühsame Angelegenheit. Deshalb gibt es in guten Editoren die Möglichkeit, ganze Textabschnitte zu überspringen. Der kleinste Textabschnitt ist ein einzelnes Wort, welches für Emacs eine Zeichenreihe zwischen zwei White Spaces ist. Mit M-f bewegt sich der Pointer um ein Wort in Leserichtung, mit M-b entsprechend ein Wort zurück. Das Ende der aktuellen Zeile erreicht man mit einem beherzten C-e, den Anfang mit C-a.

Siebenmeilen

Wenn das Dokument sehr groß ist, möchte man sich nicht Zeilenweise fortbewegen. Eine Seite ist in Emacs der aktuell sichtbare Bereich des Buffers. Um sich die nächste Seite anzeigen zu lassen, gibt man C-v. Mit M-v kommt man direkt zurück auf die Seite davor. Den gesamten Buffer überspringt man letztendlich mit M-> und kommt an dessen Anfang zurück mit M-<.

So einfach ist die Bewegung in einem Buffer.

Guttenberg und Co.
Text markieren

Um Text in Emacs zu markieren, setzt man seinen Pointer vor den ersten Buchstaben des zu markierenden Abschnitts und drück einmal C-Space (Space = Leertaste). Dann bewegt man den Pointer mithilfe der oben besprochenen Bewegungsfunktionen hinter das letzte Zeichen des zu markierenden Textes. Der Cursor zeigt nun auf das erste Zeichen nach dem markierten Abschnitt. Mit C-x C-x werden Beginn und Ende des markierten Bereichs vertauscht. Damit kann der Bereich dann in jede beliebige Richtung erweitert werden.

Ein markierter Bereich heißt in Emacs Region.

Ausschneiden

Ist bereits Text markiert, kann dieser mit C-w ausgeschnitten werden. Ausgeschnittener Text landet in einem Emacs-eigenen Zwischenspeicher, dem sogenannten Kill Ring. C-w könnte also heißen: control write to kill ring.

Einfügen

Das Gegenstück zum Ausschneiden ist C-y (control yank from kill ring), mit dem eine zuvor ausgeschnittene Region in den Text eingefügt wird. Dabei kann C-y beliebig oft wiederholt werden und fügt immer die zuletzt ausgeschnittene Region ein.

Kopieren

Möchte man eine Region nur kopieren, könnte man sie mittels C-w C-y ausschneiden und direkt wieder an Ort und Stelle einfügen. Da das aber unhandlich ist, gibt es dafür eine Abkürzung: M-w kopiert die Region in den Kill Ring, ohne sie auszuschneiden.

Ausblick

Nach diesem ausführlichen Lauf durch den Buffer wird es im nächsten Artikel vor allem um das Suchen und Finden von Textabschnitten gehen. Stay tuned.

Emacs Tutorial (Pt. 2)

Und wieder ein Artikel, in dem es sich voll und ganz um den Editor Emacs dreht. In diesem Teil des Tutorials soll es um die Benennung von Dingen gehen. Wer eine Software einsetzen möchte, kommt nicht darum herum, sich ein wenig mit der Philosophie dahinter auseinander zu setzen.

Der wichtigste philosophische Aspekt von Emacs erscheint mir, dass ein Nutzer niemals direkt auf einem Dokument arbeitet. An dieser Stelle sei mir ein kleiner Ausflug gestattet.

Ein gesichertes Dokument liegt auf irgendeinem persistenten Medium. Das kann eine Festplatte, ein USB-Stick, eine CD, DVD, Diskette oder ein Magnetband sein. Auf jeden Fall handelt es sich um einen Ort, an dem die Information nicht verloren geht, wenn ich den Rechner vom Strom trenne. Festspeicher haben diesen Vorteil. Aber auch einen entscheidenden Nachteil: Sie sind langsam. Ein Dokument direkt auf dem Festspeicher bearbeiten zu wollen, gleicht dem Waten abseits eines Weges durch einen Sumpf.

Dafür gibt es einen zweiten Speicher, den sogenannten Hauptspeicher. Wenn man ein Dokument bearbeiten möchte, lädt man es in diesen Speicher (weswegen er auch “Arbeitsspeicher” genannt wird). Der Hauptspeicher ist deutlich schneller als der Festspeicher, hat aber den Nachteil, dass sein Inhalt verloren geht, trennt man die Maschine vom Strom. Der Inhalt muss also vor dem Ausschalten des Rechners zurück auf den Festspeicher geschrieben werden.

Gewöhnliche Programme verbergen diesen Mechanismus vor dem Benutzer. Nicht jedoch Emacs.

Buffer

Wenn wir eine Datei in Emacs öffnen, dann liest der Editor diese Datei in einen Zwischenspeicher, den sogenannten Buffer. Wenn wir jetzt auf der Datei arbeiten, dann passiert mit der Datei auf der Festplatte erst einmal gar nichts. Erst wenn wir die Datei speichern (im Emacs-Jargon: “den Buffer ausschreiben”), wird die Datei auf der Festplatte verändert. Es wird also exakt der Prozess des “in den Arbeitsspeicher Ladens” und später “zurück auf die Festplatte Schreibens” abgebildet. Eigentlich funktionieren andere Programme genauso, nur dass bei Emacs eine geöffnete Datei “Buffer” heißt. Wenn ich also davon spreche, dass ich einen Buffer schließe, dann schließe ich eine geöffnete Datei in Emacs, nicht jedoch Emacs selbst.

Window

Buffer, Window and Frame in Emacs

Ist bei anderer Software von einem Fenster die Rede, meint das meist den gesamten sichtbaren Teil des Programms. Der Begriff der Fenster wurde dir 25 Jahre “Windows” deutlich geprägt. Bevor es jedoch graphische Software mit Fenstern gab, konnte man den Bildschirm eines Rechners, auf welchem Emacs lief, bereits in mehrere Teile unterteilen. So konnte man zwei Buffer nebeneinander betrachten. In Emacs heißt ein jeder Teil des Bildschirms, in welchem ein Buffer zu sehen ist “Fenster” (“Window”).

Frame

In perfekter Konsistenz zum Fenster ist der Rahmen das gesamte Emacs-Programm. Alle geöffneten Fenster mit allen Buffern darin innerhalb eines Emacs Programmfensters heißen zusammen “Rahmen” (“Frame”).

Pointer

In einem Terminal, bezeichnet der Cursor eine bestimmte Position. Dabei meint Cursor ein bestimmtes Zeichen, welches je nach Eingabemodus verändert wird. Beispielsweise könnte in einem Einfügemodus Text vor oder hinter dem Cursor hinzu kommen, oder in einem Löschmodus das Zeichen aus dem Text entfernt werden. Allgemein sorgt die Metapher des Cursors vor allem bei Neulingen am Terminal für einige Verwirrung. Emacs verfolgt auch hier einen anderen Ansatz, indem es den Pointer definiert, welcher der Raum vor dem Cursor ist. Alle Bearbeitung findet exakt am Pointer statt, nicht davor und nicht dahinter.