eurkey keyboard layout

Vorgeplänkel

Neulich hab ich mal wieder programmiert. Das ist ja nichts Ungewöhnliches, ich tue das ständig, oft auch öfter am Tag. Nur war es neulich mal wieder ausgiebige C++-Session und jeder, der C/C++ kennt, wird mir zustimmen, dass dafür ein deutsches Tastatur-Layout eher hinderlich ist, weil man oft benötigte Tasten kaum erreicht ohn sich die Finger entweder zu brechen oder mindestens mächtig zu verknoten.
Die von mir schon öfter angedachte Lösung: US-Layout! Warum? Weil man Semikolon, eckige und geschweifte Klammern, beide Slashes und all die anderen Zeichen, die man beim programmieren (bzw beim bedienen eines Linux-Rechners) ständig benötigt ohne Fingerverknotung erreichen kann.
Also habe ich mich mal auf die Suche nach einem 2. DasKeyboard Model 4C gemacht -- aber -- in US-Layout. Amazon-Suche: 2 Anbieter, keiner kann liefern. Ebay… ein Anbieter, Schwedisches Layout, maßlos überteuert. Tja, das von mir so geliebte DasKeyboard Model 4C (übrigens bis dato das einzige DAS ohne Zahlenblock) ist wohl ein Auslaufmodell.
Nach einiger Suche wie man sinnvoll ein US/ANSI-Layout auf ein DE/ISO-Layout umstellt, bin ich auf das EuroKey-Projekt von Steffen Brüntjen (https://eurkey.steffen.bruentjen.eu/) gestoßen und war umso erstaunter, dass es in Debian Buster tatsächlich als "eu"-Layout zur Grundausstattung des Basissystems gehört und ohne weiteres Dazutun mit einem simplen
          olly@horus $ setxkbmap -layout eu
          
aktiviert werden kann. Nach einigem herumprobieren stellt sich dann aber heraus, in welchem Detail das kleine Teufelchen diesmal steckt: und zwar in der Version. Das in Debian mitgelieferte KeyMap implementiert Version 1.2 des EurKey-Layouts, auf der Homepage ist allerdings schon die (mir persönlich viel besser gefallendere) Version 1.3beta zu finden.
Doch zum Glück gibt es GitHub! Unter https://github.com/xiamaz/eurkey.git findet sich ein fertiges Keymap für Linux und liefert für die Belegung der 3. und 4. Tastatur-Ebene (zu erreichen über AltGr bzw AltGr+Shift) ein fertiges XCompose-File mit.
Fehlt allerdings immernoch ein passendes KeyCap-Set (bei mechanischen Tastaturen wie meinem DasKeyboard mit Standard-Cherry-Schaltern kann man die "KeyCaps", also die kleinen Plastik-Kappen, welche die eigentliche Taste, also, sozusagen den "Knopf" darstellen, austauschen). Eine neue Tastatur kommt ja wohl nicht in Frage, erstens hab ich eine und zweitens gäbe es ja wie gesagt eh keine zu kaufen.
Also auf die Suche nach einem Layout machen… Einem EuroKey-Layout, von dem wahrscheinlich noch nie ein Mensch gehört haben dürfte ;) Und so kam es. Ein fertiges Layout bestellen, auf den DHL-Menschen warten, Tasten hinfummeln und loslegen -- diese Idee kann man sich mal getrost abschminken.
Und das führt uns nun nach Californien -- genauer gesagt nach wasdkeyboards.com, ein kleines Unternehmen im Sonnenstaat, wo man sich KeyCaps bedrucken lassen kann. Dafür muss man lediglich eine Vorlagen-Grafik mit Inkscape entsprechend seinen Wünschen anpassen und im Layout-Design-Tool der Website hochladen. Bei der Gelegenheit kann man -- wenn man möchte -- eine individuelle Farbe für jede Taste bestimmen, ein paar Tage warten und happy sein.
Aber… um ehrlich zu sein: Bevor ich knapp $100.00 für 105 kleine Plastik-Kappen(!!!) ausgebe, möchte ich schon wenigstens so halbwegs sicher sein, dass mein Vorhaben auch vernünftig gelingt. Dazu habe ich mir mal überlegt, welche Anforderungen und Wünsche ich an meinen Rechner und das neue Keyboard-Layout hab:
  • Da es sich um ein komplett neues Layout handelt, bringt es naturlich den Umstand mit, dass ich mein Gehirn und meine Finger darauf trainieren muss -- ganz ehrlich: da ich nun ununterbochen seit knapp 30 Jahren täglich das DE-Layout (das ganze DE-Layout und nichts als das DE-Layout) benutze, muss man sich da schon mal nen Kopf machen, ob man so eine Umgewöhnung (bzw: dauerhaften mentalen Parallel-Betrieb, weil man ja auch an PCs mit deutschem Layout arbeiten muss) hinbekommen kann.
  • Apropos Parallel-Betrieb: Erstens hat mein Notebook neben dem heiligen DasKeyboard noch ein eingebautes Keyboard und zweitens kann es ja mal vorkommen, dass ich unterwegs ein USB-Keyboard mit deutschem Layout anschließen möchte. Im Prinzip wäre es toll, einen einfachen Weg zu haben, alle Möglichkeiten zu unterstützen und immer dasjenige Zeichen auf dem Bildschirm zu sehen, welches auch auf der zuvor gedrückten Taste aufgedruckt ist (es könnte ja auch mal vorkommen, dass eine andere Person an meinem Rechner ... ... ok, ok, vergessen wir das; das kommt nicht vor :) )
  • Bei meinen ganzen Recherchen rund um US-, UK- & EU-Layout (welche sich sehr ähnlich sind und alle für mich zum programmieren und im Alltag in Frage kämen) ist mir aufgefallen, dass ich an allen Layouts Änderungswünsche hätte -- was ja unter Linux nun wirklich kein großer Akt ist.
  • Um weiterhin möglichst dicht bei einem nativen, von nahezu jedem System unterstütztem Layout zu bleiben, also z.B. die deutschen Umlaute auch ohne vorherige langwierige Installation von Gerätetreiben oder Tastaturlayout-Gefrickel zu haben, ist die Sache mit dem EuroKey-Layout eigentlich mehr als naheliegend. Es basiert auf einem Default-US-Layout und implementiert die deutschen Umlaute sowie alle in Europäischen Sprachen verwendeten Sonderzeichen über die AltGr-Taste und eignet sich damit doppelt gut im Alltag und beim Programmieren.
  • Ich möchte die komplett unbenutzte CAPS-LOCK-Taste sinnvoller verwenden als sie zu ignorieren, zumal sie auf der Tastatur an einer sehr wertvollen Stelle --nämlich in unmittelbarer Nähe der Finger -- liegt. Es gab doch mal in den 60er oder 70er oder was-weiß-ich-wann-Jahren eine Tastatur mit so einer Hyper-Taste... ich denke diesen Gedanken werde ich mal etwas tiefgreifender ergoogeln :)
  • In dem Zuge kann man sich auch mal die SCROLL-LOCK-Taste anschauen, welche ebenfalls komplett ungenutzt herumliegt und eigentlich was sinnvolles tun könnte -- z.B. könnte man damit den Passwort-Manager starten und/oder einen Auto-Login ausführen :)

