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

时间:2015-01-05 09:14:17

标签: vim xterm iterm

我试图准确理解终端模拟器(iTerm2)中的颜色处理方式。

在iTerm2中我可以配置我的" base 16"调色板 - 在iTerm2中,这是使用HSL而不是16位RGB值完成的。以这种方式定义的颜色是原生的 - 它们使用cocoa API,并不局限于典型的256色调色板(它们以真实颜色呈现)。

X11' s rgb.txt定义256色调色板中的颜色名称。

在shell,bash或zsh中,我可以使用带有echo -e "\e[38;5;82mHello \e[38;5;198mWorld"的16位256调色板打印文本(第三个参数是xterm颜色代码)

在vim(终端不是gui)中,颜色被用作' cterm'定义高光时的值(例如::highlight Normal ctermfg=188 ctermbg=233 guifg=#e8e8d3 guibg=#151515),但据我所知 - 没有办法使用RGB代码定义终端颜色,所以虽然我可以在真彩色中显示base16颜色,其余的颜色任意限制在256色调。

我无法弄清楚的是rgb值映射到xterm代码的位置。它似乎是一种任意关系(xterm代码似乎与RGB值没有函数关系),所以我假设某处必须有映射。

我相信可以在.Xresources(here is an example)中重新定义颜色,但我不确定几件事情:

  1. .Xresources特定于xterm终端模拟器,我使用iTerm2,所以(我相信)这与我的情况无关。我已经陷入困境,iTerm2似乎并不尊重.Xresources配置。我无法找到有关此主题的更多文档。
  2. 我已经读过xterm将近似于网络安全调色板之外的.Xresources的颜色定义 - 我不确定这是真的还是它是如何完成的,但是我想这是与用于存储颜色的位数相关的历史限制。
  3. 所以在这一点上我相信它的工作方式是:

    1. 终端应用程序发出与xterm兼容的转义码序列 - 颜色始终定义为xterm颜色代码(0-255)。
    2. iTerm2检测到转义序列。
    3. iTerm2使用内部映射,尊重X11的rgb.txt,将xterm颜色代码映射到HSL值。
    4. iTerm2使用cocoa API渲染颜色。
    5. 因此,颜色映射或转换中不涉及其他应用程序(X11或其他任何应用程序) - 它直接从终端应用程序到终端仿真器。

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

      这是对的吗?

1 个答案:

答案 0 :(得分:3)

The default xterm palette是标准的,并且预计在每个xterm实现中都是相同的。 不同来自或多或少的标准rgb.txt仅供GUI程序使用。

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

前16种颜色通常可由用户定义(使用CMYK,HSL,RGB或十六进制表示法,无关紧要),因此在colorscheme中使用“red”或“2”几乎是一个镜头。黑暗,因为无法保证“红色”实际上是红色的。 Solarized是一个可怕的例子,传统上被称为“亮绿色”的颜色实际上是深灰色。

大多数“现代”终端模拟器允许您使用GUI定义这16种颜色,但其他更“老派”模拟器(如xterm或rxvt)使用~/.Xresources。 iTerm完全忽略了该文件,因此您不应该浪费时间。

有可能change the xterm palette,但很少有人知道这使得这种做法非常不常见

因此...

  • 终端模拟器不使用rgb.txt,
  • 颜色0-15是用户可配置的,
  • 颜色16-255仅限于第一个链接中的颜色图表,
  • 颜色16-255 可以更改,但很少见,
  • iTerm不使用.Xresources。