X.org, CapsLock und die Hyper-Taste in Emacs
vom
Kategorien: Floss, Emacs, Schreibmaschinen
Der Beitrag stellt eine Methode vor, die meist nutzlose Feststelltaste unter X11 in eine der Umschalt- und Strg-Taste ähnliche Hyper-Taste umzuändern. Der Nutzen dieser Technik wird sodann am Beispiel von GNU Emacs demonstriert.
Nachtrag (17.11.2019): Dieser Artikel ist auch bei Pro-Linux veröffentlicht worden.
I. Einleitung
Auf den meisten hierzulande verfügbaren PC-Tastaturen findet man
Tasten, deren Nutzen sich aus heutiger Sicht nicht zwangsläufig
erschließt. Die Funktion, mithilfe der Scroll-Lock-Taste
(„Rollen“) den Textausschnitt, nicht aber die Schreibmarke zu
scrollen, dürfte etwa kaum jemanden bekannt sein (und wird scheinbar
von heutigen Programmen auch kaum noch unterstützt). Darum soll es
hier aber nicht gehen. Eine bekanntere, aber im normalen Gebrauch
eines PCs nicht weniger nutzlose Taste ist die Feststelltaste
(CapsLock
), die sich üblicherweise über der linken Umschalttaste
befindet. Die Feststelltaste dient in der Standardkonfiguration dazu,
alle Buchstaben als Großbuchstaben einzugeben und hat sich
historisch aus dem Feststeller mechanischer Schreibmaschinen
entwickelt, der die Mechanik dauerhaft so verschiebt (eben fest
stellt), daß die Typenhebel nur noch mit den mit Großbuchstaben
versehenen Flächen gegen das Farbband schlagen. Schon in der
Standardkonfiguration heutiger PCs hat die Feststelltaste sich von
diesem Vorbild entfernt: denn bei einer mechanischen Schreibmaschine
besteht kein Unterschied zwischen Buchstaben und sonstigen Zeichen.
Betätigt man den Feststeller, dann führt dies nicht nur zu
Großbuchstaben, sondern auch dazu, daß statt Zahlen Sonderzeichen
getippt werden, was bei heutigen Tastatur-Layouts üblicherweise nicht
mehr der Fall ist, d.h. die Feststelltaste hat keinen Einfluß auf die
Eingabe anderer Zeichen als Buchstaben. Auch wird der Feststeller
mechanischer Schreibmaschinen nicht durch erneutes Betätigen, sondern
durch Druck auf die Umschalttaste gelöst. Arbeitet man heute mit einer
historischen Schreibmaschine, führen dieser Umstände regelmäßig zu
Verwirrung.
Viele ältere mechanische Schreibmaschinen sind so gebaut, daß zur Eingabe von Großbuchstaben der Wagen angehoben werden muß. Dieser besitzt aber ein nicht unerhebliches Gewicht. Gibt man nun eine Reihe von Großbuchstaben ein, wäre man ohne den Feststeller gezwungen, den schweren Wagen für eine geraume Zeit nur mit einem Finger oben zu halten – je nach Schreibmaschine eine physisch nicht ganz unerhebliche Aufgabe. Rutscht man beim schnellen Tippen ab, ist das Schriftbild hinüber. Im schlimmsten Fall müßte man dann von vorne anfangen, da ein Löschen von Zeichen jenseits von Tipp-Ex nicht möglich ist.
Umschalter (große grüne Taste) und Feststeller (kleine grüne Taste) einer Wanderer Continental 100; der Tastenhub des Umschalters beträgt ca. 1,5 cm.
Heute ist der Nutzen der Feststelltaste dagegen gering. Großbuchstaben
in größerer Zahl lassen sich in den seltenen Fällen, in denen man dies
benötigt, ohne Probleme mit gedrückter Umschalttaste eingeben. Die
Feststelltaste fristet deshalb trotz beachtlicher Größe auf den
Tastaturen der meisten Menschen ein Schattendasein. Deshalb und weil
ihre Konzeption in den heutigen Tastatur-Layouts mit Blick auf
Sonderzeichen ohnehin inkonsequent ist, liegt es nahe, ihr eine
andere, nützlichere Funktion zu verleihen. Anders als bei den
mechanischen Schreibmaschinen des vorigen Jahrhunderts ist dies unter
aktuellen Betriebssystemen nämlich ohne weiteres möglich. Hier soll es
darum gehen, die Feststelltaste umzuwandeln in eine neue
Modifkator-Taste, die ähnlich wie die Strg
- und die Umschalttaste
(Shift
) zusammen mit anderen Tasten gedrückt werden kann, um der
Tastatur eine weitere Ebene hinzuzufügen. Dies kann man sich etwa in
GNU Emacs zunutze machen, um eigene Befehle zu definieren, die
kaum je in Konflikt mit den Tastenkombinationen gewisser Major-Modes
stehen. Die hier vorgestellte Methode funktioniert aber auch mit allen
anderen tastaturgesteuerten Programmen. Emacs dient insoweit nur als
illustratives Beispiel, wenngleich es vielleicht sogar den
Hauptanwendungsfall bilden mag.
II. Konzeptioneller Überblick
Bei der Konfiguration der Tastatur sind ein paar Dinge auseinanderzuhalten. Zunächst ist von Bedeutung, daß das Tastatur-Layout auf Linux’ virtueller Konsole unabhängig von demjenigen in X.org ist. Die hier vorgestellten Einstellungen haben deshalb keinen Einfluß auf die Verarbeitung von Tastendrücken auf der virtuellen Konsole. Demgegenüber richtet sich die Verarbeitung von Tastendrücken in X-basierten Terminal-Emulatoren zwar (zwangsläufig) nach derjenigen von X, aber die meisten Emulatoren wissen wenig damit anzufangen, wenn sie ungewöhnliche Tastendrücke erhalten. Insbesondere reichen sie sie auch nicht an Curses-basierte Konsolenanwendungen weiter. Deshalb ist es mit der hier vorgestellten Konfiguration nicht möglich, auch Konsolenanwendungen um die Erkennung derartiger Tastendrücke zu erweitern. Es gibt allerdings hier nicht weiter behandelte Möglichkeiten, diese Beschränkung im Einzelfall mithilfe gewisser Hacks zu umgehen. Solche Versuche haben allerdings gegenüber der hier vorgestellten Methode den Nachteil, daß sie anwendungsspezifisch sind und es nicht ermöglichen, die zusätzlichen Tastendrücke jedem X-Programm zur Verfügung zu stellen.
Beschränkt man sich auf X, ist zu unterscheiden:
- Tastendrücke generieren hardware-spezifische sog. Scancodes. Die Treiber für die jeweilige Tastatur im Linux-Kernel (Kernel-Modul) vereinheitlichen diese Scancodes in Keycodes. Scancodes werden in diesem Beitrag nicht weiter behandelt.
- Der Linux-Kernel generiert für den Druck jeder Taste ein Event, das er mit einer bestimmten Kennziffer, eben dem Keycode versieht. Dieses Event wird u.a. vom X-Server (X.org) empfangen.
- X.org ordnet jedem dieser Keycodes ein oder mehere Keysyms zu, die angeben, was passieren soll, wenn X.org ein solches Event erhält. Der X-Server leitet das Event in angereicherter Form an die einzelnen X-Programme (Clients) weiter, denen die Auflösung von Keycodes in Keysyms dann überlassen wird1. Dabei greifen sie freilich auf die Konfiguration des X-Servers zurück. Der Client ermittelt dann anhand des Standes der Modifikator-Tasten, welches der zugeordneten Keysyms das vom Nutzer gewollte ist.
- Natürlich erzeugen auch die Modifikator-Tasten selbst Keycodes, die
dann in Keysyms umgesetzt werden. Diese werden auch an die X-Clients
weitergeleitet, von diesen aber meist ignoriert, denn der
X-Server kümmert sich schon selbst darum, bei jedem
Tasten-Event den Stand der Modifikator-Tasten anzugeben.
Bei den Modifikator-Tasten kann man dann zwei Typen beobachten:
solche, die man für die Aktivierung des Modifikators gedrückt halten
muß (etwa die Umschalttaste und
Strg
) sowie solche, die den Modifikator einfach nur umschalten (etwa die Feststelltaste [CapsLock
] undNumLock
).
Alle diese Information (bis auf Scancodes) kann man sich mit dem Programm xev(1) anschauen.
Für die Zwecke dieses Beitrags sind vor allem die Modifier-Keysyms
interessant. X kennt eine ganze Reihe davon: Alt
, Strg
und die
Umschalttaste etwa werden von X den entsprechenden Modifier-Keysyms
zugeordnet. Dasselbe gilt für die auf europäischen Tastaturen
vorhandene AltGr
-Taste, die X dem Keysym mit dem ansprechenden Namen
ISO_Level3_Shift
zuordnet. Die Windows-Taste wird von X einem Keysym
mit dem Namen Super
zugeordnet. Kaum eine Tastatur bestitzt heute
dagegen noch eine Taste, die einen Keycode generiert, den X dem
Hyper
-Modifier zuordnet. Folgerichtig hat auch kaum ein Programm
Tastenkombinationen mit der Hyper
-Taste vorkonfiguriert. Hyper
ist
deshalb der ideale Kandidat für eigene Tastenkombinationen, die kaum
je im Konflikt mit den vorkonfigurierten Tastenkombinationen eines
Programms stehen werden. Nachfolgend wird es deshalb darum gehen, X so
zu konfigurieren, daß dem von der Feststelltaste ausgelösten
Keycode nicht mehr das Keysym CapsLock
, sondern das Keysym Hyper_L
zugeordnet wird. Außerdem muß X mitgeteilt werden, daß Hyper_L
einen
anderen Modifikator darstellt als namentlich Super
(Windows-Taste),
denn u.a. mit einem deutschen Tastatur-Layout behandelt X die
beiden Keysyms standardmäßig identisch.
III. Konfiguration von X
Die von X.org genutzten Tastatur-Layouts kann man mithilfe der Programme setxkbmap(1) und xmodmap(1) bearbeiten, ohne daß dafür Root-Rechte nötig wären. Ersteres ist neuer und bietet mehr Konfigurationsmöglichkeiten, für die Zwecke dieses Beitrags genügt aber das ältere, leichter zu bedienende xmodmap(1). Zunächst muß man sich einen Überblick darüber verschaffen, wie es um die Modifikator-Tasten aktuell bestellt ist:
$ xmodmap
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Die Ausgabe dieses Befehls variiert je nach System mehr oder weniger stark, insbesondere ist sie vom aktuellen Tastatur-Layout abhängig. Sie liest sich in meinem Fall auszugsweise so:
- Die Keycodes 0x32 und 0x3e werden den Keysyms
Shift_L
respektiveShift_R
zugeordnet, und diese Keysyms lösen den Modifikatorshift
(Groß/Kleinschreibung) aus. - Der Keycode 0x42 wird dem Keysym
Caps_Lock
zugeordnet und löst den Locklock
(Feststelltastenfunktion) aus. - Dem Modifikator
mod4
sind zahlreiche Keysyms mit ihren Keycodes zugeordnet. Alle diese Tasten werden gleich behandelt. In dieser Konfiguration löst die Betätigung der linken Windows-Taste den Keycode 0x85 aus, dem X das KeysymSuper_L
zuordnet, das wiederum den Modifikatormod4
bewirkt. Auffällig ist, daß die Taste, die den Keycode 0xcf auslöst (zugeordnet dem KeysymHyper_L
) auch den Modifikatormod4
bewirkt. Wenn man also im Besitz einer der seltenen Tastaturen ist, bei denen irgendeine Taste den Keycode 0xcf auslöst, so würde X diese Taste genauso behandeln wie den Druck auf die linke (Super_L
) oder rechte (Super_R
) Windows-Taste. - Als Nebenerkenntnis aus dieser Ausgabe wird ersichtlich, wieso die
linke und die rechte Windows-Taste,
Strg
-Taste und Umschalttaste von X in ihrer Gruppe jeweils gleich behandelt werden: sie sind jeweils demselben Modifikator zugeordnet. Wer wollte, könnte mit der hier vorgestellten Technik diesen Tasten auch unterschiedliche Funktionen verleihen. Dabei sollte man aber ergonomische Erwägungen beachten: es gibt gesundheitliche Gründe (Sehnenscheidentzündung), weshalb gleichartige Tasten auf beiden Seiten der Leertaste existieren.
Die Konfiguration erfolgt nunmehr in zwei Schritten. Erstens ist dem
Keycode 0x42 statt Caps_Lock
das Keysym Hyper_L
zuzuordnen. Das
ist zwar nicht zwingend notwendig, dient aber der Klarheit. Zweitens
wird das Keysym Hyper_L
aus dem Modifikator mod4
entfernt und dem
bisher leeren Modifikator mod3
zugeordnet. Bei wem die Ausgabe von
xmodmap(1) anders aussieht als hier gezeigt, der wird die
nachfolgenden Angaben entsprechend anpassen müssen.
1. Erstellung der Datei .Xmodmap
Glücklicherweise können beide erforderlichen Schritte mit xmodmap(1)
in einem Zug ausgeführt werden. Dazu legt man die Datei ~/.Xmodmap
mit folgendem Inhalt an:
keysym Caps_Lock = Hyper_L
clear lock
remove mod4 = Hyper_L
add mod3 = Hyper_L
Dies bewirkt folgendes:
- Zeile 1: Der Keycode, der bisher dem Keysym
Caps_Lock
zugeordnet war, wird nunmehrHyper_L
zugeordnet. Damit gibt es keinen Keycode mehr, der das KeysymCaps_Lock
generieren würde, aber weil letztlich nur eine Umbenennung stattgefunden hat, würde sich die Funktion des Feststelltaste allein hierdurch nicht verändern. - Zeile 2: Aus der Feststelltastenfunktion werden sämtliche Keysyms
(das ist nur eines: das in Zeile 1 in
Hyper_L
umbenannte ursprünglicheCaps_Lock
) entfernt. Damit gibt es kein Keysym mehr, das die Feststelltastenfunktion auslöste. - Zeile 3: Aus dem Modifikator
mod4
wird das KeysymHyper_L
gestrichen. Ohne diesen Befehl würde wie oben erwähntHyper_L
genauso wieSuper_L
zur Anwendung des Modifikatorsmod4
und damit zu derselben Funktion wie die Windows-Taste führen. - Zeile 4: Stattdessen wird
Hyper_L
dem bisher leeren Modifikatormod3
zugeschlagen.
Nachtrag (): Ein Leser
weist darauf hin, daß es optional möglich ist, die Funktion der Feststelltaste
durch gleichzeitiges Betätigen beider Umschalttasten zu emulieren,
indem man die ~/.Xmodmap
um folgende Einträge erweitert:
keycode 50 = Shift_L Caps_Lock keycode 62 = Shift_R Caps_Lock
Dies findet so namentlich im Neo-Tastaturlayout Anwendung.
2. Einspeisung der Änderung
Die Datei ~/.Xmodmap
ist nunmehr mithilfe von xmodmap(1) in die
Konfiguration des laufenden X-Servers einzuspeisen:
$ xmodmap ~/.Xmodmap
Im Erfolgsfalle gibt es keine Ausgabe. Durch erneutes Ausführen von xmodmap(1) läßt sich das Ergebnis prüfen, welches so aussehen sollte:
$ xmodmap
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 Hyper_L (0x42), Hyper_L (0xcf)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Hyper_L
löst damit ausschließlich den Modifikator mod3
aus und es
gibt kein Keysym mehr, welches die bisherige Feststelltastenfunktion
bewirkt. Hyper_L
wird zweimal für mod3
aufgeführt, weil es zwei
unterschiedliche Keycodes sind, die zu Hyper_L
führen können: die
umgeänderte Feststelltaste (0x42) und die auf modernen Tastaturen
nicht vorhandene „echte“ Hyper-Taste.
Die von xmodmap(1) durchgeführten Änderungen sind nicht dauerhaft,
d.h. die Datei ~/.Xmodmap
muß bei jedem Start des X-Servers erneut
eingespeist werden. Wie das geschieht, hängt von der genutzten
Desktop-Umgebung ab. Wer auf eine Desktop-Umgebung verzichtet und
X.org manuell per startx(1) startet, fügt den Befehl in die Datei
~/.xinitrc
ein. Hat man diese Datei aus der mit X.org mitgelieferten
Beispieldatei erzeugt, so findet man darin die folgenden für diese
Zwecke ausreichenden Befehle:
usermodmap=$HOME/.Xmodmap # ... if [ -f "$usermodmap" ]; then xmodmap "$usermodmap" fi
Es gibt allerdings noch ein bisher unterschlagenes Problem. Das Programm setxkbmap(1) überschreibt bei seiner Ausführung jegliche Änderungen am Tastatur-Layout vollständig mit den Standardwerten aus dem gewählten Tastatur-Layout. Das ist deshalb relevant, weil es in europäischen Ländern nötig ist, ein anderes als das von X.org standardmäßig genutzte U.S.-amerikanische Tastatur-Layout einzustellen. Dies erreicht man aber mithilfe von setxkbmap(1):
$ setxkbmap -layout de
oder durch einen Eintrag in /etc/X11/xorg.conf.d/10-evdev.conf
:
Section "InputClass"
Identifier "keyboard-all"
Driver "evdev"
Option "XkbLayout" "de"
MatchIsKeyboard "On"
EndSection
Letztere Methode steht in unbehebbarem Konflikt mit der hier
vorgeschlagenen Verwendung von xmodmap(1) in der ~/.xinitrc
, weil
die Optionen aus dem Verzeichnis /etc/X11/xorg.conf.d
nach
Ausführung der ~/.xinitrc
ausgewertet werden und deshalb die in der
~/.xinitrc
vorgenommenen Änderungen am Tastatur-Layout
überschreiben. Das Ergebnis ist ein Reset aller mit xmodmap(1)
vorgenommenen Änderungen und vermeintliche Wirkungslosigkeit des
Befehls in der ~/.xinitrc
2. Daher muß bei Anwendung der hier
vorgeschlagenen Konfiguration zwingend das deutsche Tastatur-Layout
mit setxkbmap(1) nach der ersten Methode eingestellt werden. Es ist
außerdem darauf zu achten, daß setxkbmap(1) vor xmodmap(1)
ausgeführt wird, indem man in der ~/.xinitrc
die Befehle in
folgender Reihenfolge unterbringt:
setxkbmap -layout de
xmodmap ~/.Xmodmap
Setzt man die Beispielkonfiguration von X.org ein, ist setxkbmap(1)
entsprechend vor dem oben gezeigten if
-Ausdruck einzufügen.
IV. Konfiguration von Emacs
Nachdem die beschriebenen Änderungen durchgeführt worden sind, steht
Tastenkombinationen unter Verwendung der neuen Hyper-Taste nichts mehr
im Wege. Speziell GNU Emacs ist wegen seiner stark auf
Tastenkombinationen ausgerichteten Bedienung dafür ein sehr guter
Kandidat3. Da mit obigen Änderungen schon X.org selbst den
Hyper-Modifikator an X-Programme sendet, bedarf es in Emacs keiner
speziellen Anpassung unter Verwendung von event-apply-hyper-modifier
mehr. Es kann vielmehr nach den eigenen Vorlieben sogleich mit der
Konfiguration von Tastenkombinationen unter Verwendung der Hyper-Taste
begonnen werden. Emacs erkennt den Hyper-Modifikator als H-
, sodaß
man sich etwa eine leicht zu merkende Tastenkombination für das
essentielle Emacs-Kommando tetris
einrichten kann, indem man der
Emacs-Konfiguration folgendes hinzufügt:
(global-set-key (kbd "H-t") 'tetris)
Um die Anzahl der verfügbaren Kombinationsmöglichkeiten ins Beliebige
zu erweitern, kann man noch ein auf dem Hyper-Modifikator basierendes
Präfix definieren. So ließe sich etwa H-x
ähnlich dem vordefinierten
Präfix C-x
verwenden, um dann für Reihenkombinationen genutzt zu
werden. Mit folgenden Beispielcode wird tetris
der Tastensequenz
H-x t
und das nicht minder wichtige Kommando doctor
der
Tastensequenz H-x d
zugewiesen:
(define-prefix-command 'hyper-x-map) (global-set-key (kbd "H-x") hyper-x-map) (define-key hyper-x-map (kbd "d") 'doctor) (define-key hyper-x-map (kbd "t") 'tetris)
IV. Ergebnis
Die heute praktisch nutzlose Feststelltaste erlebt mit der hier vorgestellten Konfiguration ihren zweiten Frühling als Hyper-Modifikator-Taste. Emacs und anderen tastaturgesteuerten Anwendungen können so Tastenkombinationen zugewiesen werden, die kaum je im Konflikt mit von diesen Programmen vordefinierten Tastenkombinationen stehen werden. Man erhält so eine ganze Tastaturebene zur Einrichtung nach eigenen Vorstellungen.
-
Programm sind zu dieser Operation nicht verpflichtet. Namentlich Spiele machen davon oft keinen Gebrauch, weil es bei ihnen weniger um Text- als mehr um Echtzeiteingaben geht (z.B. Springen durch Druck auf die Umschalttaste). ↩
-
Xfce-Nutzer sollten beachten, daß es einen Bug im xfce4-xkb-plugin gibt, der bei Verwendung dieses Plugins zur Überschreibung des Tastatur-Layouts führt. ↩
-
„Emacs“ steht bekanntlich für „Escape-Meta-Alt-Control-Shift“. ↩