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