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

What's the difference between cursor_up (cuu1) and key_up (kcuu1) in terminfo(5)?

在术语信息(5)中:

   Variable String               Capname    TCapCode  Description
   ---------------------------------------------------------------
   cursor_up                     cuu1       up        up one line
   key_up                        kcuu1      ku        up-arrow key

我尝试了 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] #

cursor_up是主机发送给终端的控制序列,使光标上移一行。

key_up是终端在按下向上方向键时发送给主机的控制序列。

在基于 VT100 的终端(包括所有健全的现代终端仿真器)中,这些序列是相同的。然而,一些较旧的终端硬件可能在这两个角色中使用了不同的序列,因此 terminfo 将它们分开。

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

是否相同取决于终端描述。对于 TERM=linux,它们恰好是相同的,但是可以为 Linux 控制台编写终端描述,其中它们是 not.

区别在于终端是初始化进入应用模式还是留在(default/power-up)正常模式。在应用程序模式下,光标键将发送 EscapeO 作为前缀而不是 Escape[.

ncurses terminal database 中略多于一半 (54%) 的终端描述使用 应用程序模式 ,这意味着 cuu1 比与 kcuu1.

没有区别

还有一个问题需要注意:对于其他光标移动,例如 cud1,终端描述可能会说 \n,而键因为光标向下不会发送该字符(例如参见 [​​=20=])。

延伸阅读: