【问题标题】:What's the VT100 escape code for the "esc" keyboard key itself“esc”键盘键本身的 VT100 转义码是什么
【发布时间】:2021-09-04 17:01:20
【问题描述】:

我正在编写一个脚本来导航基于文本的菜单系统,使用 python 的 telnetlib 访问串行连接。

我可以使用转义码愉快地按下 F 键。例如F9 = "\033OX",其中 "\033" 是转义序列。

如何编码“esc”键盘键?我原以为只有“\033”,但这似乎不起作用。

【问题讨论】:

  • @tripleee 根据答案,对答案和问题都进行投票等,我认为目标的方向应该是相反的。
  • @cigien 感谢您的反馈;逆转。作为记录,以前的重复是stackoverflow.com/questions/68970943/…
  • 如果您正在寻找 Esc,恕我直言,这里的标题和问题陈述以及接受的答案都相当离谱。关于如何在不破坏原始问题的情况下改进的任何建议?
  • @tripleee 也许可以编辑这个问题的标题,使其更像之前的目标,而不实际改变问题的意图,这样它更有可能出现在搜索中。至于接受的答案不是很好,我没有解决方案,但我相信正在进行的工作是取消接受的答案,这应该会在一定程度上缓解问题。

标签: python serial-port escaping


【解决方案1】:

VT-100(或其他使用转义序列的终端)上的 ESC 键没有“转义序列”。

转义字符 ASCII 27 用于指示以下字符序列具有特殊含义。这通常将终端放入一个简单的状态机。一般来说,规则是吞下传入的字符,直到看到一个字母或符号字符,包括在内,尽管一些特殊情况,例如可能抓住一个额外字符的符号,例如ESC # 6 转为双角字符。

例如在 H-19 / VT-52 终端上,ESC H 表示 home,ESC E 表示清屏和 home,ESC J 表示清屏结束等。VT-100 系列使用 ESC [ H 表示home,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 Space 强制退出,ESC 会取消一个提示,但空格会意外确认下一个提示。

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

【讨论】:

    【解决方案2】:

    在发送转义后稍加延迟,比如 1.5 秒,以便对方意识到这是一个孤立的转义,而不是更长序列的一部分。

    【讨论】:

    • 谢谢。你为我指明了正确的方向。延迟不起作用,但所做的是在转义序列之后发送一个“”(空格)。这提示菜单系统接受“独立”转义键。
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2021-06-01
    • 2016-01-13
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多