Ok, also jetzt gibt es mit dem EU-Layout nur ein klitzekleines Problem (eigentlich ist das nur für mich ein Problem, glaub ich): Die "< | >"-Taste! Die kleiner-als und größer-als-Zeichen sind im EU-Layout rechts unten via Shift zu erreichen -- das ist absolut perfekt, was noch fehlt um ein Linux zu bedienen ist die Möglichkeit eine Tilde (˜) schnell zu tippen -- das werde ich in meinem Layout definitiv anpassen. Wobei ich mich ehrlich gesagt hab wirklich ziemlich schwer mit der Entscheidung getan hab wie und wo ich die "< | >", "˜#", "\|", & Anführungszeichen-Tasten hinfummeln soll, da sich beim Wechsel vom US/ANSI-Layout zum UK/ISO-Layout genau hier die Unterschiede ergeben. Das ANSI-Layout ist dasjenige mit der kleinen, einzeiligen Enter-Taste, das in Europa verbreitete ISO-Layout verwendet diese abgeknickte, 2-zeilige Enter-Taste. Mein Problem ist nun also, dass mein DasKeyboard die ISO-Bauform und somit eine Taste mehr hat, als das ANSI-Layout, für welches auch das EuroKey-Layout entworfen wurde, weil es ja im Grunde genommen das US-Layout vollständig und 1:1 übernehmen will (was ich persönlich für eine wahnsinnig gute Idee halte, weil das nunmal auch heutzutage immernoch der Standard ist, den alle Computer auf BIOS-Ebene verwenden).
Es gibt -- zumindest nach meinen Recherchen -- kein offizielles, bzw verbreitetes US-ISO-Layout. US-Layout ist eben ANSI. Punkt. Jedoch ist mit mir mehrfach aufgefallen, dass das UK/ISO-Layout oft als US/ANSI- Ersatz verwendet wird. Hier einmal kurz die Wesentlichen Unterschiede der beiden Layouts
  • Das UK/ISO-Layout hat also eine Taste mehr als US/ANSI
  • Die Rechte "Alt"-Taste wird durch "AltGr" ersetzt
  • Die das #-Symbol wird durch £ ersetzt (auf der 3 in der oberen Zahlenreihe)
  • Die zusätzliche Taste wird neben der Enter-Taste platziert um das verschwundene #-Symbol zu ersetzen
  • @ und " werden vertauscht
  • ˜ wird auf die #-Taste verschoben und durch ¬ auf der backquote-Taste ersetzt
  • AltGr + backquote-Taste ergibt ¦
  • Die \-Tase wird links neben die Z-Taste nach unten links verschoben
  • Die Enter-Taste ist 2-zeilig etwas schmaler um Platz für die #-Taste zu schaffen

