RGB 值如何/在哪里映射到 xterm 颜色代码?它们可以被覆盖吗?

问题描述 投票:0回答:1

我试图准确了解颜色在我的终端模拟器(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中重新定义(这是一个例子),但我不确定一些事情:

  1. .Xresources 特定于 xterm 终端模拟器,而我正在使用 iTerm2,所以(我相信)这与我的情况无关。我搞砸了,iTerm2 似乎不尊重 .Xresources 配置。我无法找到有关此主题的更多文档。
  2. 我读过,xterm 将近似网络安全调色板之外的 .Xresources 的颜色定义 - 我不确定这是否属实或到底是如何完成的,但我认为这是与相关的历史限制用于存储颜色的位数。

所以在这一点上我相信它的工作方式是:

  1. 终端应用程序发出 xterm 兼容的转义代码序列 - 并且颜色始终定义为 xterm 颜色代码 (0-255)。
  2. iTerm2 检测转义序列。
  3. iTerm2 使用遵循 X11 的 rgb.txt 的内部映射将 xterm 颜色代码映射到 HSL 值。
  4. iTerm2 使用 cocoa API 渲染颜色。

因此,颜色映射或转换中不涉及其他应用程序(X11 或任何其他应用程序) - 它是直接从终端应用程序到终端模拟器的。

情况就是这样,因为 iTerm2 只允许用户配置“基本 16 种颜色”,因此用户在渲染这些颜色时可以自由使用真彩色,但仅限于所有其他颜色的网络安全调色板。

这是正确的吗?

vim xterm iterm
1个回答
3
投票

默认的 xterm 调色板 是标准的,并且预计在每个 xterm 实现中都是相同的。 它与仅由 GUI 程序使用的或多或少标准的 rgb.txt 不同

前 16 种颜色,0-15,有或多或少的标准名称,“红色”,“深绿色”等,但所有其他颜色只能通过其编号来引用,从 16 到 255。

前 16 种颜色通常可以由用户定义(使用 CMYK、HSL、RGB 或十六进制表示法,没关系),因此在配色方案中使用“红色”或“2”几乎是在黑暗中进行的尝试无法保证“红色”实际上就是红色。晒太阳是一个可怕的例子,传统上称为“亮绿色”的颜色实际上是深灰色。

大多数“现代”终端模拟器允许您使用 GUI 定义这 16 种颜色,但其他更“老式”的模拟器(如 xterm 或 rxvt)则使用

~/.Xresources
。该文件完全被 iTerm 忽略,因此您不应该在其上浪费时间。

可以更改 xterm 调色板,但很少有人知道这一点,这使得这种做法非常不常见

所以……

  • 终端模拟器不使用 rgb.txt,
  • 颜色 0-15 可由用户配置,
  • 颜色 16-255 仅限于第一个链接中的色卡,
  • 颜色 16-255 可以更改,但很少见,
  • iTerm 不使用 .Xresources。
© www.soinside.com 2019 - 2024. All rights reserved.