Hotkeys

Aus wiki.archlinux.de

Viele Tastaturen (hauptsächlich die von Laptops) besitzen einige Spezialtasten, die sogenannten Hotkeys, die dazu vorgesehen sind Anwendungen zu starten bzw. zu steuern oder spezielle Zeichen darzustellen, die nicht Bestandteil der Standard Keymaps sind. Auf einem Linux-Rechner funktionieren diese Tasten meist nicht „out-of-the-box“. Aber, wie so oft, gibt Linux einem die Freiheit diese Tasten so zu konfigurieren, dass sie genau das tun was man will. Nur wenige Hotkeys werden gar nicht vom Linux-Kernel erkannt und können deshalb nicht genutzt werden.

Es gibt viele Möglichkeiten unter Linux mit Hotkeys umzugehen. Die Lösungen auf dieser Seite erlauben es die Hotkeys unabhängig vom verwendeten Window Manager bzw. der verwendeten Desktop-Umgebung zu benutzen. Es werden drei verschiedene Möglichkeiten gezeigt.


  1. ein Zeichen in der Konsole ausgeben
  2. ein Zeichen in X ausgeben
  3. eine Anwendung in X starten bzw. steuern


In X kann eine Hotkey entweder zum ausgeben eines Zeichens oder zum starten/steuern einer Anwendung genutzt werden. Beides gleichzeitig funktioniert nicht. Es gibt auch noch eine vierte Möglichkeit (eine Anwendung in der Konsole starten), die durch einen Work-Around realisiert werden kann, auf den später, bei der Erklärung der ersten Methode, kurz eingegangen wird.

Eine andere Methode die Hotkeys zu nutzen ist der Einsatz umfangreicherer Anwendungen wie z.B. Keytouch oder Lineak. Diese Anwendungen greifen normalerweise auf die Daten bekannter Tastaturen zurück. Da es aber immer neue Tastaturen geben wird und längst nicht alle existierenden erfasst sind, werden diese Daten wohl nie vollständig sein. Die hier beschriebene Methode erlaubt es dem Nutzer mit den System-Internas zu arbeiten und eine auf sein System maßgeschneiderte Konfiguration zu erstellen. Außerdem gehen die anderen Lösungen davon aus, dass man die Hotkeys nur in X nutzen will, obwohl auch Liebhaber der Konsole von ihnen profitieren können.

Alle Tasten die man unter Linux benutzen kann haben einen Scancode, dem ein Keycode zugeordnet ist. Diesem Keycode ist wiederum ein Zeichen der Konsolen_Keymap zugeordnet. Der Keycode wird unter X in einen anderen Code übersetzt, den die X Keymaps mit einem bestimmten Zeichen oder einem auszuführenden Kommando verknüpft. Wenn eine Hotkey nicht funktioniert, finden ein oder mehrerer dieser Dinge nicht statt. Zuerst muss also herausgefunden werden wo das Problem liegt. Diese Diagnose wird im ersten Abschnitt beschrieben, die möglichen Szenarien werden dort zusammengefasst, so das man nach der Diagnose weiß mit welchem Abschnitt man weitermachen muss. Zuerst muss festgestellt werden ob die Taste einen Scancode hat. Ist dies nicht der Fall, sieht es schlecht aus und die Taste kann höchst wahrscheinlich nicht genutzt werden. (Für einige Acer-Modelle gibt es allerdings ein Kernel Modul, acerhk, mit dem evtl. auch solche Tasten erkannt werden). Falls sie einen Scancode, aber keinen Keycode hat muss dem Scancode ein Keycode zugeordnet werden; dies wird im zweiten Abschnitt beschrieben. Wenn die Taste bereits einen Keycode hat, oder ihr mit Hilfe des zweiten Abschnittes einer zugewiesen wurde, können der Taste eine oder mehrere der oben aufgelisteten Aufgaben zugewiesen werden. Wie das geht wird in den Abschnitten drei bis fünf erklärt. Der dritte Abschnitt erklärt wie man mit der Taste ein Zeichen auf in Konsole ausgibt, der vierte Abschnitt wie man per xmodmap ein Zeichen in X ausgibt, und der fünfte Abschnitt wie man mittels xbindkeys eine Anwendung in X startet.

Diagnose

Der allgemeinste Weg die Situation zu analysieren ist in die Konsole zu wechseln und das 'showkey' Utility zu benutzen. Beachte: das Utility wird unter X nicht funktionieren!

