清理 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檢查目前行號在 array 中是否有條目a。如果以 開頭的行KeyPress出現在兩行之前,則情況如此。
  • 然後它會列印第五個和第八個字段,這133Super_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,

因此,對於每個按鍵,其後的第二行包含鍵碼和名稱。

相關內容