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 编辑器都会向用户显示一个美元符号,因为它使用它作为命令分隔符,就像今天在编码中使用分号一样。