VT-100(或其他使用转义序列的终端)上的ESC键不存在“转义序列”。在
27个ASCII字符的特殊含义是转义符。这通常将终端放入一个简单的状态机中。一般情况下,规则是将传入字符吞入,直到看到字母或符号字符(包括在内),尽管有些特殊情况,如符号可能会抓住一个额外的字符,例如ESC#6到双倍宽字符。在
例如,在H-19/VT-52终端上,ESC H表示主页,ESC E表示清除屏幕和主页,ESC J表示清除屏幕末端,等等。VT-100系列使用ESC[H表示主页,ESC[2 J表示清除屏幕末端。在
真正发生的是,开方括号(没有右括号)表示一系列参数,通常是数字,即将到来。ESC[2j中的“2”表示从光标到顶部(零)和从光标到终点(一)。把J换成K,现在它会用同样的方法清除线,而不是屏幕。他们不是武断的。甚至ESC[row;col H也会采用数字row/col,例如ESC[12;34h将转到第12行,第34列。不提供它们将采用默认值。在
理论上,服务器不应该抛出一个无意义的孤立ESC字符,因为终端会坐在那里等待序列。在
当按了某个功能键或某个功能键时,按了某个功能键就会按ESC键。例如ESC[21~是F10。在
这就留下了一个非常实际的问题,即如何发送一个文本孤立的ESC。有两种方法。在
第一,发送ESC,然后延迟一段时间。主办方将有责任不仅看什么进来,而且在什么时候。而且,在假设终端将立即在其缓冲区中发送一个字符块的情况下工作,它将在内部超时,并将ESC表示为ESC。耽搁的时间并不长。在
第二,要求用户按ESC键两次。由于没有一个转义序列由双转义字符组成,所以它表示一种特殊情况。这和我们在字符串中引用反斜杠字符时所做的完全一样,“\”实际上意味着“\”,因为我们必须满足编译器的词法阶段。在本例中,它是主机服务器。请记住,在串行端口的时代,也就是说,当使用这些终端时,当一个字符被按下时,它就会立即被发送出去。仅仅几年后,我们才开始模拟终端,因此需要模拟它们的转义序列,而不是将行为从内容流中去掉。在
当然,一个“无效”的ESC序列意味着ESC是文本的,但是这需要在您可以对它们进行操作之前查看以下字节是什么(因此需要超时解决方案)。问题是有时这些字符会给应用程序带来副作用,令人讨厌的,有趣的案例可能会出现,试图天真地伪造系统可能会给您带来麻烦。e、 使用ESC空格强制退出,ESC取消一个提示,但空格无意中确认下一个。在
该问题的第三个解决方案是让主机完全忽略特殊的功能键,并将传入的字节流作为文本。例如,每次按下ESC键时,TECO编辑器都会向用户显示一个美元符号,因为它将此符号用作命令分隔符,就像今天在编码时使用分号一样。在