我正在编写一个脚本来导航基于文本的菜单系统,使用python的telnetlib来访问串行连接.
我可以使用转义码快乐地按下F键.例如F9 ="\ 033OX",其中"\ 033"是转义序列.
如何编码"esc"键盘键?我本来期望只是"\ 033",但这似乎不起作用.
VT-100(或使用转义序列的其他终端)上的ESC键没有"转义序列".
转义字符ASCII 27用于表示以下字符序列具有特殊含义.这通常会将终端设置为简单的状态机.一般来说,规则是吞下传入的字符,直到看到字母或符号字符,包括在内,尽管某些特殊情况如符号可能会抓住一个附加字符,例如ESC#6到双宽字符.
例如在H-19/VT-52终端上,ESC H意味着家庭,ESC E意味着清晰的屏幕和家庭,ESC J意味着清晰的屏幕结束等.VT-100系列使用ESC [H用于家庭,和ESC [2 J清除屏幕结束.
真正发生的事情是,开放的方括号(没有关闭括号)表示一个参数列表,通常是数字,即将到来.ESC [2 J]中的'2'表示从光标到顶部(零),从光标到结尾(一个).将J切换到K,现在它将以相同的方式清除线而不是屏幕.他们不是任意的.甚至ESC [行; col H将采用数字行/列,例如ESC [12; 34 H将进入第12行第34列.不提供它们采用默认值.
从理论上讲,服务器永远不会抛出无意义的孤立ESC字符,因为终端会坐在那里等待序列.
当您按下功能键时,终端将发送一个ESC字符,后跟一些预先设定的序列,用于功能键,箭头或动作.例如ESC [21~F10.
这就留下了如何发送文字孤立的ESC的非常现实的问题.有两种方法.
一,发送ESC然后延迟一些.主持人有责任不仅观察进来的内容,还有何时观看.并且,假设终端会立即在其缓冲区中发送一个字符块,它将在内部超时并将ESC表示为ESC.延迟不一定很长.
二,要求用户按ESC所需的每个文字ESC两次.由于没有任何逃避序列由双重转义字符组成,它标志着一种特殊情况.与字符串中引用反斜杠字符完全相同,"\"实际上意味着"\",因为我们必须满足编译器的词法阶段.在这种情况下,它是主机服务器.请记住,在串口的时代,即使用这些终端的时候,当按下一个角色时,会立即发送.仅仅几年之后我们就开始模仿终端,从而增加了模仿其转义序列的需求,而不是将行为从内容流中取出.
当然,一个'无效的'ESC序列意味着ESC是文字的,但是这需要在你可以对它们采取行动之前看看下面的字节是什么(因此超时解决方案).问题是有时候这些角色会对应用程序产生副作用,令人讨厌的问题,并且有趣的案例可能会到达试图天真伪造系统可能会让你陷入麻烦的地方.例如,使用ESC空间强制逃脱,ESC取消一个提示,但空间无意识地确认下一个.
该问题的第三个解决方案是让主机完全忽略特殊功能键,并将输入字节流作为文字.例如,每次按下ESC时,TECO编辑器都会向用户显示一个美元符号,因为它使用它作为命令分隔符,就像今天在编码中使用分号一样.