Terminal

如何找出我的鍵盤發送到終端的轉義序列?

  • February 24, 2014

假設我們有一個帶有一些未知鍵的通用鍵盤,這些鍵可能會將轉義序列發送到終端。

鍵盤連接到在通用 BSD/Linux 上執行的 xterm 終端仿真器。

要為未知鍵創建正確的映射,我們必須首先知道它們發送到 xterm 的轉義序列。

但是如何知道密鑰發送的轉義序列是什麼?

您的鍵盤未連接到xterm。它已連接到您的 PC。核心驅動程序知道如何解碼鍵盤發送的按鍵和釋放,並通過特殊設備文件上的通用 API 將其提供給應用程序。

X 伺服器就是這樣一個使用該 API 的應用程序。

它將這些按鍵按下和釋放轉換為 X“KeyPress”和“KeyRelease”事件,這些事件將按鍵資訊作為鍵碼和鍵符攜帶。那是另一個 API。

xterm是一個 X 應用程序。它連接到 X 伺服器並告訴它:我對所有 KeyPress 和 KeyRelease 事件感興趣。當它具有焦點並且 KeyPress 和 KeyRelease 事件未被您的視窗管理器或其他全域註冊某些 KeyPress 事件的應用程序劫持時,xterm將接收KeyPressKeyRelease事件。

xtermkeysymKeyPress 事件中的 a 轉換為發送到偽終端驅動程序主端的字元序列。在您執行的應用程序xterm最終將從該偽終端驅動程序的從端讀取由 發送的字元xterm,但可能會被偽終端驅動程序更改(例如,在某些情況下,0xd 字元被轉換為 0xa 字元,0x3 會導致要發送的 SIGINT…)。

有了這些澄清。要知道 X 伺服器在給定按鍵時發送了哪個鍵碼或鍵符,您可以使用xev.

要知道由 發送的字元序列(如果有)xterm,您需要先告訴偽終端驅動程序不要與它們混合(stty raw),然後您可以使用cat -vtorsed -n lod查看它們:

{
 stty  raw min 1 time 20 -echo
 dd count=1 2> /dev/null | od -vAn -tx1
 stty sane
}

(在添加 amin 1 time 20和 usingdd之後,它會在一次按鍵後退出,否則您將無法退出Ctrl-C)。

引用自:https://unix.stackexchange.com/questions/110236