我试图准确了解颜色在我的终端模拟器(iTerm2)中是如何处理的。
在 iTerm2 中,我可以配置我的“base 16”调色板 - 在 iTerm2 中,这是使用 HSL 完成的,而不是 16 位 RGB 值。以这种方式定义的颜色是原生的 - 它们使用 cocoa API 并且不限于典型的 256 调色板(它们以真彩色渲染)。
X11 的rgb.txt 定义 256 调色板中颜色的名称。
在 shell、bash 或 zsh 中,我可以使用 16 位 256 调色板通过
echo -e "\e[38;5;82mHello \e[38;5;198mWorld"
打印文本(第三个参数是 xterm 颜色代码)
在 vim(终端而不是 gui)中,定义突出显示时,颜色被用作“cterm”值(例如:
:highlight Normal ctermfg=188 ctermbg=233 guifg=#e8e8d3 guibg=#151515
),但是据我所知 - 没有办法使用 RGB 定义终端颜色代码,因此虽然我可以以真彩色显示 base16 颜色,但其余颜色任意限制为 256 调色板。
我一直无法弄清楚 rgb 值映射到 xterm 代码的位置。它似乎是一个任意关系(xterm 代码似乎与 RGB 值没有函数关系),所以我假设某个地方一定有一个映射。
我相信颜色可以在.Xresources中重新定义(这是一个例子),但我不确定一些事情:
所以在这一点上我相信它的工作方式是:
因此,颜色映射或转换中不涉及其他应用程序(X11 或任何其他应用程序) - 它是直接从终端应用程序到终端模拟器的。
情况就是这样,因为 iTerm2 只允许用户配置“基本 16 种颜色”,因此用户在渲染这些颜色时可以自由使用真彩色,但仅限于所有其他颜色的网络安全调色板。
这是正确的吗?
默认的 xterm 调色板 是标准的,并且预计在每个 xterm 实现中都是相同的。 它与仅由 GUI 程序使用的或多或少标准的 rgb.txt 不同。
前 16 种颜色,0-15,有或多或少的标准名称,“红色”,“深绿色”等,但所有其他颜色只能通过其编号来引用,从 16 到 255。
前 16 种颜色通常可以由用户定义(使用 CMYK、HSL、RGB 或十六进制表示法,没关系),因此在配色方案中使用“红色”或“2”几乎是在黑暗中进行的尝试无法保证“红色”实际上就是红色。晒太阳是一个可怕的例子,传统上称为“亮绿色”的颜色实际上是深灰色。
大多数“现代”终端模拟器允许您使用 GUI 定义这 16 种颜色,但其他更“老式”的模拟器(如 xterm 或 rxvt)则使用
~/.Xresources
。该文件完全被 iTerm 忽略,因此您不应该在其上浪费时间。
可以更改 xterm 调色板,但很少有人知道这一点,这使得这种做法非常不常见。
所以……