Linux 实用程序如何避免在标准输入流中意外拆分 ANSI 键序列?

How do Linux utilities avoid accidentally splitting ANSI key sequences in stdin stream?

终端模拟器将键盘输入编码为 ANSI 转义序列。

转义键是单字节:\x1b
删除键为 4 个字节:\x1b '[' '3' '~'

用户按 Delete 键和键序列 "Escape"、“[”、“3”、“~”有什么区别?

vim 等交互式程序如何区分?

终端仿真器和 SSH 等实用程序如何以确保接收程序做出正确解释的方式发送密钥序列?

时机。

如果字符在足够短的时间内到达,则它们不太可能是单独键入的。

在vim 中,选项esckeysttimeoutttimeoutlen 确定是否等待转义序列完成以及等待多长时间。这些不是传统的 vi 选项;在传统的 vi 中,转义只是转义,方向键没有用。

您可以通过键入 Esc O A 来测试它Esc [ A 在vim中真快。如果您的速度足够快,并且您的终端设置不是太奇特,其中一个将起到向上箭头键的作用。慢慢输入同样的东西,它会做一些不同的事情。做 :set noesckeys 它永远不会像箭头键一样(即使你真的按下箭头键) - 如果你想要对转义键的响应是即时的,这是你必须付出的代价。

实验可以用其他序列来完成,例如您的^[[3~,但是 3 个字符的序列更容易输入。

curses 库在解释终端输入时也使用超时。这是一个相关的问题: