什么是ANSI转义码序列" ESC [> c"?

时间:2015-04-29 09:03:48

标签: bash terminal ansi-escape

输入" vi [FILENAME]"在bash中我得到以下结果:

.... \r\"gu1.txt\" 16L, 87C ESC[>cESC[1;1H 111\r\n1112 .....

此行中标记的第一个文本是vi结果的行数和列数之后的文件名。

第二个文本包含两个转义序列,我不明白它们的含义:ESC[>cESC[1;1H

最后一个文本包括作为vi结果显示的文本,即文件的内容。

您能否解释一下ANSI转义码序列ESC[>c是什么以及它与ESC[1;1H之后的转义码序列有什么关系?

提前致谢

2 个答案:

答案 0 :(得分:4)

根据 XTerm Control Sequences “发送设备属性(辅助DA)

  

CSI> Ps c

     

发送设备属性(辅助DA)。   Ps = 0或省略 - >请求终端的身份证明   码。响应取决于 decTerminalID 资源设置。它应该仅适用于VT220及更高版本,但xterm会扩展   这到VT100。

控件(适用于VT220等)记录在vt100.net上的DEC手册中

发送 设备属性的重点是程序询问终端的东西。终端发送返回信息,响应。这恰好是一个类似于请求的字符串(如果终端没有真正连接到主机,这将很有用)。发送请求的程序必须读取响应,否则您将看到终端上打印的奇数字符 - 响应的未读部分。

在您关于 vi 的问题的上下文中,vim使用它来确定它可能正在使用的 xterm 的版本。答案在终端的回复中提供:

  

Pv 是固件版本(对于 xterm ,这是最初的   XFree86补丁号,从95开始)。在DEC终端中, Pc 表示ROM盒注册号,是   永远为零。

使用此功能的vim中的特定功能称为“termresponse”。如果你在假装是xterm的终端上使用它,但实际上并不是这样,那么你会在终端上看到杂散字符,如 Why is vim starting in delete mode? 的答案所述。但是,任何“VT100兼容”的终端仿真器都必须处理这个问题。

以下ESC[1;1H辅助DA 无关,而是标准化(ISO-6429 / ECMA-48)光标定位,用于初始化(你会在终端中运行的任何文本编辑器中看到类似的内容。通常它会以较短的格式ESC[H发送,因为数字默认为1

ESC[>c私有模式序列,由>字符表示。 ECMA-48中描述了(以及许多其他细节)。 DEC的终端遵循标准,以及扩展。终端控制的“ANSI”标准很久以前就被纳入了ISO标准,而且(很久以前)相应的ANSI标准被撤销了。

你不太可能遇到用于与硬件终端通信的这个序列,因为它(在xterm开始在20世纪90年代开始使用它之前)主要由DEC的(开放式)VMS系统用来确定连接到哪种类型的终端它

答案 1 :(得分:1)

我认为ANSI标准不是公开的,但很快就出现了Google a third-party summary based on the DEC PDP-10 docs

对于第一个:'c'命令意味着&#34; DA&#34; for&#34; Device Attributes&#34;。您向终端发送没有参数的CSI 'c',并发回一个CSI 'c',其中私有模式字符表示终端特定的内容。私有模式字符必须以"<=>?"之一开头,并运行到数字,尾随字符或字母。因此,ESC[>c是一种最小响应,它以某种方式编码2位特定于终端的信息(通过在其他3个选项之一上选择>)。请注意,ESC[>c等同于ESC[>0c,这是DEC VT240终端与VT220的区别,因此可能意味着您的文本文件是从VT240的输出中捕获的模拟器。但它可能意味着各种其他事情。无论如何,将其发送回终端应该没有效果。

第二个更容易。 'H'命令表示&#34; CUP&#34;,对于&#34;光标位置&#34;:给定参数nm,它将光标移动到1左上角的行n和列m。因此,ESC[1;1H将光标移动到屏幕的左上角。