Also eigentlich ist alles ziemlich glasklar, bis auf die \ und #-Tasten. Die Idee # und ~ auf einer gemeinsamen Taste (und auch noch ohne das olle AltGr- Fingerverknotungsgefummel) find ich bei Briten eigentlich ganz nett und hätte diese Taste viel lieber als die deutsche "< | >"-Taste. Dazu kommt, dass ˜ sonst nur über Shift + backquote erreichbar wäre, was ich eigentlich ziemlich umständlich finde, zumal man die Taste als Linuxer ständig braucht! Ergo: Die Taste an sich übernehme ich von den Insulanern, aber die Reihenfolge der Zeichen auf der Taste sowie ihre Position allerdings nicht. -- Problem gelöst.
So, nun ist die Sache eigentlich innerlich schon beschlossen, bekräftigt durch die Tatsache, dass mir die Umstellung des Layouts weniger Sorgen und Probleme bereitet als zuvor befürchtet -- ich habe nämlich mal das EuroKey-Layout auf meinem DasKeyboard mit deutschen Layout laufen lassen und somit mal alle folgenden Konfigurationsänderungen sowie Recherchen zum Thema durchgeführt und ich muss schon sagen... der Umstieg ist einfacher als gedacht: Die über AltGr erreichbaren Umlaute machen eigentlich gar keine Probleme, die Punktuationszeichen sowie Bindestriche und Slashes sind auch relativ problemlos. Was allerdings ausnahmlos Probleme macht ist das mit dem Z vertauschte Y! Das geht immernoch mit absoluter Sicherheit zu nahezu 100% schief :) ... aber ich denke daran wird man sich gewöhnen, im Prinzip bleibt ja auch nichts anderes übrig :)

Das Layout

Hier nun das fertige Layout:

Die Installation der Keymap

Das Keymap-File

So, nun aber mal zur Konfiguration: Als erstes das git clonen:
olly@horus:~/programs$ git clone https://github.com/xiamaz/eurkey.git && cd eurkey
    
Dann erstmal das Systemweite Keymap installieren:
olly@horus:~/programs/eurkey$ sudo make

XCompose einrichten

Und das XCompose-File (ist für die 3. und 4. Tastaturebene zuständig) nach ~/.XCompose kopieren:
olly@horus:~/programs/eurkey$ cp XCompose ~/.XCompose
Ich persönlich finde aber, dass es irgendeine Systemweite Löhsung sein sollte, deshalb habe ich die Datei nach /etc/X11/EurKey-XCompose kopiert und in ~/.XCompose includiert:
   include "/etc/X11/EurKey-XCompose"
