Bash

如何找出由特定字元序列表示的鍵綁定

  • July 29, 2020

要獲取特定鍵盤快捷鍵的字元序列,我們使用showkey -a或逐字插入 ( Ctrl+ V)。

它的反面是什麼?如何從字元序列中獲取人類可讀格式的鍵盤快捷鍵?

例如,我使用了一些鍵綁定

^[^?
^X^U
^[[3;5~
^[[1;2D
^[[1;2C
^[[1;5C
^[[1;5D
^[[1;6C
^[[1;6D
....

現在我不記得他們曾經代表哪個鍵/鍵組合了。

我怎樣才能知道呢?

更新 1

我正在尋找可以輸出等的東西Ctrl+RCtrl+Delete我的意思是人類可讀的格式。

對具有可能的字元序列及其人類可讀格式的表的任何引用也可以。

只要您的終端以 ECMA-48 形式或 DECFNK、Interix、SCO 控制台或 Unicode RXVT 形式生成輸入控制序列,您就可以將其提供給我的console-decode-ecma48工具,並使用--input命令行選項告訴它字元流是輸入而不是輸出。對於您現在在實踐中遇到的大多數終端和終端仿真器來說都是如此。

這是它對您的輸入的作用,當然^[替換為實際字元:

%**控制台解碼 ecma48 --input << EOF
^[^?
^X^U
^[[3;5~
^[[1;2D
^[[1;2C
^[[1;5C
^ [[1; 5D
^ [[1; 6C
^[[1;6D
EOF**
的
如果
U + 00000015
如果
DEC 控制+刪除
如果
2級+CUB 1
如果
2 級 + CUF 1
如果
控制+CUF 1
如果
控制+CUB 1
如果
控制+2級+CUF 1
如果
控制+Level2+CUB 1
如果
%

https://unix.stackexchange.com/a/504056/5132所述,如果您想解碼某些終端對⎇ Alt鍵和弦的作用,您需要該--no-7bit選項;否則,您將獲得 C1 控製字元的 7 位別名的 ECMA-48 標準解碼。

CUF並且CUB是標準的 ECMA-48 名稱,當然:“ CU rsor F orward”和“ CU rsor B後退”。請參閱手冊。

終端控制序列的規則可能會讓您大吃一驚。您輸入了、DEL、。終端控制序列的規則如下處理:

  1. 開始一個轉義序列。
  2. DEL 立即作為控製字元處理,而轉義序列仍處於未決狀態。
  3. 立即作為控製字元處理,而轉義序列仍處於未決狀態。
  4. 取消(它在名稱中)未決的轉義序列。
  5. 處理為 C0 控製字元。 console-decode-ecma48在此特定字元的情況下列印其 Unicode 程式碼點。

請注意,我所知道的任何外殼實際上都沒有包含正確的 ECMA-48 解碼器。Shell 進行模式匹配,這在處理終端一直發送的實際 ECMA-48 編碼內容時明顯不完善。這導致了諸如https://unix.stackexchange.com/a/499139/5132>和<https://unix.stackexchange.com/a/520429/5132等中討論的問題。

console-decode-ecma48實際上有一個適當的 ECMA-48 解碼器和一個控制序列狀態機,以及 SCO Console、Interix 等的差異。它不會向您確切顯示諸如 GNU Readline、libedit 和 ZLE 之類的東西會對您的輸入產生什麼影響,因為它們沒有正確地獲取協議。

但它告訴你 ECMA-48 終端認為它正在發送什麼,這就是你想要的。

進一步閱讀

前幾行

^[^?
^X^U

是您可以在表格中找到的程式碼作為 ASCII 控制項

^[  (escape)
^U  (control-U)
^X  (control-X)

這**^?**是 ASCII DEL(刪除鍵)的正常表示。

如果您的終端描述 ( TERM) 設置適當,

infocmp -1 -x

將以 terminfo 格式列印鍵的 ncurses 名稱。還有其他資訊,但您會看到以下幾行:

kDC5=\E[3;5~,

kRIT=\E[1;2C,
kRIT3=\E[1;3C,
kRIT4=\E[1;4C,
kRIT5=\E[1;5C,
kRIT6=\E[1;6C,
kRIT7=\E[1;7C,

kLFT=\E[1;2D, 
kLFT3=\E[1;3D,
kLFT4=\E[1;4D,
kLFT5=\E[1;5D,
kLFT6=\E[1;6D,
kLFT7=\E[1;7D,

哪個(假設 terminfo**\E是 ASCII 轉義,或者^[)您可以辨識為與您的範例相對應。kLFTkRIT*名稱告訴我這些是(xterm 樣式)修改後的左/*右游標鍵(有關名稱後數字的含義,請參見XTerm 控制序列,在程式碼/修飾符表中)。terminfo 名稱列在終端數據庫中:

# These are the extended keys defined in this file:
#
# kDC3 kDC4 kDC5 kDC6 kDC7 kDN kDN3 kDN4 kDN5 kDN6 kDN7 kEND3 kEND4 kEND5 kEND6
# kEND7 kHOM3 kHOM4 kHOM5 kHOM6 kHOM7 kIC3 kIC4 kIC5 kIC6 kIC7 kLFT3 kLFT4
# kLFT5 kLFT6 kLFT7 kNXT3 kNXT4 kNXT5 kNXT6 kNXT7 kPRV3 kPRV4 kPRV5 kPRV6 kPRV7
# kRIT3 kRIT4 kRIT5 kRIT6 kRIT7 kUP kUP3 kUP4 kUP5 kUP6 kUP7 ka2 kb1 kb3 kc2

並在user_caps手冊頁中進行了描述。

鑑於所有這些,有人可以製作一個程序或腳本來製作一個顯示可讀格式的表格(但知道它的記錄位置應該會有所幫助)。

^[^?如果您按下,某些終端會發送該資訊Alt``Delete(但這不在終端描述中)。這^X^U不是由終端模擬器中的單個鍵發送的序列(除非您有反彈鍵):更有可能是兩次按鍵。

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