ANSI 转义代码“ESC[1;31m”将终端前景色设置为红色,那里的“1”是什么意思?

ANSI 转义代码“ESC[1;31m”将终端前景色设置为红色,那里的“1”是什么意思?

佩拉维基百科页面上,ANSI 转义代码ESC[1;31m将终端前景色设置为红色,这符合预期

在此处输入图片描述

该 ANSI 转义码中有 2 个参数131。我知道其中一个31对应于下表中的前景色。1那里是什么意思?

在此处输入图片描述

答案1

这记录在上两段中的另一个表格

一般规则是,ESC [ ... m由以下列表组成单独的 SGR 格式代码。第一个参数没有特殊含义——1只是“粗体”或“亮体”文本的格式代码。(是否将文本设为粗体、亮体或两者皆可由终端决定。)

作为一个更复杂的例子,ESC[;1;3;31;47m首先重置格式(0),然后使文本变为粗体(1)和斜体(3),然后将前景设置为红色(31),将背景设置为白色(47)。


一般规则的例外情况:

请注意,“事实上”接受的 256 色和真彩色代码格式违反了此语法。例如,指定颜色 #42 的正确方法是ESC[38:5:42m(“38:5:42”是单个格式代码),但通常写为ESC[38;5;42m(好像它们是 3 个单独的代码),并且终端通常会有特殊处理来重新组合这 3 个参数。

类似地,24 位或真彩色代码的正式写法是ESC[38:2::R:G:Bm(具有多个子字段的单个代码),但您经常会看到ESC[38;2;R;G;Bm相反的情况。这在终端中也有特殊处理,因为 5 个单独的“代码”被重新组合成单​​个真彩色格式代码。

答案2

我想用附注来修改用户 1686 的优秀答案。

传统上,终端仅支持 16 种颜色(8 种基本颜色及其更亮的颜色)。后来出现了 256 种颜色支持,并得到了广泛应用,如今几乎每个终端仿真器都支持它们。在过去几年中,真彩色(16M 种颜色)扩展也变得相当普遍。但是,ESC[1m仍然只影响前 8 种调色板颜色的亮度,并且只影响前景色。(改变直接 RGB 真彩色值肯定是没有意义的。)

同时,虽然其他字体或装饰有独立且明确的代码(例如 3 表示斜体,4 表示下划线等),但没有办法启用粗体字体而不产生副作用。

为了清除这一遗留问题并能够顺利向前发展,一些终端仿真器特意决定ESC[1m只允许切换到粗体字体,而不改变颜色。有些将此设为默认设置,同时允许您切换回旧行为,有些仅支持这种仅粗体行为。

我希望将来会有越来越多的终端模拟器走这条路。

相关内容