为什么 ANSI 颜色转义序列以 'm' 结尾而不是 ']'?

3

大多数编程语言可以使用\033[...m来进行ANSI终端颜色转义。(在某些语言中,您可能需要使用\e\x1b

对我来说总是很奇怪的是它们以\033[开始,但以m结束。这是否有一些历史原因(例如,]是否被映射到现在在ASCII表中占据的m槽位?)还是任意字符选择?


你看过完整的 ANSI 转义码 列表了吗? - Eugene Sh.
哦,那样更有意义。我想这可能是一个偏移量错误,或者由于]m的值相差16个插槽所以才出现这种情况。 - Beefster
2个回答

2

Thomas Dickey的回答进行了一些扩展。

ECMA-48的第8.3.117节描述了“SGR - 选择图形修饰”控制函数:

符号:(Ps...)

表示:CSI Ps... 06/13

参数默认值:Ps = 0

SGR用于为随后的文本建立一个或多个图形修饰方面。

根据第5.4节“控制序列”,控制函数由最终字节标识。表3“没有中间字节的控制序列的最终字节”还指出,代码06/13表示SGR控制函数。

看一下ASCII码表的第6列第13行:字符m在这里(换句话说,代码为0x6d的字符是m)。

所以,这个想法是:SGR函数(管理文本外观)的代码是06/13。我们通过其代码调用此函数(按名称寻址函数是相当现代的概念;))。当将函数的代码视为字符代码时,函数的代码对应于字母m。因此,您不需要编写所有这些数字,只需一个字母,非常方便:)

m不是有意义的字母,它只是数字的替代。因此,您的问题应该是“为什么SGR函数的代码是06/13?”答案是:“请参阅上述表3。这是偶然的结果。”

顺便提一下,CSI 由位组合01/11(表示ESC)和05/11([)在7位代码或由位组合09/11在8位代码中表示。因此,在现代8位环境中,您可以摆脱转义,只需使用单个控制字符即可实现CSI:
#!/usr/bin/env python3
CSI = '\x9b'  # 09/11: Control Sequence Introducer
SGR = '\x6d'  # 06/13: Select Graphic Rendition
P = '32'      # green display
print(f'{CSI}{P}{SGR}Hello, green world!{CSI}0{SGR}')

1

这不是完全随意的,而是遵循委员会制定的方案,并在ECMA-48(与ISO 6429相同)中记录。除了最初的Escape字符外,后续字符由范围指定。

虽然广泛使用Escape[这对组合符号(称为控制序列引导符CSI),但还有其他控制序列(例如Escape],操作系统命令OSC)。这些序列可能具有参数和一个最终字节

在这个问题中,使用CSIm是一个最终字节,它恰好告诉终端该序列应该做什么。如果给出参数,则是数字列表。另一方面,使用OSC,命令类型在开头,参数不太受限制(可以是任何可打印字符的字符串)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接