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 위키 코드가 어떻게 마법을 발휘하는지 알고 싶습니다. 내가 추측할 수 있는 것은 어떻게든 시작하는 출력을 구문 분석하고 있지만 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
현재 줄 번호에 array 에 항목이 있는지 확인합니다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,
따라서 각 키를 누를 때마다 그 다음 두 번째 줄에 키코드와 이름이 있습니다.