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
。 で始まる行がKeyPress
2 行前であれば、これは 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 行目にキーコードと名前が表示されます。