Tote Tasten, die einen Akzent über den nachfolgend eingetippten Buchstaben setzen, nerven beim Programmieren, so dass man sie besser abschaltet. Doch manchmal soll’s dann doch ein á sein – das geht tatsächlich, und eine Menge anderer lustiger Zeichen gewinnt man gleich dazu.
The Answer Girl
Dass der Computeralltag auch unter Linux des Öfteren Überraschungen bereit hält, ist eher eine Binsenweisheit: Immer wieder funktionieren Dinge nicht oder nicht so, wie eigentlich angenommen. Das Answer-Girl im LinuxUser zeigt, wie man mit solchen Problemchen elegant fertig wird.
Wer häufig mit der Shell arbeitet, den oder die stört es schnell, wenn gedrückte Akzenttasten zunächst keine Ausgabe auf dem Bildschirm nach sich ziehen und diese erst nachliefern, sobald man ein weiteres Zeichen eingibt: Der Akzent sitzt anschließend über dem als zweites eingegebenen Buchstaben. So ergibt die Tastenfolge [´] und [e] ein é. Doch auch um ein einzelnes Hochkomma zu erzeugen, bleibt nichts anderes übrig, als der “toten” Akzenttaste ein Leerzeichen hinterherzuschieben – sehr ärgerlich für alle, die des Öfteren programmieren.
Weg mit den toten Tasten!
Zum Glück braucht es lediglich root-Rechte, um diese Tastenbelegung mit toten Tasten auf die Variante nodeadkeys umzustellen: Für die grafische Oberfläche wählt man in XF86Config, der Konfigurationsdatei des X-Window-Systems, bei den Tastatur-Einstellungen die “X–Keyboard-Variante” nodeadkeys hinzu: Kommt XFree86 in der alten 3er Version zum Einsatz, lautet die entsprechende Zeile in der Section “Keyboard”
XkbVariant "nodeadkeys"
Bei einem X-Server der 4er Generation heißt sie
Option "XkbVariant" "nodeadkeys"
(Listing 1 zeigt zwei Beispiele im Zusammenhang.) Nach einem Neustart des X-Servers funktionieren die Akzenttasten auf der grafischen Oberfläche beim ersten Drücken, so dass die Tastenfolge [´][e] die Ausgabe ´e nach sich zieht.
Wunderbar für die Shell-Programmiererin, aber schlecht für die Texteschreiberin: Sobald sie nämlich ein französisches â oder ein tschechisches é braucht, bleibt bestenfalls der Weg über Copy&Paste, am schnellsten aus einem Web-Dokument. Doch wenn der Web-Browser neueren Datums Netscape oder Mozilla heißt, geht oft sogar das schief: Das mühsam markierte é kommt als e’ im Textprogramm an.
Listing 1
XF86Config(4)-Eintrag
Section "InputDevice" Section "Keyboard" Driver "Keyboard" Protocol "Standard" Identifier "Keyboard[0]" XkbRules "xfree86" Option "MapName" "Standard Keyboard [ pc104 ]" XkbKeycodes "xfree86" Option "Protocol" "Standard" XkbModel "pc104" Option "XkbLayout" "de" XkbLayout "de" Option "XkbModel" "pc104" XkbVariant "nodeadkeys" Option "XkbRules" "xfree86" EndSection Option "XkbVariant" "nodeadkeys" EndSection
Da muss es doch eine Möglichkeit geben, der nodeadkeys-Einstellung ein Schnippchen zu schlagen. Eine Umfrage unter Gurus fördert recht schnell das Stichwort “Compose-Taste” zutage. Hört sich gut an: to compose bedeutet “zusammensetzen”, und genau das soll diese Taste tun: Man sagt per Druck auf [Compose]: “Kombiniere die nächsten zwei Zeichen!” – ganz so, wie es geschieht, wenn man eine tote Akzenttaste und anschließend einen Buchstaben antippt.
Nach einer solch magischen Taste allerdings sucht man auf der Keyboard-Beschriftung lange: Die gibt es auf PC-Tastaturen schlicht und ergreifend nicht. Wohl aber lassen sich alle Tasten unter Linux ganz nach Belieben belegen [1]: Niemand zwingt die Benutzerin zu einer Tastenbelegung, bei der die [Y]-Taste ein y ausspuckt.
Tatsächlich nutzt eine nicht zu vernachlässigende Anzahl Programmierer/innen die Möglichkeit, ein Keyboard “in der Landessprache” über den XkbLayout-Eintrag in der XF86Config mit amerikanischer Belegung auszustatten, lassen sich doch damit eckige und geschweifte Klammern ohne Fingerakrobatik tippen. Aber auch sie brauchen irgendwann einmal Umlaute, akzentuierte Buchstaben und damit den ominösen [Compose]-Key.
Tastenbelegung unter X
Wenn aber die Belegung individuell einstellbar ist, sollte es nicht schwerfallen, die Aufgabe dieser nicht vorhandenen Taste einer anderen zu übertragen. Vielleicht gibt es bereits eine Tastenkombination, die die Compose-Funktion übernimmt – nur weiß die Benutzerin (noch) nichts davon.
Das sollte herauszufinden sein – indem sie sich die gerade aktuelle Zuordnung der Tasten zu Zeichen, auf englisch das “Keymapping”, ausgeben lässt. Diese Aufgabe übernimmt das Kommando xmodmap. Aus dessen Manpage erfährt die geneigte Leserin, dass die Option -pk (“print keymap”) die derzeit geladene Tasten-Zuordnungstabelle (englisch: “keymap table”) auf der Standardausgabe ausspuckt (Listing 2).
Listing 2
Ausschnitt aus der Ausgabe von
xmodmap -pk
There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 134.
KeyCode Keysym (Keysym) …
Value Value (Name) …
[…]
10 0x0031 (1) 0x0021 (exclam) 0x00b9 (onesuperior) 0x00a1
(exclamdown)
[…]
24 0x0071 (q) 0x0051 (Q) 0x0040 (at) 0x07d9 (Greek_OMEGA)
[…]
50 0xffe1 (Shift_L)
[…]
113 0xff7e (Mode_switch) 0xff20 (Multi_key)
[…]
116 0xff20 (Multi_key)
Diese zeigt in den Spalten zwei bis fünf jeweils in Klammern, welche Bedeutung die Taste mit dem Keycode aus der ersten Spalte hat, und zwar abhängig davon, ob sie allein (zweite Spalte) oder in Verbindung mit Modifikationstasten (“modifiers”) gedrückt wird: Die dritte Spalte listet die Bedeutung der Kombination mit der Umschalttaste (Shift), die vierte die mit der Modifikationstaste und die letzte den Wert für die Dreierkombination mit [Shift-Mod], wobei letztere in der Praxis leider nicht wie gewünscht funktioniert.
Listing 2 zeigt damit, dass die [Q]-Taste alleine gedrückt ein kleines q, zusammen mit [Shift] ein großes Q, zusammen mit [Mod] ein @ (englisch: “at”) und in der Kombination [Shift-Mod-Q] ein großes Omega ausspucken sollte; die [1]-Taste kombiniert mit der Umschalttaste ergibt ein Ausrufezeichen (englisch: exclamation mark), [Mod-1] eine hochgestellte (superior) Eins (one) ¹ und [Shift-Mod-1] theoretisch ein umgekehrtes Ausrufezeichen, wie es im Spanischen vorkommt.
Ein Analogieschluss aus der täglichen Praxis liegt spätestens beim Blick auf die [Q]-Taste nahe: Zwar fehlt dem PC-Keyboard ein Key mit der Beschriftung [Mod], doch übernimmt [AltGr] diese Funktion.
Der Befehl xmodmap -pk | Mod erlaubt den Rückschluss, dass es sich dabei um die Taste mit dem Code 113 (vgl. Listing 2) handelt: Mode_switch kann gar nichts anderes als “den Modus einer anderen Taste wechseln” bedeuten.