Damit auch neu angelegte Benutzer von der 3. & 4. Tastatur-Ebene profitieren, habe ich gleich mal eine Kopie der .XCompose nach /etc/skel kopiert. Nun können wir das neu installierte KeyMap mit dem Namen "eurkey" benutzen (zur Erninnerung: das "eu"-Layout implementiert die alter Version 1.2, wohin- gegen "eurkey" die neuere 1.3 implementiert)

Der erste Test

Das kann man auch gleich mal testen:
$ setxkbmap -layout eurkey
Nun sollten sich nahezu alle Tasten wie auf dem oben abgedruckten Layout bedienen lassen … … ALLE TASTEN??? Nein :) denn ich habe das Layout ja nach meinen eigenen Wünschen angepasst

Eigene Änderungen am Layout implementieren

Die #-Taste

Wie gesagt möchte ich aus dem UK-Layout die ~#-Taste übernehmen, allerdings mit genau umgekehrter Reihenfolge der 1. und 2. Ebene. Also ~ ist ohne Shift, und das #-Zeichen ist mit Shift erreichbar. Zusätzlich möchte ich noch | und ¦ via AltGr erreichbar haben. Das bedingt folgende Änderung in der eben installierten Keymap /usr/share/X11/xkb/symbols/eurkey:
 key <LSGT> {[asciitilde, numbersign, bar, brokenbar]}; 

Die zusätzlichen mathematischen Symbole definieren

Zusätzlich habe ich auf AltGr+Shift+M,Shift+ das ⊖-Zeichen (analog zum bereits vorhandenen ⊕-Zeichen auf der +-Taste), sowie das 𝑥-Zeichen auf AltGr+Shift+M,X implementiert. Dazu müssen in /etc/X11/EurKey-XCompose die folgenden Zeilen hinzugefügt werden:
      <Multi_key> <underscore> : "⊖"
      <Multi_key> <x> : "𝑥"
      
Damit sollte das Layout vollständig implementiert sein.

EurKey als Default beim booten einstellen

Um das eurkey-Layout beim Booten zu aktivieren muss lediglich die /etc/defaults/keyboard wie folgt angepasst werden: XKBMODEL="pc105"
XKBLAYOUT="eurkey"
XKBVARIANT=""
XKBOPTIONS=""

Die Hyper-Taste (oder: CAPS-LOCK bekommt endlich einen Sinn)

Eine weitere Anforderung an mein neues Keyboard-Layout war ja, dass die CAPS-LOCK endlich eine sinnvolle Funktion bekommt! Das ist unter Debian relativ easy, allerdings versteckt sich hier auch ein kleines Teufelchen... Wir schauen mal in die Datei /etc/defaults/keyboard... Dort finden sich die Tastatur-Einstellungen. Unter XKBOPTIONS kann man mit
XKBOPTIONS="caps:hyper"
einstellen, dass die CAPS-LOCK-Taste keine Einrast-Funktion mehr besitzen soll sowie als Mod-Key fungieren soll. Nach einem Neustart des X-Servers kommt dann allerdings die Ernüchterung: xev zeigt zwar Hyper_L an, xbkwatch allerdings offenbart, dass die neu belegte CAPS-LOCK dieselben Mod-Bits auslöst wie die Super-Taste (auch bekannt als Windows-Taste). Das scheint nach meinen Recherchen eine Debian-Eigenart zu sein, und somit lässt sich dieses Phänomen auch in Debian-Derivaten (Ubuntu, Arch usw) festellen. Aber keine Sorge, denn für dieses Verhalten gibt es sowohl eine Erklärung als auch eine Lösung. Die Erklärung zuerst: Beide Tasten sind per Default auf denselben Modifier (mod4) definiert. Die Lösung: Wir definieren beide Tasten in entsprechend unterschiedliche Modifier. Dazu erstellen wir die neue Datei /etc/X11/Xsession.d/98super/hyper-key mit folgendem Inhalt:
        /usr/bin/xmodmap -e 'remove mod4 = Hyper_L'
        /usr/bin/xmodmap -e 'add mod3 = Hyper_L'
      
