XKB
Hinweis: Dieser Wiki-Artikel hat den primären Zweck, die Funktionsweise von XKB zu erläutern. Informationen zum Setzen des Tastaturlayouts mittels XKB finden sich am Ende des Artikels.
Die X keyboard extension, oder kurz XKB, ist ein unter X optionales und unter Wayland standardmäßiges System zur Definition eigener, und Anpassung bestehender, Tastaturlayouts, ähnlich wie es exklusiv für X mittels der Xmodmap möglich ist.
XKB hat dabei einen modernen Ansatz und erlaubt neben der einfachen Tastenkonfiguration sehr viele und umfangreiche Anpassungen des Layouts, ist dadurch aber auch komplexer.
Installation
XKB wird über das Paket libxkbcommon bereitgestellt, es muss allerdings im Normalfall nicht installiert werden, da die gängigen Compositoren und Fenstermanager indirekt durch deren Abhängigkeiten von XKB abhängen.
Für X gibt es diverse Programme, über die XKB konfiguriert werden kann. Da XKB unabhängig von X ist, und die Programme daher im Normalfall nichts X-spezifisches machen, können diese teilweise auch innerhalb von Wayland-Compositoren benutzt werden. libxkbcommon bringt zudem xkbcli
mit, um sich verschiedene XKB-Konfigurationen ausgeben zu lassen.
Überblick
Hinweis: Der Wiki-Artikel benutzt RALT, um die rechte Alt-Taste zu referenzieren. Auf einer deutschen Tastatur ist dies im Regelfall die AltGr. RALT
ist in der Nomenklatur von XKB die tastenbeschriftungsunabhängige Bezeichnung dieser Taste.
Die systemweite Konfiguration von XKB liegt bei Arch unter /usr/share/X11/xkb/
. In dessen Unterverzeichnis symbols
befinden sich die die verfügbaren Tastaturlayoutdefinitionsdateien. Die gleiche Struktur kann für die userbezogene Konfiguration unter ~/.config/xkb/
aufgebaut werden.
XKB geht in dieser Reihenfolge durch die spezifizierten Verzeichnisse. XKB iteriert dabei so lange durch die Verzeichnisse, bis die angeforderte Information gefunden wurde.
$XDG_CONFIG_HOME/xkb/
oder$HOME/.config/xkb/
, wenn die UmgebungsvariableXDG_CONFIG_HOME
nicht gesetzt wurde- Aus historischen Gründen noch
$HOME/.xkb/
, sollte aber nicht mehr genutzt werden $XKB_CONFIG_EXTRA_PATH
oder wenn nicht gesetzt/etc/xkb/
.$XKB_CONFIG_ROOT
oder wenn nicht gesetzt/usr/share/X11/xkb/
Die Dateien in diesen Verzeichnissen werden automatisch erkannt und können über ihren Namen, oder die von XKB aus den Dateien heraus generierten IDs direkt benutzt werden.
Abschnitte
XKB-Dateien werden in Abschnitte unterteilt. Diese Umfassen die eigentlichen Tastenkonfigurationen (xkb_symbols
), die verschiedenen Varianten des Layouts, die physikalische Beschreibung der Tastatur, etc. In diesem Wiki-Artikel werden nur die xkb_symbols
behandelt. Diese Unterteilung macht es möglich, verschiedene einzelne Konfigurationen in anderen Layouts einzubinden.
Das Einbinden erfolgt dabei immer im gleichen Muster: layoutname(layoutvariante)
. Der Layoutname entspricht dem Dateinamen, die Variante wird bei der Definition eines xkb_symbols
-Abschnitts angegeben.
Auch selbstreferentielle Einbindungen sind möglich. Das Beispiel hier im Wiki unterteilt die einzelnen Definitionen in eigene Abschnitte, und referenziert diese mittels mein-layout(abschnittsname)
im „Header“, um sie automatisch zu laden wenn das Layout verwendet wird.
Will man nicht, dass ein Abschnitt in anderen Layouts eingebunden werden kann, so muss man ihn mit dem Keyword hidden
definieren:
hidden xkb_symbols "versteckt" { ... };
Hierdurch kann der Abschnitt nur innerhalb der aktuellen Definitionsdatei benutzt werden.
Weitere Abschnittsoptionen sind unter anderem partial
, um einen Abschnitt zu definieren der nicht den kompletten Tastaturbereich abdeckt, keypad_keys
für einen Abschnitt, der nur die Tasten des Nummernfeldes behandelt, oder modifier_keys
um einen Abschnitt zu definieren, in dem Modifier Keys, wie ⇧ Shift, Alt, etc. definiert werden. Einige der Angaben können auch kombiniert werden. Es hat sich bei mehreren Angaben etabliert, diese auf eine eigene Zeile zu setzen.
partial function_keys modifier_keys xkb_symbols "special-keys" { ... };
Dies definiert unter dem Namen special-keys
einen unvollständigen Abschnitt (partial
) mit Funktionstasten und den Modifier Keys.
Informationen anzeigen