AltGr-Taste” width=”300″ height=”233″ />
Abbildung 1: Der X-Event-Tester registriert den Druck derAltGr-TasteEreignis im X-Server
Diese Vermutung bestätigt der X-Event-Tester xev (Abbildung 1). Im X-Terminal, aus dem heraus er mit dem Kommando xev aufgerufen wurde, registriert er alle den X-Server betreffenden Ereignisse (Mausbewegungen, Tastendrücke, Fokuswechsel bei Fenstern u. ä.), die passieren, während der Mauszeiger im quadratischen xev-Fenster verweilt.
Abbildung 1 zeigt rot umrandet die beiden Ereignisse “Drücken” (KeyPress event) und “Loslassen” (KeyRelease event) der [AltGr]-Taste. Aus beiden Einträgen geht hervor, dass [AltGr] tatsächlich den Keycode 113 trägt.
Auch dass die linke Umschalttaste (Keycode 50) tatsächlich die Funktion einer [Shift]-Taste übernimmt, lässt sich so nachvollziehen. Dennoch sind wir auf der Suche nach der Taste, die die Compose-Funktionalität übernimmt, noch nicht besonders weit gekommen, denn xmodmap -pkgrep Compose gibt überhaupt keinen Treffer aus.
Zum Glück hilft hier man xmodmap aus der Patsche: Sucht man darin mit /Compose nach dem Stichwort Compose, gelangt man unweigerlich zur Zeile Multi-language key (sometimes labeled Compose Character). Das Compose-“Zeichen” (“character”) heißt also auch “vielsprachige Taste”, “multi-language key”, abgekürzt Multi_key, wie die Manpage etwas später mitteilt.
Mit dieser Kurzbezeichnung bewaffnet macht es wenig Mühe, xmodmap -pk zu entlocken, dass die Taste mit dem Keycode 113 – also [AltGr] – mit [Shift] kombiniert werden will, um ihr die Compose-Funktion zu entlocken (Listing 2). Die Probe auf’s Exempel – [Umschalt-AltGr][´][e] – resultiert tatsächlich in einem é, [Umschalt-AltGr][Umschalt-´][e] in è (in der Shell allerdings nur dann, wenn sie auch Umlaute ausgibt [2]).
Was aber ist die in Listing 2 aufgeführte Taste mit dem Keycode 116, die selbst – also als einzelner Tastendruck – als [Compose] wirken soll? Wer keine Lust hat, mit xev auf die langwierige Suche zu gehen, greift auf das (bei den meisten Distributionen nicht standardmäßig installierte) Programm xkeycaps[3] aus dem meist gleichnamigen Paket zurück.
Kasten 1: Caps_Lock zu Compose
Wenn der Distributor nicht freiwillig dafür sorgt, dass eine Einzeltaste (statt oder neben der fingerbrecherischen Kombination [Umschalt-AltGr]) die Aufgabe des [Compose]-Keys übernimmt, lässt sich das auf eigene Faust ändern. Im Idealfall überträgt man sie einer Taste, bei der es nicht auffällt, wenn sie ihre angestammte Funktion verliert – zum Beispiel dem ewigen Ärgernis [CapsLock].
Die nötigen Funktionsänderungen trägt man in eine Datei im Home-Verzeichnis (etwa .xmodmaprc) ein, die xmodmap als Argument mit auf den Weg bekommt. Damit sie beim Start von X oder beim grafischen Login wirksam werden, fügt man den Befehl xmodmap .xmodmaprc vor dem Aufruf des Window-Managers oder KDE/GNOME-Startskripts in die persönliche Startdatei für das X-Window-System (traditionell ~/.xinitrc bei Verwendung der startx-Methode, ~/.xsession bei grafischem Login) ein. Wenn die Distribution von sich aus für den passenden xmodmap-Aufruf sorgt, braucht man sich um Letzteres nicht kümmern: SuSE pflegt automatisch alle Änderungen an der Tastaturbelegung ein, die die Benutzerin in ~/.Xmodmap ablegt. Als da wären:
remove Lock = Caps_Lock keysym Caps_Lock = Multi_key
Die zweite Zeile weist der [CapsLock]-Taste die [Compose]-Funktion zu. Alternativ ermittelt man ihren Keycode (66) und schreibt
keycode 66 = Multi_key
(Vorteil der keysym-Methode: Sie funktioniert nicht nur auf PCs, sondern auch auf anderen Plattformen, auf denen der [CapsLock]-Key einen anderen Keycode hat.) Belässt man es bei einer dieser beiden Zeilen, fungiert die Taste zwar als [Compose], behält aber weiterhin ihre störende Funktion des Toggelns zwischen Groß- und Kleinschreibung bei. Das erkennt man nicht nur am praktischen Ausprobieren, sondern auch daran, dass der Befehl xmodmap ohne weitere Argumente die neue [Multi_key]-Taste weiterhin als
lock Multi_key (0x42)
…, also als Sperrtaste (“to lock” – sperren) listet. (0x42 ist deren Keycode in Hexadezimalschreibweise: 4*16^1+2*16^0=66.) Deshalb sorgt remove Lock = Caps_Lock am Anfang der von xmodmap zu lesenden Datei dafür, dass die (dann noch mit der Caps_Lock-Funktion behaftete) Taste aus dem Pool der Sperrtasten entfernt wird.
Mit grafischer Unterstützung
Per xkeycaps & gestartet, ist dieses grafische Tool zwar alles andere als ein Musterbeispiel benutzerfreundlicher GUI-Programmierung (Abbildung 2), hat aber den Vorteil, dass man einfach nur mit der Maus über die stilisierte Taste fahren muss, um im oberen Teil des Fensters den Keycode und die Belegung (KeySym) zu erfahren.
Dazu gilt es zunächst, die eigene Tastatur im Select Keyboard-Dialog korrekt auszuwählen: Auf gängige, “schnörkellose” Tastaturen mit Windows-Tasten passt etwa die Beschreibung als PC-Tastatur 105 key, wide Delete, tall Enter (105 Tasten, breite [Backspace]- und hohe [Enter]-Taste), deutsches Tastatur-Layout (XFree86; German); die mittlere Maustaste erlaubt das Scrollen mit Hilfe der grauen “Rollbalken”. Abbildung 2 verrät dann, dass der ominöse Keycode 116 auf die rechte [Windows]-Taste passt. [Windows (rechts)][´][e] ergibt bei vielen Distributionen daher ebenfalls ein é (nicht jedoch zum Beispiel unter Red Hat, wo der Keycode 116 einem anderen Zeichen zugeordnet ist).
Compose-Tabelle
Wer jetzt allerdings übermütig mit [Umschalt-AltGr][Umschalt-^] versucht, das Gradzeichen ° über einem a zu platzieren, um ein skandinavisches å zu erzeugen, stößt bei den meisten Distributionen auf Schwierigkeiten: Es funktioniert einfach nicht. Da wäre es gut, irgendwo nachzulesen, welche Möglichkeiten [Compose] denn nun tatsächlich bietet.
locate Compose entpuppt sich überraschenderweise als der richtige Suchansatz und spuckt (unter anderem) Dateien wie
/usr/X11R6/lib/X11/locale/iso8859-1/Compose /usr/X11R6/lib/X11/locale/iso8859-15/Compose […] /usr/X11R6/lib/X11/locale/koi8-r/Compose
aus. Ein Blick in /usr/X11R6/lib/X11/locale/iso8859-1/Compose (Listing 3) überzeugt davon, dass es sich hierbei um die Definitionstabelle handelt: [Umschalt-AltGr][+][+] erzeugt tatsächlich ein #, das Copyright-Zeichen © lässt sich per [Compose]-Tastendruck und [C][O],[Umschalt-C][Umschalt-O],[Umschalt-C][0] und anderen Kombinationen von c und 0 oder o in beliebiger Groß-Kleinschreibung und Reihenfolge ebenso erzeugen wie mit [Umschalt-AltGr][(][C] (<Multi_key> <parenleft> C). Allerdings funktionieren nicht auf allen Systemen alle angegebenen Kombinationen.
Weiter unten findet sich dann auch das gesuchte a mit Kreis darüber, aring. Des Rätsels Lösung: Nicht das Gradzeichen ° soll man mit a kombinieren, sondern den Stern * (asterisk). Alternativ geht auch [Umschalt-AltGr][A][A] – natürlich nur dann, wenn dies in der Compose-Tabelle so definiert ist.
Listing 3
Ausschnitt aus der Compose-Tabelle
iso8859-1/Compose
[…] # <Multi_key> Means <Compose> # Special Character <Multi_key> <plus> <plus> : "#" numbersign […] <Multi_key> <c> <o> : "\251" copyright <Multi_key> <o> <c> : "\251" copyright <Multi_key> <C> <O> : "\251" copyright <Multi_key> <O> <C> : "\251" copyright <Multi_key> <c> <O> : "\251" copyright <Multi_key> <O> <c> : "\251" copyright <Multi_key> <C> <o> : "\251" copyright <Multi_key> <o> <C> : "\251" copyright <Multi_key> <c> <0> : "\251" copyright <Multi_key> <0> <c> : "\251" copyright <Multi_key> <C> <0> : "\251" copyright <Multi_key> <0> <C> : "\251" copyright <Multi_key> <parenleft> <c> : "\251" copyright […] <Multi_key> <a> <asterisk> : "\345" aring <Multi_key> <asterisk> <a> : "\345" aring <Multi_key> <a> <a> : "\345" aring <Multi_key> <a> <o> : "\345" aring <Multi_key> <a> <e> : "\346" ae <Multi_key> <acute> <C> : "\307" Ccedilla […]
Unerkannte Bugs
Sie fragen sich bereits, warum wir uns die ganze Zeit über iso8859-1/Compose unterhalten? Schlicht und ergreifend, weil diese Tabelle bei den meisten hierzulande verbreiteten Distributionen automatisch zum Einsatz kommt. Ob das auch bei Ihnen der Fall ist, lässt sich ganz leicht nachprüfen: Sie müssen lediglich schauen, welche Compose-Tabelle zuletzt (das heißt normalerweise beim Starten von X oder beim grafischen Einloggen) gelesen wurde.
Der Befehl dazu heißt – Überraschung – ls: Die Ausgabe des langen Listings (Option -l) erhält das Datum der letzten Dateiänderung. Wer stattdessen das Datum des letzten Zugriffs generell (das kann auch ein Lesezugriff sein) sehen möchte, modifiziert die Listing-Ausgabe wie in Listing 4 mit der Zusatzoption -u. Dort erkennt man deutlich, dass iso8859-1/Compose zuletzt angefasst wurde, auf die anderen hat schon lange niemand mehr zugegriffen.
Listing 4
Welche Compose-Tabelle kommt zum Einsatz?
pjung@linux> ls -lu /usr/X11R6/lib/X11/locale/*/Compose -r--r--r-- 1 root root 35389 Aug 22 16:01 /usr/X11R6/lib/X11/locale/iso8859-1/Compose -r--r--r-- 1 root root 19260 Aug 13 20:16 /usr/X11R6/lib/X11/locale/iso8859-15/Compose -r--r--r-- 1 root root 19223 Oct 20 2000 /usr/X11R6/lib/X11/locale/iso8859-2/Compose […]
Doch wo steht der Grund dafür? Theoretisch in /usr/X11R6/lib/X11/locale/compose.dir. Diese Datei definiert, welche Compose-Tabelle zum Einsatz kommen soll, wenn die Anwenderin einen bestimmten Zeichensatz wählt:
iso8859-1/Compose C […] iso8859-15/Compose de_DE.ISO8859-15
Entscheidet sie (oder der Distributor) sich für keine bestimmte Locale (dieser Fall nennt sich C), käme hier die iso8859-1-Tabelle zum Einsatz. Wählt sie hingegen den für die deutsche Sprache (de) in Deutschland (DE) nötigen Zeichenvorrat nach dem Standard ISO 8859-15, hofft sie, mit [Shift-AltGr][c][=] ein Euro-Zeichen zusammensetzen zu dürfen:
pjung@linux:~> grep Euro /usr/X11R6/lib/X11/locale/iso8859-15/Compose <Multi_key> <C> <equal> : "\244" EuroSign
Ein Blick auf die eingestellte Locale zeigt, der Euro sollte möglich sein:
pjung@linux> locale LANG=C LC_CTYPE=de_DE.ISO8859-15 […]
(Welche Schreibweisen für eine bestimmte Locale-Angabe noch erlaubt sind, definiert übrigens /usr/X11R6/lib/X11/locale/locale.alias.) Doch folgt die Ernüchterung auf den Fuß: Auf keinem der für diesen Artikel getesteten Systeme änderten die Werte der Variablen LANG oder LC_CTYPE irgendetwas daran, welche Compose-Tabelle zum Zuge kam. Obwohl Compose.dir (zum Beispiel beim Starten des X-Servers) definitiv gelesen wurde, half nicht einmal die Notlösung, ein Umschreiben des Compose.dir-Eintrags für die vom System vorgegebene Locale. Teilweise gab es sogar den überraschenden Effekt, dass im Anschluss an die Locale-Änderung gestartete Programme nur noch auf die Compose-Kombinationen reagierten, die sowohl die alte als auch die gewünschte Compose-Tabelle definierten.
Selbst Red-Hat-9-User, die triumphierend “Bei mir ergibt [Umschalt-AltGr][C][=] aber den Euro!” rufen, freuen sich zu früh: Diese Distribution verwendet stur die Tabelle en_US.UTF-8/Compose, die besagte Belegung definiert. Sie lässt sich aber ebenfalls nicht auf dem vorgesehenen Weg überreden, eine alternative Compose-Tabelle zu verwenden. Linux – und in diesem Falle XFree86 – ist halt nicht perfekt…
Glossar
-
grep
-
Dieses Kommando sucht aus dem ihm übergebenen Text (hier aus der Ausgabe von “xmodmap -pk”) alle Zeilen heraus, die die als Argument angegebene Zeichenkette (hier: “Mod”) enthalten.
-
ISO 8859-15
-
Erweiterung des unter anderem für den deutschsprachigen Raum anwendbaren Zeichensatzes ISO 8859-1 um das Euro-Zeichen.
-
Locale
-
Definition orts- und sprachtypischer (“lokaler”) Einstellungen wie Sprache der Systemmeldungen (in der Variablen LC_MESSAGES), zu verwendender Zeichensatz (LC_CTYPE), die Art und Weise der Datumsangabe (LC_TIME) etc. Mehrere dieser Einstellungen auf einen Schlag deckt die Variable LANG (“language” – Sprache”) ab, alle die Variable LC_ALL. Wer englische Systemausgaben, aber das “deutsche Alphabet” bevorzugt, lässt LANG auf C stehen und setzt lediglich LC_CTYPE.
Infos
[1] Patricia Jung: “Tastenwirbel”, LinuxUser 06/2002, S. 74 ff., http://www.linux-user.de/ausgabe/2002/06/074-answergirl/answergirl.html
[2] Patricia Jung: “Kommandozeilen-Jongleur”, LinuxUser 02/2002, Listing 1 S. 81, http://www.linux-user.de/Ausgabe/2002/02/080-answergirl/answergirl.html
[3] xkeycaps: http://www.jwz.org/xkeycaps/





