X.org, CapsLock und die Hyper-Taste in Emacs
Marvin Gülker · 30.10.2019
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.
Kategorien: Schreibmaschinen, Emacs, Software
Nachtrag (17.11.2019):
Dieser Artikel ist auch bei Pro-Linux
veröffentlicht worden.
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.
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.
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 wird11 Programme 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). . 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.
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.
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 (05.11.2019):
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.
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
22
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.
.
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.
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
Kandidat33
„Emacs“ steht bekanntlich für „Escape-Meta-Alt-Control-Shift“.
. 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)
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.
Fußnoten:
Programme 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“.