清理 xev 的输出

清理 xev 的输出

操作系统: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
  • 然后它打印第五和第八个字段,它们是133和,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,

因此,对于每次按键,之后的第二行都有键码和名称。

相关内容