Betriebssystem: Openbox-Sitzung von Lubuntu 14.04
Nehmen wir an, ich führe es aus xev
und drücke die Super
Taste. Ich erhalte eine Menge Ausgabe (> 100 Zeilen) und die relevanten Informationen befinden sich weit unten in der Ausgabe, wie zu sehen ist, wenn ich
- laufen
xev | grep -in super
- Drücken Sie
super
- und schließen Sie dann das
xev
Popup-Fenster.
$ xev | grep -in super
122: state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
129: state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
$
Ich bin im Arch-Wiki (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg) auf einen Einzeiler gestoßen, der die Ausgabe drastisch bereinigt (mit bestimmten im Link angegebenen Ausnahmen):
xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
Die Ausgabe wird auf Folgendes reduziert:
133 Super_L
Ich möchte wissen, wie der Arch-Wiki-Code seine Magie entfaltet. Ich kann nur vermuten, dass er die Ausgabe irgendwie analysiert, beginnend mit KeyPress
, aber danach verstehe ich nichts mehr:
KeyPress event, serial 48, synthetic NO, window 0x2800001,
root 0x7e, subw 0x0, time 13500391, (362,697), root:(363,760),
state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
Kann jemand bitte erklären, was der Code macht?
Antwort1
awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
-F'[ )]+'
weist an,awk
die Zeile bei einer beliebigen Anzahl von Leerzeichen oder Klammern zu teilen. Die Felderstate 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
wären also:# empty field state 0x0, keycode 133 (keysym 0xffeb, Super_L , same_screen YES,
/^KeyPress/ { a[NR+2] }
erstellt einen leeren Eintrag bei Zeilennummer + 2 im Arraya
für Zeilen, die mit beginnenKeyPress
.NR in a
prüft, ob die aktuelle Zeilennummer einen Eintrag im Array hata
. Dies wäre der Fall, wenn eine Zeile, die mit beginnt,KeyPress
zwei Zeilen vorher kam.- Anschließend werden das fünfte und achte Feld gedruckt, die
133
wieSuper_L
im ersten Punkt zu sehen sind.
xev
Die Ausgabe sieht tatsächlich so aus:
$ xev
...
KeyPress event, serial 36, synthetic NO, window 0x2a00001,
root 0x29c, subw 0x0, time 217441518, (91,162), root:(91,697),
state 0x10, keycode 134 (keysym 0xffec, Super_R), same_screen YES,
Für jeden Tastendruck enthält die zweite Zeile danach den Tastencode und den Namen.