“esc”键盘键本身的 VT100 转义码是什么

2023-11-21

我正在编写一个脚本来导航基于文本的菜单系统,使用 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 将采用数字行/列,例如电子稳定控制系统 [12; 34 H 将转到第 12 行、第 34 列。不提供它们将采用默认值。

理论上,服务器永远不应该向您抛出一个无意义的孤立 ESC 字符,因为终端会坐在那里等待序列。

当您按下功能键时,终端将发送一个 ESC 字符,后跟一些功能键、箭头或操作的预先设定的序列。例如 ESC [ 21 ~ 为 F10。

这就留下了一个非常现实的问题:如何发送一个字面上的孤立 ESC。有两种方法。

一,发送 ESC,然后延迟一段时间。主持人不仅有责任观察进入的内容,而且有责任观察进入的时间。而且,假设终端会立即在其缓冲区中发送一个字符块,那么它会在内部超时,并将 ESC 视为仅 ESC。延迟时间不必太长。

第二,要求用户为每个所需的文字 ESC 按两次 ESC。由于没有转义序列包含双转义字符,因此它表示特殊情况。这与我们在字符串中引用反斜杠字符时所做的完全相同,“\”实际上意味着“\”,因为我们必须满足编译器的词法阶段。在本例中,它是主机服务器。请记住,在串行端口时代,也就是使用这些终端时,当按下一个字符时,它会立即发送。仅仅几年后,我们才开始模拟终端,因此需要模拟它们的转义序列,而不是将行为从内容流中剔除。

当然,“无效”的 ESC 序列意味着 ESC 是文字,但这需要先查看接下来的字节是什么,然后才能对其进行操作(因此超时解决方案)。问题是有时这些字符会对应用程序造成副作用,令人讨厌的副作用,并且有趣的情况可能会出现,尝试天真地伪造系统可能会给您带来麻烦。例如,使用 ESC 空格键强制退出,ESC 取消一个提示,但空格键无意中确认了下一个提示。

该问题的第三个解决方案是简单地让主机完全忽略特殊功能键并将传入的字节流视为文字。例如,每次按下 ESC 时,TECO 编辑器都会向用户显示一个美元符号,因为它使用它作为命令分隔符,就像今天在编码中使用分号一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“esc”键盘键本身的 VT100 转义码是什么 的相关文章

随机推荐