为什么当我按下 Ctrl-PageUp 时 xterm-termite 会打印“5~”?

为什么当我按下 Ctrl-PageUp 时 xterm-termite 会打印“5~”?

当我在使用 xterm-termite 时按 Ctrl-PageUp 时,屏幕上会出现字符“5~”。为什么是这样?

当我在 Linux 控制台上按相同的键时,如果在登录后立即按下,它会在命令历史记录中向后移动并打印“cd exp2111/”。

答案1

这是因为终端的协议(以及伪终端之类的xterm)。它们仅发送数据字节,或者作为输入(例如按下的按键),或者作为打印的输出(普通文本)。

但并不是所有的事情都可以用普通的 ASCII 字符(或用 UTF-8 代码扩展)来完成。例如,如果一个键没有公共字符,它将作为转义序列发送,通常为:

<esc> '[' (<keycode>) (';'<modifier>) '~'

您可以找到许多这样的序列,例如在维基百科中:https://en.wikipedia.org/wiki/ANSI_escape_code#Terminal_input_sequences

例如作为 vt 序列:

<esc>[5~    - PgUp

因此,正如预期的那样,终端将发送 PageUp 代码。这是完全正确的。

那么真正的问题是:为什么终端会打印这样的代码?可能有多种原因:例如错误的终端设置(TERM)等。但通常只是接收程序无法解释它,因此它可能只是回显到屏幕上。例如,通常bash可以识别 PageUp,但 shell 实用程序(例如cat)不能,所以当前台进程是 时cat,您会得到回显(因此代码),但是当 bash 是前台时(因此等待输入),它将正确解释序列)。

注意:PageUp 通常发送到程序,并且不被伪终端使用(例如滚动),但这可能在设置中更改,并且可能根据前台程序的显示模式更改)。

注意:某些操作系统可能使用不同的转义序列(如果我没记错的话,macos 终端使用不同的 PageUp 序列),这可能会混淆某些程序(主要是如果终端设置不正确)。

相关内容