Linux实用程序如何避免意外地在stdin流中分割ANSI键序列?

beq87vna  于 2023-03-29  发布在  Linux
关注(0)|答案(1)|浏览(85)

终端模拟器将键盘输入编码为ANSI转义序列。
Escape key是一个字节:\x1b
删除键为4个字节:\x1b '[' '3' '~'
用户按下Delete键和按下“Escape”、“[”、“3”、“~”键的顺序有什么区别?
像vim这样的交互式程序是如何区分的?
终端模拟器和实用程序(如SSH)如何以确保接收程序做出正确解释的方式发送密钥序列?

zphenhs4

zphenhs41#

时机。
如果字符在足够短的时间内到达,则它们不太可能是单独输入的。
在vim中,选项esckeysttimeoutttimeoutlen决定是否等待转义序列完成以及等待多长时间。在传统VI中,转义只是一个转义,箭头键是无用的。
你可以通过在vim中快速输入EscOA或Esc[A来测试这一点。如果你的速度足够快,并且你的终端设置不是太奇怪,其中一个将充当向上箭头键。慢慢地输入同样的东西,它会做一些不同的事情。做:set noesckeys,它就永远不会像箭头键那样工作(即使当你实际按下箭头键时)--如果你想让对转义键的响应是即时的,这是你必须付出的代价。
这个实验可以用其他序列来完成,比如你的^[[3~,但是3个字符的序列更容易输入。
curses库在解释终端输入时也使用了超时,这里有一个相关的问题:How can I know that the user hit the ESC key in a console with ncurses (Linux)?

相关问题