xevの出力をクリーンアップする

xevの出力をクリーンアップする

OS: Lubuntu 14.04 の Openbox セッション

実行してキーxevを押すとSuper、大量の出力(100行以上)が得られ、関連する情報は出力のかなり下に表示されます。

  • 走るxev | grep -in super
  • プレスsuper
  • xevポップアップウィンドウを閉じます。
$ 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,
$ 

Arch wiki (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg) で、出力を大幅にクリーンアップするワンライナーを見つけました (リンクに記載されている特定の例外を除く)。

xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'

出力は次のように削減されます。

133 Super_L

Arch wiki コードがどのように魔法をかけるのか知りたいです。私が推測できるのは、何らかの方法で出力を解析して、そこから始まるということですKeyPressが、それ以降は何も理解できません:

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: 

誰か、コードが何をするのかを丁寧に説明してもらえませんか?

答え1

awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
  • -F'[ )]+'awk任意の数のスペースまたは括弧で行を分割するように指示します。したがって、 のフィールドはstate 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,次のようになります。

              # empty field
    state
    0x0,
    keycode
    133
    (keysym 
    0xffeb,
    Super_L
    ,
    same_screen
    YES,
    
  • /^KeyPress/ { a[NR+2] }aは、 で始まる行に対して、配列の行番号 + 2 に空のエントリを作成しますKeyPress
  • NR in a現在の行番号に配列のエントリがあるかどうかを確認しますa。 で始まる行がKeyPress2 行前であれば、これは true になります。
  • 次に、最初のポイントでわかるように133、および である 5 番目と 8 番目のフィールドを出力します。Super_L

xev実際の出力は次のようになります。

$ 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,

したがって、キーを押すたびに、その後の 2 行目にキーコードと名前が表示されます。

関連情報