als erstes wird showkey ausgeführt:

 $ showkey

Ohne Angabe von Optionen wartet 'showkey' zehn Sekunden lang auf eine Tastatureingabe (nach zehn Sekunden beendet es sich automatisch) und gibt den Keycode der gedrückten Taste aus. Zwei Szenarien sind möglich:

  • Es wird nichts angezeigt: in diesem Falle hat die Taste keinen Keycode und dieser Abschnitt muss weiter gelesen werden.
  • Einige Hexadezimal-Zahlen werden angezeigt: in diesem Falle hat die Taste bereits einen Keycode und es kann mit Abschnitt 3, 4 oder 5 weiter gemacht werden. Je nach dem was mit der Taste gemacht werden soll.

Trifft das erste Szenario zu, muss herausgefunden werden, ob die Taste wenigstens einen Scancode hat. Dabei hilft wieder 'showkey'. Diesmal mit der Option '-s'.

 $ showkey -s

Es sind wieder zwei Szenarien möglich:

  • Es wird nichts angezeigt: Die Taste wird gar nicht vom Kernel erkannt und kann nicht genutzt werden. Für einige Acer Modelle gibt es das acerhk Kernel-ModulAUR im AUR, evtl. funktioniert die Taste damit.
  • Ein Dezimal-Code wird angezeigt: Die Taste hat einen Scancode, dem ein Keycode zugewiesen werden muss. Wie das geht wird im folgenden Absatz beschrieben.

Scancodes mit Keycodes assoziieren

Um Scancodes einen Keycode zuzuordnen brauchen man das Utility 'setkeycodes', das, wie man der man page entnehmen kann, Scancodes mit Keycodes assoziiert. Setkeycodes braucht zwei Argumente; das erste ist der Scancode und das zweite der Keycode. Es ist nicht immer ganz einfach die richtigen Werte für diese Argumente herauszufinden. Die Ausgabe von 'showkey -s', die im vorherigen Abschnitt benutzt wurde, ist nicht immer eindeutig, da manche Hotkeys (und auch normale Tasten) einen doppelten Scancode generieren. Im System Log nachzugucken ist der einfachste Weg den exakten Scancode herauszufinden. Jedes mal wenn eine Taste gedrückt wird, die einen Scancode aber keinen Keycode besitzt, wird vom Kernel vorgeschlagen 'setkeycodes' zu benutzen um der Taste einen Keycode zuzuordnen. Der Scancode der Taste wird ebenfalls ausgegeben. Die Meldung findet man im System Log. Aber auch dieser Code ist nicht immer brauchbar so wie er ist. Wenn er aus vier Zeichen besteht und mit einem kleinen 'e' beginnt kann er als erstes Argument für 'setkeycodes' verwendet werden. Sollte er nur aus zwei Ziffern bestehen, muss man ihm '0x' voranstellen. Angenommen der Kernel gibt 71 als Scancode aus, wäre das erste Argument für 'setkeycodes' 0x71.

Das zweite Argument muss folgende Bedingungen erfüllen:

  1. der Keycode muss im Bereich 1-127 liegen
  2. der Keycode muss noch frei sein, d.h. ihm darf noch kein Zeichen in der Kemap zugeordnet sein.

Um die zweite Bedingung erfüllen zu können, muss man einen Blick in die verwendete Keymap werfen. Welche Keymap verwendet wird kann man in der /etc/rc.conf sehen (KEYMAP="<gewählte-keymap>"). Die Keymaps sind in einem der Unterverzeichnisse unter /usr/share/kbd/keymaps/i386/ gespeichert. Es sind gzip2 komprimierte Text Dateien. Im folgenden Beispiel wird angenommen es wird die "de-latin1-nodeadkeys" Keymap benutzt.

Zuerst muss die Datei entpackt werden.

# gunzip /usr/share/keymaps/i386/qwertz/de-latin1-nodeadkeys.map.gz

Jetzt kann sie gelesen werden (manchmal kann less auch gzip Dateien lesen, in diesem Fall entfällt das Entpacken)

# less /usr/share/keymaps/i386/qwertz/de-latin1-nodeadkeys.map.gz

Es muss ein Keycode gewählt werden der nicht mit einem der bereits verwendeten in Konflikt steht (2. Bedingung) Die meisten Zeilen haben folgendes Format:

keycode <keycode> = <keysym>