Es mag auch über mir noch unverständliche Definitionen in der /usr/share/X11/xkb/symbols/eurkey gehen, aber da habe ich das auch nach mehreren Versuchen nicht hinbekommen. Wer es weiß wie das zu definieren ist, darf es mir sehr gern mitteilen :) Um unser nagelneues Hyper-Key zu testen habe ich mir in meiner sxhkd-Config einen entsprechenden Eintrag erstellt:
hyper + g
          gvim
Wenn der Vim bei CAPS-LOCK+G startet und bei Super+G (also Win+G) nicht, dann ist alles perfekt.

SCROLL-LOCK ebenfalls sinnvoll belegen

Wo wir gerade dabei sind ungenutzte Tasten sinnvoll zu belegen: Mal ehrlich, SCROLL-LOCK ist doch eigentlich auch so ein Kandidat, der ein eher unbeachtetes Dasein fristet. Da ich unter bspwm mit sxhkd einige Probleme habe die Scroll-Lock korrekt und zuverlässig zu konfigurieren, habe ich sie im Rahmen der Default-Config auf XF86LaunchF (das ist eine rein virtuelle Taste, welche uns der Xorg yur Verfügung stellt) gemapped. Dazu in /etc/defaults/keyboard die Option "sclk:XF86LaunchF" hinzufügen: XKBOPTIONS="caps:hyper,sclk:XF86LaunchF" Die Taste XF86LaunchF kann ich nun im sxhkd entsprechend meiner grenzenlosen Wünsche konfigurieren.

Compose-Taste

Der findige Leser wird festgestellt haben, dass im o.g. Layout die Tasten AltGr und R-Strg mit der zusätylichen Aufschrift "Compose" versehen sind und der neugierige Leser wird sich nun fragen was das soll... Mit der Compose-Taste lassen sich zusammengesetzte Zeichen erzeugen. Drückt man also
Compose, " , o
so erhält man ein ö
Damit lassen sich dann so ziemlich alle Zeichen erzeugen für die man keine Taste auf der Tastatur hat. Nice-To-Have und manchmal brauche ich das auch und dann bin ich froh, dass es einfach funktioniert.
Die Definition der Compose-Taste geht relativ einfach über eine weitere Option in /etc/defaults/keyboard. Unsere XKBOPTIONS-Zeile sieht nun also so aus:
XKBOPTIONS="compose:rctrl-altgr,caps:hyper,sclk:XF86LaunchF"

Mehrere Layouts für mehrere Keyboards

Die einfache, aber etwas unschöne Art

Wie bereits erwähnt ist da ja noch die Anforderung mehrere Layouts zu unterstützen, weil an meinem Notebook meistens nunmal mehrere Keyboards angeschlossen sind. Zum Einen das interne, zum Anderen (zumindest wenn ich nicht unterwegs bin) mein hochgeschätztes DasKeyboard Model 4C (ich kanns gar nich hoch genug loben). Das DasKeyboard wird demnächst ein Euro-Layout bekommen, diese Entscheidung steht schon fest, nachdem bis jetzt alles so gut läuft. Das interne Notebook-Keyboard hat nunmal ein deutsches Layout und ich denke es sinnvoll, wenn man das auch als solches verwendet. Eigentlich ist das ganz easy. In der /etc/default/keyboard definieren wir ein zweites, sekundäres Layout und eine tolle Tastenkombination mittels derer wir zwischen den definierten Layouts wechseln können:
      XKBMODEL="pc105"
      XKBLAYOUT="de,eurkey"
      XKBVARIANT="nodeadkeys,"
      XKBOPTIONS="compose:rctrl-altgr,caps:hyper,sclk:XF86LaunchF,grp:alt_shift_toggle,grp_led:caps"
    

