terminfo(5) 中的 cursor_up (cuu1) 和 key_up (kcuu1) 有什么区别?

pyn*_*exj 0 unix terminal ncurses terminfo tput

在 terminfo(5) 中:

   Variable String               Capname    TCapCode  Description
   ---------------------------------------------------------------
   cursor_up                     cuu1       up        up one line
   key_up                        kcuu1      ku        up-arrow key
Run Code Online (Sandbox Code Playgroud)

我尝试使用 tput 并且它们产生相同的输出:

[STEP 102] # tput cuu1 | hd -C
00000000  1b 5b 41                                          |.[A|
00000003
[STEP 103] # tput kcuu1 | hd -C
00000000  1b 5b 41                                          |.[A|
00000003
[STEP 104] #
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 5

在 terminfo 描述中,以开头的名称k表示,而其他名称用于非键功能。对于大多数键,键和现有转义序列之间没有明显的关系,但光标键是个例外。

它们是否相同取决于终端描述。对于TERM=linux,它们碰巧是相同的,但是可以为 Linux 控制台编写终端描述,而它们不是

区别在于终端是初始化应用程序模式还是留在(默认/通电)正常模式。在应用程序模式下,光标键将EscapeO作为前缀而不是Escape[.

ncurses终端数据库中超过一半 (54%) 的终端描述使用应用程序模式,这意味着cuu1通常与kcuu1.

还有一个需要注意的怪癖:对于其他光标移动,例如cud1,终端描述可能会说\n,而光标向下键不会发送该字符(参见iTerm示例)。

进一步阅读: