Terminal

為什麼 END 鍵沒有 terminfo 條目?

  • August 1, 2017

在 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. 如何?

TERMxterm-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 的應用程序)可以發送終端功能字元串以初始化鍵盤。一些終端描述確實將終端置於應用程序模式,有些則沒有。

kendvs的使用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”…

進一步閱讀:

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