Diese Einträge sagen also aus, dass wir primär das de-Layout und sekundär das eurkey-Layout verwenden wollen (hab ich erstmal so herum eingestellt, meine eurkey-Tasten sind ja noch im Californischen KeyCap-Drucker). Des Weiteren definieren wir, dass wir via Alt+Shift benutzen möchten um zwischen den Layouts hin- und her zu schalten (grp). Mit grp_led:caps teilen wir dem Xorg mit, er möge bitte die Caps-Lock-LED einschalten, sobald das sekundäre Layout aktiviert ist. Die CAPS-LOCK-Taste haben wir ja eben stillgelegt (bzw von ihrer LOCK-Funktion befreit), sodass die kleine Lampe auf der Tastatur völlig nutzlos wäre (jupp, am Notebook selber ist nicht eine einzige LED verbaut, welche den Status von CAPS-/SCROLL- oder NUM-LOCK anzeigt).
Aber auch hier hat jemand ein Teufelchen versteckt -- wir versuchen mal es zu finden... Es ist das Komma in der XKBVARIANT-Angabe :) Es MUSS!!! für jedes Layout eine korrespondierende Variant-Angabe geben! Wenn keine besondere Variante für ein bestimmtes Layout verwendet werden soll, dann MUSS!!! trotzdem ein entsprechender Leerstring für die Variante angegeben werden! Wenn man also die Layouts "de,us,ch" konfiguriert und für de die Variante "dvorak" und für us und ch jeweils die Default-Varianten benutzen möchte, dann muss man das auch angeben: "dvorak,,"
Nach einem Neustart des X-Servers wird man feststellen, dass der Wechsel der Layouts gar wunderbar funktioniert. Alt+Shift drücken und alle Keyboards benutzen entweder das deutsche oder entsprechend das Euro-Layout. Wunderschön :)
Doch moment mal... ALLE Keyboards benutzen entweder de oder eurkey?! Hm, also eurkey macht auf der Notebook-internen Tastatur wenig sinn, die ist ja mit dem deutschen Layout beschriftet. Und das de-Layout macht (zumindest bis die neuen KeyCaps endlich ankommen) auf dem DasKeyboard keinen Sinn, denn das wird ja ab demnächst mit dem eurkey-Layout beschriftet sein.

Ein Keyboard, ein Layout

Wie in den Anforderungen definiert möchte ich folgendes erreichen: Das interne Notebook-Keyboard arbeitet immer mit dem de-Layout. Mein tolles DasKeyboard Model 4C arbeitet per default in eurkey, lässt sich aber nach de umschalten. Alle anderen Keyboards arbeiten in de.
Das erreichen wir wie folgt: via xinput lassen wir uns mal alle Eingabe-Geräte anzeigen, die der laufende X-Server erkannt hat und verwendet:
$ xinput
Nun können wir entweder über
$ setxkbmap -device <dev-id-aus-xinput> -layout <foo>
das aktuelle Layout der zur Device-ID korrespondierenden Tastatur das Layout foo definieren oder die Einstellung persistent konfigurieren.
Dazu suchen wir uns entsprechende Unterscheidungsmerkmale der Tastaturen in der Ausgabe von xinput und gehen in die /etc/X11/xorg.conf (oder eine neue Datei in Xorg.conf.d) und definieren verschiedene Optionen für die jeweiligen Keyboards:
    Section "InputClass"
      Identifier "DefaultKeyboards"
      MatchIsKeyboard "on"
      MatchDevicePath "/dev/input/event*"
      Driver "evdev"
      Option "XkbLayout" "de"
      Option "XkbVariant" "nodeadkeys"
    EndSection

    Section "InputClass"
      Identifier "DasKeyboard"
    #	MatchDevicePath "/dev/input/event*"
      MatchIsKeyboard "on"
      MatchVendor "Metadot"
      Driver "evdev"
      Option "XkbLayout" "eurkey,de"
      Option "XkbVariant" ",nodeadkeys"
    EndSection
  
Das funktioniert wie man es erwarten würde: Das DasKeyboard startet in eurkey und lässt sich via Alt+Shift umschalten, wohingegen die interne Tastatur mit de startet und sich mit Alt+Shift eben NICHT dazu bewegen lässt das Layout zu wechseln.

Aktuelle Änderungen

Mit der Benutzung vom BSPWM hat sich die Kombination von Alt+Shift zum Wechsel des Layouts als ein wenig ungünstig erwiesen, sodass ich das nun auf die beiden Control-Keys geändert habe. Die aktuelle /etc/default/keyboard sieht nun wie folgt aus:
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="de,eurkey"
XKBVARIANT="nodeadkeys,"
XKBOPTIONS="compose:rctrl-altgr,caps:hyper,sclk:XF86LaunchF,grp:ctrls_toggle,grp_led:caps,terminate:ctrl_alt_bksp,nbsp:level2"
BACKSPACE="guess"

Das Ergebnis...

... kann sich durchaus sehen lassen: