Bereinigen der Ausgabe von xev

Bereinigen der Ausgabe von xev

Betriebssystem: Openbox-Sitzung von Lubuntu 14.04

Nehmen wir an, ich führe es aus xevund drücke die SuperTaste. Ich erhalte eine Menge Ausgabe (> 100 Zeilen) und die relevanten Informationen befinden sich weit unten in der Ausgabe, wie zu sehen ist, wenn ich

  • laufenxev | grep -in super
  • Drücken Siesuper
  • und schließen Sie dann das xevPopup-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, awkdie Zeile bei einer beliebigen Anzahl von Leerzeichen oder Klammern zu teilen. Die Felder state 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 Array afür Zeilen, die mit beginnen KeyPress.
  • NR in aprüft, ob die aktuelle Zeilennummer einen Eintrag im Array hat a. Dies wäre der Fall, wenn eine Zeile, die mit beginnt, KeyPresszwei Zeilen vorher kam.
  • Anschließend werden das fünfte und achte Feld gedruckt, die 133wie Super_Lim ersten Punkt zu sehen sind.

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

verwandte Informationen