Die Zeilen sind nach den Keycode-Werten sortiert. Also ist es leicht den höchsten von der Keymap verwendeten Keycode zu finden. Das zweite Argument für 'setkeycodes' muss zwischen dem höchsten verwendeten Wert und 127 liegen.

Angenommen 112 liegt in diesem Bereich, so kann nun 'setkeycodes' verwendet werden:

# setkeycodes 0x71 112

Wenn man jetzt 'showkey' ausführt, sieht man, dass die Hotkey nun den Keycode 112 hat. Allerdings gilt das nur für die Dauer der aktuellen Session. Um der Hotkey bei jedem Booten den Keycode 112 zuzuordnen kann man folgende Zeile in /etc/rc.local schreiben:

setkeycodes 0x71 112 &

Zeichen auf der Konsole darstellen

Auf der Konsole kann man die Hotkey nutzen um ein bestimmtes Zeichen auszugeben. Außerdem kann man Zeichenfolgen und einige Escape-Sequenzen ausgeben. Wenn die Zeichenfolge ein Befehl ist und danach das Escape-Zeichen für eine neue Zeile steht, wird der Befehl ausgeführt.

Um dies zu realisieren, könnte man die verwendete Konsolen-Keymap verändern. Dies ist allerdings nicht ratsam, da die Keymap eine wichtige Datei ist und jedes mal überschrieben wird wenn das Paket zu dem sie gehört aktualisiert wird. Es ist besser eine "persönliche" Keymap in die bestehende zu integrieren. Das geht mit 'loadkeys'.

Zuerst muss die persönliche Keymap erstellt werden. Man kann sie speichern wo man will. Der Übersichtlichkeit wegen sollte man (teilweise) die Hierarchie der default Keymaps unter /usr/local imitieren. Also:

# mkdir -p /usr/share/kbd/keymaps
# touch  /usr/share/kbd/keymaps/personal.map

Mit einer persönlichen Keymap ist es auch möglich die Belegung von Tasten zu ändern die bereits in der default Keymap definiert sind. Beim Laden der persönlichen Keymap mit 'loadkeys' werden die Anweisungen der default Keymap mit denen der persönlichen überschrieben falls beide eine Anweisung für die selbe Taste beinhalten.

Man braucht zwei Anweisungen in der persönlichen Keymap. Zuerst die Keycode-Anweisung, (mit dem Format, das in der default keymap zu sehen ist). Diese Anweisung ordnet einem Keycode ein Keysym zu. Keysyms repräsentieren Tastaturaktionen, wie zum Beispiel Ausgeben von Zeichen oder Zeichenfolgen, Wechseln von Konsolen oder Keymaps, den Rechner booten usw. Eine Komplette Liste kann mit 'dumpkeys' angezeigt werden.

$ dumpkeys -l

Die Meisten sind jedoch intuitiv. Wenn die Hotkey ein 'e' ausgeben soll, lautet die Anweisung:

 keycode 112 = e

Soll die Hotkey das Euro Zeichen ausgeben, lautet die Anweisung:

keycode 112 = euro

Einigen Keysyms sind keine Tastaturaktionen zugeordnet. Besonders Keysyms die sich aus einem großen F gefolgt von einer zweistelligen Zahl größer 30 zusammensetzen sind immer frei. Das kann man sich zu nutze machen, wenn man mit der Hotkey eine Zeichenfolge ausgeben oder andere Aktionen ausführen will. Zuerst ordnet man dem Keycode solch ein Keysym zu:

keycode 112 = F70

Dann wird mit einer anderen Anweisung dem Keysym eine Aktion zugeordnet. Soll die Hotkey z.B. "Hallo" ausgeben, lautet die Anweisung:

string F70 = "Hallo"

Das mag als nicht besonders nützlich erscheinen. Aber man kann auf diese Weise Befehle in der Konsole ausgeben und ausführen. Um ein ausgegebenen Befehl auszuführen, muss dem Befehl die Escape-Sequenz für eine neue Zeile angehängt werden. Soll das Hotkey z.B. das „Hibernate“-Script ausführen sehen die Anweisungen in der persönlichen Keymap so aus:

keycode 112 = F70
string F70 = "/usr/sbin/hibernate\n"

Damit die persönliche Keymap auch benutzt wird, muss sie mit 'loadkeys' geladen werden:

loadkeys /usr/share/kbd/keymaps/personal.map