Mit libxkbcommon wird unter anderem auch das Tool xkbcli
installiert, das es ermöglicht, allerlei Informationen bezüglich der aktuellen Konfiguration auszulesen.
Mittels xkbcli interactive-wayland
(bzw. ...x11
oder ...evdev
) kann man ein kleines Fenster öffnen, über das man ähnlich wie mit xev oder wev die gedrückten Tasten überprüfen kann. Verlassen kann man das Programm, indem man den Prozess beendet. xkbcli zeigt zu den Tasten diverse Informationen im Stil von information [ wert ]
an. Für die Anzeige im Wiki wurden die Informationen untereinander geschrieben, beim Ausführen sind diese alle in einer Zeile.
seat0: keycode [ AE01 ] keysyms [ 1 ] unicode [ 1 ] layout [ English (US) (0) ] level [ 0 ] mods [ Mod2 NumLock ] leds [ Num Lock ]
Hier wurde einzig und alleine die Taste 1 gedrückt. Es werden der für die Definition des Layouts benötige Keycode, der Keysym, dessen Unicode-Repräsentation, sowie die gesendeten Modifier Keys angezeigt. Der Level ist in dieser Ausgabe nullbasierend (Level 1 = 0, Level 2 = 1, …)
Beim Drücken von ⇧ Shift + 1 wird neben dem Drücken von Shift auch die nun veränderte Ausgabe gezeigt.
seat0: keycode [ AE01 ] keysyms [ exclam ] unicode [ ! ] ... mods [ -Shift Mod2 NumLock ] leds [ Num Lock ]
Zudem werden am Ende die aktiven Modifier angezeigt.
Man kann mittels xkbcli how-to-type
auch abfragen, wie man ein bestimmtes Zeichen tippen kann.
xkbcli how-to-type !
keysym: exclam (0x21) KEYCODE KEY NAME LAYOUT LAYOUT NAME LEVEL# MODIFIERS 10 AE01 1 English (US) 2 [ Shift ]
Dies gibt die Informationen zu Keycode und -name, sowie das Layout aus, zeigt den Keysym, auf welchem Level (hier einsbasierend: Wert = Level) das gewünschte Zeichen liegt, und mit welchen Modifier Keys man dies erreichen kann.
xkbcli how-to-type ẞ
keysym: U1E9E (0x1001e9e) KEYCODE KEY NAME LAYOUT LAYOUT NAME LEVEL# MODIFIERS 39 AC02 1 English (US) 4 [ Shift Mod5 ] 39 AC02 1 English (US) 4 [ Lock Mod5 ]
Hier wird das große Eszett (ẞ) abgefragt. Gemäß Beispielkonfiguration nach diesem Wikiartikel ist dieses über zwei Kombinationen erreichbar: ⇧ Shift + RALT + S, sowie ⇪ Capslock + RALT + S.
Andersherum funktioniert die Abfrage auch. So kann man zum Beispiel nach dem Ä
(in der Terminologie „Adiaeresis“, siehe Weblinks) fragen.
xkbcli how-to-type --keysym Adiaeresis
keysym: Adiaeresis (0xc4) KEYCODE KEY NAME LAYOUT LAYOUT NAME LEVEL# MODIFIERS 38 AC01 1 English (US) 4 [ Shift Mod5 ] 38 AC01 1 English (US) 4 [ Lock Mod5 ]
Auch hier werden wieder der Keysym, sowie die konfigurierten Tasten ausgegeben.
Das aktuelle Layout kann man sich mittels des Parameters dump-keymap-wayland
(bzw. ...x11
oder ...evdev
) ausgeben lassen. Dies zeigt alle Konfigurationsoptionen des aktuellen Layouts in dem Format an in dem man auch die Layouts definiert, wobei alle Tasten in einem einzigen Abschnitt zusammengefasst werden. Falls man nicht weiß oder durchtesten möchte, welche Taste z.B. AC02
ist, kann man dies mittels folgender Abfrage leicht nachsehen.
xkbcli dump-keymap-wayland | grep 'key <AC02>'
key <AC02> { [ s, S, ssharp, U1E9E ] };
Dies zeigt basierend auf der Konfiguration an, dass AC02
aller Wahrscheinlichkeit nach S ist. Es werden folgende Symbole genutzt:
- Level 1: S =
s
- Level 2: ⇧ Shift + S =
S
- Level 3: RALT + S =
ß
- Level 4: ⇧ Shift + RALT + S =
ẞ
Basierend auf der Konfiguration nach diesem Wikiartikel sind die zu drückenden Tasten für die jeweiligen Level immer identisch.
Eigenes Layout
Hinweis: Es ist zu beachten, dass XKB bei Fehlkonfiguration sowohl den X-Server als auch jegliche Wayland-Compositoren zum Absturz bringen kann. Wenn man das Layout entwickelt, sollte man also sicherstellen, dass andere Programme und Dateien geschlossen oder gespeichert sind.
Will man ein eigenes Layout anlegen, so kann man dies entweder systemweit unter /usr/share/X11/xkb/symbols/mein-layout
oder userbezogen unter ~/.config/xkb/symbols/mein-layout
geschehen. Der Wiki-Artikel benutzt als Beispiel eine Tastatur mit englischem Layout (ANSI-US, QWERTY-Layout), prinzipiell lässt sich alles aus diesem Artikel genau so auf alle anderen Layouts anwenden.
Sofern man das eigene Layout bei der Erstellung auf dem Gerät testet, auf dem man es auch entwickelt, so sollte man sicherstellen, dass die Möglichkeit besteht, das System nur unter Verwendung der Maus sauber zu verlassen. Alternativ kann man sich z.B. per SSH zum Rechner verbinden und XKB im Remote-Terminal konfigurieren, so dass fehlende Funktionalität der Tastatur auf dem Gerät nicht relevant ist.
Konfigurations-„Header“
Sofern man nicht ein komplettes eigenes Layout erstellen will, sondern ein bestehendes Layout Anpassen will, so sollte man dies entsprechend einbinden.
~/.config/xkb/symbols/mein-layout
default xkb_symbols "basic" { Name[Group1] = "ANSI-US (Angepasst)"; include "us" include "level3(ralt_switch)" include "mein-layout(umlaute)" include "mein-layout(pfeile)" include "mein-layout(better-capslock)" };
Dieser Abschnitt wird mittels default
als Standardvariante definiert. Sofern man beim Anwenden des Layouts keine Variante angibt. Da der Abschnitt ist technisch nur eine Variante ist, kann optional auch mein-layout(basic)
benutzt werden. Es wird in deisem Abschnitt folgendes konfiguriert:
Name[Group1] = '...'
= Name der ersten Gruppe an Symbolen. Es können bis zu vier Gruppen definiert werden, die mittels verschiedener Modifier-Tasten aktiviert werden können, in diesem Wikiartikel aber nicht behandelt werden.include "us"
= Dies lädt das US-Tastaturlayout für die im Beispiel verwendete Tastatur, damit das eigene Layout vollständig ist, ohne dass man jede Taste explizit konfigurieren muss.include "level3(ralt_switch)"
Hiermit wird die Varianteralt_switch
aus dem Layoutlevel3
geladen. Dies ermöglicht es mittels RALT, den Modifier KeyISO_Level3_Shift
zu schalten.- Mittels weiterer
include
-Abschnitte können beliebig viele andere Layouts und Layout-Varianten eingebunden werden.
Die Abschnitte umlaute
, pfeile
, und better-capslock
werden im weiteren Verlauf dieses Artikels definiert. Sie werden in beliebiger Reihenfolge unterhalb des „Headers“ platziert und zeigen Beispielhaft einige Möglichkeiten der Definition auf.
Umlaute (normale Definition)
Das Beispiel nutzt eine ANSI-US-Tastatur, als solche verfügt sie nicht über Umlaute. Mittels der folgenden Konfiguration werden die Umlaute in einer Gruppe definiert.
partial alphanumeric_keys xkb_symbols "umlaute" { key <AC01> {[ a , A , adiaeresis , Adiaeresis ]}; key <AD09> {[ o , O , odiaeresis , Odiaeresis ]}; key <AD07> {[ u , U , udiaeresis , Udiaeresis ]}; key <AC02> {[ s , S , ssharp , U1E9E ]}; };
Das große Eszett (ẞ) ist kein Umlaut, passt aber dennoch gut in diese Gruppe. Es muss mittels seines Unicode-Codepoints referenziert werden („U+1E9E: 'LATIN CAPITAL LETTER SHARP S'“), da es keinem Keysym gibt. Alle anderen Definitionen nutzen den jeweiligen Keysym. Die direkte Angabe des jeweiligen Zeichens wird nicht unterstützt.
Pfeile (Ziffernblock-Besonderheiten)
Wenn man über die Tasten auf dem Ziffernblock Unicode-Pfeile „malen“ möchte, kann man folgende Konfiguration benutzen.
partial keypad_keys xkb_symbols "arrows" { // ⇙ ⇓ ⇘ ↙ ↓ ↘ // Level 1 2 3 4 // ------------------------------------------------ key <KP0> {[ KP_Insert , KP_0 , U21C5 , U21C4 ]}; key <KP1> {[ KP_End , KP_1 , U21D9 , U2199 ]}; key <KP2> {[ KP_Down , KP_2 , U21D3 , U2193 ]}; key <KP3> {[ KP_Next , KP_3 , U21D8 , U2198 ]}; key <KP4> {[ KP_Left , KP_4 , U21D0 , U2190 ]}; key <KP5> {[ KP_Begin , KP_5 , U21BA , U21BB ]}; key <KP6> {[ KP_Right , KP_6 , U21D2 , U2192 ]}; key <KP7> {[ KP_Home , KP_7 , U21D6 , U2196 ]}; key <KP8> {[ KP_Up , KP_8 , U21D1 , U2191 ]}; key <KP9> {[ KP_Prior , KP_9 , U21D7 , U2197 ]}; };
Dies verhält sich etwas unintutiv, da Numlock Mod2 schaltet. Daher sind auch die „Basisfunktionen“ an erster Stelle in der Definition, und dann erst die Numlock-Zahlen. Ohne Numlock wird bei 0 in den Einfügemodus gewechselt. Wenn Numlock an ist, wird 0
gesendet. Wenn man nun zusätzlich noch RALT drückt, werden einfache Pfeile gesendet, mittels RALT + ⇧ Shift doppelte.
Numlock Numlock+AltGr Numlock+AltGr+Shift ----------------------------------------------- 7 8 9 ↖ ↑ ↗ ⇖ ⇑ ⇗ 4 5 6 ← ↻ → ⇐ ↺ ⇒ 1 2 3 ↙ ↓ ↘ ⇙ ⇓ ⇘ 0 ⇄ ⇅
Bei deaktiviertem Numlock ändert sich die Belegung, da man nun wieder auf dem ersten Level ist.
- ⇧ Shift + 1/2/3/… wird zu 123, da mit ⇧ Shift in den zweiten Level gewechselt wird.
- RALT + 1/2/3/… wird zu ⇙⇓⇘, da mit RALT in den dritten Level gewechselt wird.
- RALT + ⇧ Shift + 1/2/3/… wird zu ↙↓↘, da mit RALT + ⇧ Shift in den vierten Level gewechselt wird.
Bei aktiviertem Numlock ist man in Level 2, es wird beim Drücken der Nummernblocktasten also immer automatisch Mod2 mitgeschaltet.
- Mod2 + RALT + 1/2/3/… wird zu ↙↓↘, da man mit Mod2+ISO_Level3_Shift in den vierten Level wechselt
- Mod2 + RALT + ⇧ Shift + 1/2/3/… wird zu ⇙⇓⇘, da man mit Mod2+Shift+ISO_Level3_Shift in den dritten Level wechselt
Da in den meisten Konfigurationen Numlock, wenn verfügbar, standardmäßig an ist und die normalen Pfeile (↙↓↘) in dieser Konfiguration „zuerst kommen“ sollen, liegen sie auf dem bei aktiviertem Numlock mittels RALT erreichbaren vierten Level.
„Better CapsLock“ (Aktionen ausführen)
Die Taste ⇪ Capslock, die es auf den meisten Tastaturen über der linken ⇧ Shift-Taste gibt, wird in vielen Fällen nicht, oder nur sehr sporadisch benutzt, dennoch passiert es vielen manchmal, dass sie beim drücken der linken ⇧ Shift-Taste versehentlich auf ⇪ Capslock kommen, und dies damit ungewollt aktivieren.
hidden partial modifier_keys xkb_symbols "better-capslock" { key <CAPS> { actions[Group1] = [ SetMods(modifiers=Shift), LockMods(modifiers=Lock) ] }; };
Diese Konfiguration sorgt dafür, dass in der ersten Gruppe (siehe oben) beim Drücken von ⇪ Capslock dieses nicht aktiviert wird, sondern stattdessen ein Shift
gesendet wird. Dies wird in der Konfiguration durch das Senden einer Aktion im ersten Layer bewerkstelligt. Da die Konfiguration deutlich in die Funktionalität der Modifier Keys eingreift, wird sie als hidden
definiert, um nicht versehentlich in andere Layouts hinein geladen zu werden.
Um Capslock dennoch bei Bedarf aktivieren zu können, wird im zweiten Layer (wie bei „normalen Tasten“ mittels ⇧ Shift zu erreichen) ebenfalls eine Aktion durchgeführt: hier wird Capslock dann umgeschaltet.
- ⇪ Capslock funktioniert wie ⇧ Shift
- ⇧ Shift + ⇪ Capslock aktiviert
Caps_Lock
- ⇪ Capslock funktioniert nun wie man es kennt
- ⇧ Shift + ⇪ Capslock deaktiviert
Caps_Lock
wieder - ⇪ Capslock funktioniert nun wieder wie ⇧ Shift
Damit kann man die Capslock-Funktion nicht mehr versehentlich einschalten, kann es aber dennoch aktivieren, wenn man es benötigt.
Ein Layout verwenden
Je nachdem, welches System man verwendet, wird das Layout unterschiedlich gesetzt.
Wayland
Wayland-Compositoren setzen das zu verwendende Keyboardlayout standardmäßig mittels XKB. Wie genau dies geschieht, ist abhängig vom verwendeten Compositor.
labwc zum Beispiel benutzt die Umgebungsvariable XKB_DEFAULT_LAYOUT
.
~/.config/labwc/environment
XKB_DEFAULT_LAYOUT='mein-Layout' [...]
Dies setzt mein-layout
mit allen weiteren Standardoptionen. Siehe Abschnitt zum Setzen des Tastaturlayouts im labwc-Wikiartikel.
Der Compositor Hyprland verwendet einen Abschnitt in der Konfiguration.
~/.config/hypr/hyprland.conf
input { kb_layout = mein-layout [...] }
Auch Hyprland erlaubt eine weitere Spezifizierung der Optionen und Verianten.
Es sei nochmals generell auf die Dokumentation des verwendeten Compositors verwiesen.
X
Sofern man noch X benutzt, wird XKB für das globale Einstellen benutzt, für die userbezogene Konfiguration kann man ein entsprechendes Tool verwenden.
Systemweit
Man kann sich hier an den Abschnitt zu X.org im Wiki-Artikel zur Einstellung von Arch auf Deutsch orientieren. In Option "XkbLayout" "de"
gibt man dann statt de
den Namen des erstellten Layouts an, im Beispiel also Option "XkbLayout" "mein-layout"
. Wenn man das Layout systemweit einstellt, sollte man es in /usr/share/X11/xkb/
ablegen, damit alle Useraccounts darauf zugreifen können.
Userbezogen
Für eine Userbezogene Konfiguration kann man, sofern die Desktopumgebung oder der Fenstermanager es nicht unterstützen, das Programm setxkbmap in den Autostart packen.
setxkbmap mein-layout
Damit wird der Standard-Abschnitt aus mein-layout
für die aktuelle X-Session geladen, dies ist von der Funktionsweise her identisch zur Xmodmap.
Siehe auch
- Xmodmap der veraltete, X-spezifische Weg
Weblinks
- Wiki der X.org-Foundation zu XKB
- Das Wayland Book über XKB
- Website An Unreliable Guide to XKB Configuration
- XKB-Protokollspezifikation
– Im „Appendix A. Default Symbol Transformations“ werden unterstützte „Umschreibungen“ für Sonderzeichen aufgelistet.