当我在使用 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 序列),这可能会混淆某些程序(主要是如果终端设置不正确)。