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

What is the ANSI escape code sequence "ESC[>c"?

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

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

该行第一个标记的文本是文件名,后面是vi结果的行数和列数。

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

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

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

提前致谢

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

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

第二个要容易得多。 'H' 命令表示 "CUP",对于 "CUrsor Position":给定参数 nm,它将光标移动到基于 1 的行 n 并且从左上角起第 m 列。因此,ESC[1;1H 将光标移动到屏幕的左上角。

《发送设备属性(二级DA)》,根据XTerm Control Sequences

CSI > Ps c

Send Device Attributes (Secondary DA). Ps = 0 or omitted -> request the terminal's identification code. The response depends on the decTerminalID resource setting. It should apply only to VT220 and up, but xterm extends this to VT100.

控制(应用于VT220等)在vt100.net

的DEC手册中有记载

发送设备属性的要点是程序正在询问终端一些东西.终端发送返回信息,响应。这恰好是一个看起来像请求的字符串(如果终端没有真正连接到主机,这很有用)。发送请求的程序必须 read 响应,否则你会在终端上看到奇怪的字符——响应的 unread 部分。

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

and Pv is the firmware version (for xterm, this was originally the XFree86 patch number, starting with 95). In a DEC terminal, Pc indicates the ROM cartridge registration number and is always zero.

vim 中使用此功能的特定功能称为“termresponse". If you use it on a terminal which pretends to be xterm, but is not really, then you will see stray characters on your terminal, as described in an answer for Why is vim starting in delete mode?。但是,任何“兼容 VT100”的终端仿真器都必须处理此问题。

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

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

你不太可能遇到这个用于与硬件终端通信的序列,因为它(在 1990 年代 xterm 开始使用它之前)主要被 DEC 的 (Open)VMS 系统用来确定什么类型的终端是连接到它。