Auch in diesen Falle sind die Änderungen nur für die aktuelle Session gültig. Soll die persönliche Keymap bei jedem Booten des Rechners geladen werden, muss eine weitere Zeile in /etc/rc.local geschrieben werden. Die loadkeys-Zeile sollte nach der setkeycodes-Zeile kommen, da die persönliche Keymap ja auf die Keycodes die mit 'setkeycodes' erzeugt werden zugreift.

loadkeys -q /usr/share/kbd/keymaps/personal.map&

Die Option '-q' unterbindet nur die Ausgabe einer Bestätigungsmeldung während des Bootvorgangs.

Zeichen in X darstellen

Wenn ein Zeichen einen Keycode im System hat, wird es auch in X erkannt. Der X-Keycode ist allerdings NICHT gleich dem System-Keycode. Falls man der Hotkey, wie im ersten Abschnitt beschrieben, einen Keycode zugeordnet hat, kann dieser nicht unter X verwendet werden. X vergibt einen eigenen Keycode. Aber die Taste muss aber dazu einen System Keycode haben. Die traditionelle Methode einer Taste ein Zeichen in X ausgeben zu lassen ist 'xmodmap'. Xmodmap ist grob gesagt das X-Equivalent zu 'loadkeys' (siehe Abschnitt 3).

Über die Einrichtung und Konfiguration von Xmodmap gibt der entsprechende Wiki-Artikel Auskunft.

Anwendungen in X starten

Es gibt verschiedene Programme die das Ziel haben unter X-Anwendungen bestimmten Tasten (oder Tastenkombinationen) zuzuordnen. Die Programme folgen zwei Haupt-Philosophien: einige nutzen Daten existierender Tastaturen. Wenn das Tastatur-Modell definiert wurde, ordnen diese Programme den Hotkeys die 'richtigen' Aktionen zu (z. B. in Bezug auf Icons auf den Tasten). Einige andere erlauben es einer beliebigen Taste (oder Tastenkombination) eine beliebige Aktion zuzuordnen. Die Programme, die diese Philosophie verfolgen bieten mehr Flexibilität bei der Belegung der Tasten.

Die Konfigurations Dateien des Window Managers zu nutzen ist eine weitere Option. Dies ist eine sehr gute Lösung, obwohl es oft nötig ist, dass die Taste (mit xmodmap) einem Keysym zugeordnet ist, den der Window Manager dann mit einer Aktion/Anwendung verknüpft. Das funktioniert bei jedem Window Manager etwas anders und wird deshalb in diesem Artikel nicht besprochen.

Ich schlage vor xbindkeys zu benutzen. Es ist ein Programm das die zweite Philosophie verfolgt und kann mit jedem Window Manager benutzt werden, (allerdings kann es passieren, dass die definierten Tastenkombinationen mit denen des Window Managers in Konflikt stehen).

# pacman -S xbindkeys

xbindkeys hat eine ausführliche manpage:

$ man xbindkeys

Xbindkeys beinhaltet ein Utility das die X-Keycodes von Tasten und Tastenkombinationen anzeigt, ohne auf 'xev' zurückzugreifen. Die Ausgabe ist wesentlich übersichtlicher als die von 'xev'

$ xbindkeys -mk

In der Konfigurationsdatei können Befehle sowohl X-Keycodes als auch Keysyms zugeordnet werden. Falls die Hotkeys noch nicht mit 'xmodmap' konfiguriert wurden (siehe Abschnitt 4), sind sie nur durch einen X-Keycode zu identifizieren. Die xbindkeys manpage enthält ausführliche Informationen zur Syntax der Konfigurationsdatei ~/.xbindkeysrc

Nachdem xbindkeys konfiguriert wurde, kann es ausgeführt werden. Wird X per 'startx' gestartet, kann folgende Zeile in die ~/.xinitrc geschrieben werden.

xbindkeys &

So wird xbindkeys beim starten von X im Hintergrund gestartet und führt beim drücken der Hotkeys (oder normalen Tasten bzw. Tastenkombinationen) die Befehle aus, die in der Konfigurationsdatei definiert sind.


Dieser Artikel (oder Teile davon) steht unter GNU FDL (GNU Freie Dokumentationslizenz) und ist eine Übersetzung aus dem ArchLinux.org Wiki. Am Original-Artikel kann jeder Korrekturen und Ergänzungen vornehmen. Im ArchLinux.org Wiki ist eine Liste der Autoren verfügbar.