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.

feststeller.jpg
Abbildung 1: 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.

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, und NumLock).

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 respektive Shift_R zugeordnet, und diese Keysyms lösen den Modifikator shift (Groß/Kleinschreibung) aus.
  • Der Keycode 0x42 wird dem Keysym Caps_Lock zugeordnet und löst den Lock lock (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 Keysym Super_L zuordnet, das wiederum den Modifikator mod4 bewirkt. Auffällig ist, daß die Taste, die den Keycode 0xcf auslöst (zugeordnet dem Keysym Hyper_L) auch den Modifikator mod4 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 nunmehr Hyper_L zugeordnet. Damit gibt es keinen Keycode mehr, der das Keysym Caps_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üngliche Caps_Lock) entfernt. Damit gibt es kein Keysym mehr, das die Feststelltastenfunktion auslöste.
  • Zeile 3: Aus dem Modifikator mod4 wird das Keysym Hyper_L gestrichen. Ohne diesen Befehl würde wie oben erwähnt Hyper_L genauso wie Super_L zur Anwendung des Modifikators mod4 und damit zu derselben Funktion wie die Windows-Taste führen.
  • Zeile 4: Stattdessen wird Hyper_L dem bisher leeren Modifikator mod3 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 ~/.xinitrc22 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:

1

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).

2

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.

3

„Emacs“ steht bekanntlich für „Escape-Meta-Alt-Control-Shift“.