Очистка вывода xev
ОС: Openbox сессия Lubuntu 14.04
Допустим, я бегу 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.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 делает свое волшебство. Все, что я могу догадаться, это то, что он как-то анализирует вывод, начиная с 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] }
создает пустую запись в строке номер + 2 в массивеa
для строк, начинающихся с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,
Итак, для каждого нажатия клавиши вторая строка после этого имеет код и имя.