為什麼 END 鍵沒有 terminfo 條目?
在 Debian 系統上,
END
按鍵生成^[[F
:$ showkey -a Press any keys - Ctrl-D will terminate this program ^[[F 27 0033 0x1b 91 0133 0x5b 70 0106 0x46
但是為什麼這個 keychord 不在terminfo中?
$ infocmp -1 | grep end kend=\EOF,
儘管如此,ncurses還是設法將其正確辨識為
KEY_END
. 如何?
TERM
是xterm-256color
kend
順便說一句,擁有andend
而不是 just背後的動機是end
什麼?(和khome
相同home
)編輯
正如 Johan Myréen 的評論中所說,
khome
字元串是按下 Home 鍵產生的序列。但是在 Debian 上按 Home 鍵會產生home
. 為什麼?$ showkey -a Press any keys - Ctrl-D will terminate this program ^[[H 27 0033 0x1b 91 0133 0x5b 72 0110 0x48
$ infocmp -1 | grep home home=\E[H, khome=\EOH,
Johan Myréen 的回答很接近,但不完全是問題:您將使用的大多數終端仿真器都具有特殊鍵的正常模式和應用程序模式。終端描述是針對一種模式編寫的,它對應於全屏應用程序使用的模式。其他應用程序(例如互動式外殼)通常不會初始化螢幕以使用應用程序模式。Bash 就是一個例子。
在正常模式下,xterm 和類似終端發送
*escape*``**
[**
(CSI),而在應用模式下,它們的鍵盤發送*escape*``**
O**
(SS3)。在 terminfo 語法中,轉義是\E
. 因此infocmp
,向您展示了描述使用應用程序模式。home
能力被發送到終端,告訴它如何將游標移動到起始位置(左上角),與(使用鍵盤**從****khome
**終端發送)不同。全屏應用程序(例如使用 ncurses 的應用程序)可以發送終端功能字元串以初始化鍵盤。一些終端描述確實將終端置於應用程序模式,有些則沒有。
kend
vs的使用end
是一種命名約定:按照約定,在 terminfo 中,任何以k開頭的名稱都指代一個特殊鍵(功能鍵、游標鍵、鍵盤鍵),以明確這些是應用程序要讀取的字元串。例如,kcub1
(cursor-backward key ) 不同於**cub1
**(將游標移回一列)。ncurses 將密鑰辨識為**
KEY_END
**因為您正在使用的應用程序將呼叫該keypad
函式以使用初始化終端smkx
(助記符的意思是“啟動鍵盤傳輸模式”)。這可能/可能不會真正打開應用程序模式。Linux 控制台的終端描述沒有,xterm 有。原則上,您可以
tput
用於切換模式(並從中獲得不同的結果showkey
):$ showkey -a Press any keys - Ctrl-D will terminate this program ^[[H 27 0033 0x1b 91 0133 0x5b 72 0110 0x48 ^C 3 0003 0x03 ^D 4 0004 0x04 $ tput smkx $ showkey -a Press any keys - Ctrl-D will terminate this program ^[OH 27 0033 0x1b 79 0117 0x4f 72 0110 0x48
複雜的是,curses 只能辨識字元串的一個名稱。某些終端(例如 xterm)使用不同名稱的編輯鍵盤上的鍵來模擬較舊的硬體終端。在下面列出的 xterm 常見問題解答中,可以將“Home”鍵命名為“Insert”…
進一步閱讀:
- 如何修復 unix 以便我可以在終端中使用箭頭鍵?
- 我的 home/end 鍵不起作用(ncurses 常見問題解答)
- 為什麼我的鍵盤不起作用?(xterm 常見問題解答)
- 鍵盤和功能鍵(terminfo 手冊)
- 使用者定義的能力(terminfo 手冊,評論“k”的其他用途)
- 鍵盤模式(
getch
手冊頁)