Linux实用程序如何避免在stdin流中意外拆分ANSI密钥序列?

时间:2018-08-30 15:33:22

标签: linux ansi tty

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

转义键是一个字节:\ x1b
删除密钥为4个字节:\ x1b'[''3''〜'

用户按下Delete键和键序列“ Escape”,“ [”,“ 3”,“〜””之间有什么区别?

像vim这样的交互式程序如何区分两者?

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

1 个答案:

答案 0 :(得分:1)

时间。

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

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

您可以通过键入 Esc O A Esc [ A 的vim速度非常快。如果您的速度足够快,并且您的终端设置不是太奇特,则其中之一会像向上箭头键一样工作。慢慢输入相同的内容,将会产生不同的效果。进行:set noesckeys,它将永远不会像箭头键一样起作用(即使您实际按下箭头键也是如此)-这是您要立即对转义键的响应必须支付的价格。

可以使用其他序列(例如^[[3~)进行实验,但是键入3个字符会更容易。

curses库在解释终端输入时也使用超时。这是一个与此相关的问题:How can I know that the user hit the ESC key in a console with ncurses (Linux)?