有没有办法从 ANSI 转义字符创建橙色?

Is there a way to create an Orange color from ANSI escape characters?

我正在寻找使用 ANSI 或其他一些标准在终端中创建橙色文本的控制代码,这可能吗?我只看到黄色和红色可用,而且我认为您不能为同一个角色混合使用红色和黄色 :)

严格来说,不是:ANSI 从未标准化任何称为 "orange" 的东西(对于终端的控制序列)。有些终端可以做到这一点,但这不在标准范围内。

xterm(参见 XTerm Control Sequences) uses control sequences following the "ANSI" (actually withdrawn from standardization long ago) ECMA-48 语法。

  • 其中一些是通过 SGR 提供的标准 8 种颜色(不包括橙色)。
  • 它还(使用 aixterm SGR 扩展)添加了另外 8 种颜色。仍然没有橙色。
  • 但是,xterm 扩展(以一种不完全标准的方式)SGR 代码 38 和 48 以提供使用 RGB (red/green/blue) 值的颜色调色板。最大调色板大小编译为 88 或 256 色。

橙色可以由一个RGB码组成。例如 X 的 rgb.txt 文件将其定义为

255 165   0             orange

(亮红色加适度亮绿色)。要在 shell 脚本中获得它,可以使用

#!/bin/sh
printf "3[48:2:255:165:0m%s3[m\n" "Hello world"
printf "3[48;2;255;165;0m%s3[m\n" "Hello world"

这两行之间的区别是使用冒号作为参数分隔符(ECMA-48 有一些措辞更喜欢,对于 xterm 中使用的 subparameters,这是早期被忽视了)。为了兼容性(包括从 xterm 的早期实现中复制的终端),xterm 两者兼顾。

xterm 还支持称为 dynamic colors 的 "non-ANSI" 方案,它接受颜色 name,但设置整个屏幕的文本颜色。

最后,xterm 可以指定颜色来显示,而不是闪烁、粗体、斜体、反转和下划线(例如参见 [​​=12=] 的讨论)。这是通过 X 资源设置完成的(在转义序列的帮助下)。可以通过相同的 88/256 颜色扩展设置分配给这些资源的颜色。

256 调色板更兼容,也更易于使用。橙子个数:

printf "3[48:5:208m%s3[m\n" "Hello world"  # bright orange
printf "3[48:5:166m%s3[m\n" "Hello world"  # darker orange

您的终端下可能需要 semi-colons 冒号。