首页 > 解决方案 > Linux 实用程序如何避免意外拆分标准输入流中的 ANSI 键序列?

问题描述

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

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

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

vim 之类的交互式程序如何区分?

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

标签: linuxansitty

解决方案


定时。

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

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

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

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

curses 库在解释终端输入时也使用超时。这是一个相关的问题:我如何知道用户在带有 ncurses (Linux) 的控制台中按下了 ESC 键?


推荐阅读