操作系统: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,
因此,对于每次按键,之后的第二行都有键码和名称。