如何找出我的鍵盤發送到終端的轉義序列?
假設我們有一個帶有一些未知鍵的通用鍵盤,這些鍵可能會將轉義序列發送到終端。
鍵盤連接到在通用 BSD/Linux 上執行的 xterm 終端仿真器。
要為未知鍵創建正確的映射,我們必須首先知道它們發送到 xterm 的轉義序列。
但是如何知道密鑰發送的轉義序列是什麼?
您的鍵盤未連接到
xterm
。它已連接到您的 PC。核心驅動程序知道如何解碼鍵盤發送的按鍵和釋放,並通過特殊設備文件上的通用 API 將其提供給應用程序。X 伺服器就是這樣一個使用該 API 的應用程序。
它將這些按鍵按下和釋放轉換為 X“KeyPress”和“KeyRelease”事件,這些事件將按鍵資訊作為鍵碼和鍵符攜帶。那是另一個 API。
xterm
是一個 X 應用程序。它連接到 X 伺服器並告訴它:我對所有 KeyPress 和 KeyRelease 事件感興趣。當它具有焦點並且 KeyPress 和 KeyRelease 事件未被您的視窗管理器或其他全域註冊某些 KeyPress 事件的應用程序劫持時,xterm
將接收KeyPress
和KeyRelease
事件。
xterm
將keysym
KeyPress 事件中的 a 轉換為發送到偽終端驅動程序主端的字元序列。在您執行的應用程序xterm
最終將從該偽終端驅動程序的從端讀取由 發送的字元xterm
,但可能會被偽終端驅動程序更改(例如,在某些情況下,0xd 字元被轉換為 0xa 字元,0x3 會導致要發送的 SIGINT…)。有了這些澄清。要知道 X 伺服器在給定按鍵時發送了哪個鍵碼或鍵符,您可以使用
xev
.要知道由 發送的字元序列(如果有)
xterm
,您需要先告訴偽終端驅動程序不要與它們混合(stty raw
),然後您可以使用cat -vt
orsed -n l
或od
查看它們:{ stty raw min 1 time 20 -echo dd count=1 2> /dev/null | od -vAn -tx1 stty sane }
(在添加 a
min 1 time 20
和 usingdd
之後,它會在一次按鍵後退出,否則您將無法退出Ctrl-C
)。