如果我将终端背景设置为颜色#1a2b3c
然后用printf '\e]11;?\a'
I get back查询它]11;rgb:1a74/2b98/3cb6
1a74
红色、绿色2b98
和蓝色的假定值是什么编码3cb6
?
如果我只取每个段的前两个字符 ( 1a
74/ 2b
98/ 3c
b6),那么我会得到原始颜色- 那么、和是1a2b3c
什么?74
98
b6
答案1
作为xterm 控制序列参考文档中所述,OSC 11 ; <spec> BEL
转义序列改变[这]VT100文字背景色接受标准支持的颜色规格XParseColor
X11功能1,什么时候<spec>
是?
:
如果一个 ”?”给出而不是名称或 RGB 规范,xterm 回复相同形式的控制序列,可用于设置相应的动态颜色
手册XParseColor(3)
页告诉我们:
RGB 设备规范由前缀标识
rgb:
并符合以下语法:rgb:<red>/<green>/<blue>
<red>
,<green>
,<blue>
:=h
|hh
|hhh
|hhhh
h
:= 单个十六进制数字(不区分大小写)注意,分别
h
表示以4位缩放的值、hh
以8位缩放的值、hhh
以12位缩放的值和hhhh
以16位缩放的值。为了向后兼容,支持 RGB 设备的旧语法,但不鼓励继续使用它。语法是一个初始的锐号字符,后跟一个数字规范,采用以下格式之一:
#RGB
(各 4 位)
#RRGGBB
(各 8 位)
#RRRGGGBBB
(各 12 位)
#RRRRGGGGBBBB
(各 16 位)、
R
、G
和B
代表单个十六进制数字。当指定的每个位少于 16 位时,它们表示值的最高有效位(与rgb:
对值进行缩放的语法不同)。例如,该字符串#3a7
与 相同#3000a0007000
。
所以你确实得到了<ESC>]11;rgb:1a74/2b98/3cb6<BEL>
,这意味着颜色:
- 红色强度为十六进制 0xffff 中的 0x1a74
- 绿色强度为十六进制 0xffff 中的 0x2b98
- 蓝色强度为十六进制 0xffff 中的 0x3cb6
这将被#1a2b3c
缩放到每个原色 16 位,尽管我不知道如何在您的终端上完成缩放。
在 Debian 和基于xterm
, konsole
orvte
的终端(例如 )中gnome-terminal
,我得到$'\e]11;rgb:1a1a/2b2b/3c3c\a'
0x1a1a 是 0x1a * 0xffff / 0xff 的位置,但这似乎仍然与上面的文本相矛盾,表明应该与我假设的#1a2b3c
相同,尽管也意味着是不是最亮的白色。#1a002b003c00
rgb:1a00/2b00/3c00
#ffffff
在 rxvt 中,我得到$'\e]11;rgb:1a00/2b00/3c00\a'
(并且$'\e]11;rgb:1a1a/2b2b/3c3c\a'
在发送时$'\e]11;rgb:1a/2b/3c\a'
与上面的手册页一致XParseColor
)。
在 kitty 中,我得到$'\e]11;rgb:1a1a/2b2b/3c3c\e\\'
(ESC \
(又名ST
) 分隔符而不是 BEL,但其他方面与 xterm 和 co) 中的相同。
如果我运行ltrace -e XParseColor "$terminal" -bg '#1a2b3c'
,添加后:
typedef XColor = struct(ulong, hex(ushort), hex(ushort), hex(ushort), hex(char), hex(char));
int XParseColor(addr, int, string, +XColor*);
到~/.ltrace.conf
,无论是rxvt
或xterm
,我看到:
xterm->XParseColor(0x55df687228f0, 57, "#1a2b3c", { 0, 0x1a00, 0x2b00, 0x3c00, 0x7, 0 }) = 1
对于ltrace -e XParseColor "$terminal" -bg rgb:1a/2b/3c
,我看到:
xterm->XParseColor(0x557da7d8b8f0, 57, "rgb:1a/2b/3c", { 0, 0x1a1a, 0x2b2b, 0x3c3c, 0x7, 0 }) = 1
这似乎表明rxvt
这是唯一正确的,但实际上这可能不会产生任何影响,因为大多数显示设备仅支持每种原色 8 位。
¹ 这里有一个指向 Arch Linux 手册页的链接,作为手册页呈现在x.org 上的那个目前已损坏。检查您的系统上的man XParseColor
或。man XQueryColor