![终端如何产生准确的颜色?](https://linux22.com/image/224201/%E7%BB%88%E7%AB%AF%E5%A6%82%E4%BD%95%E4%BA%A7%E7%94%9F%E5%87%86%E7%A1%AE%E7%9A%84%E9%A2%9C%E8%89%B2%EF%BC%9F.png)
背景
我在各种设置中使用终端。通常,程序的颜色输出无法在屏幕上正确呈现。
互联网上充满了用于修复特定设置的颜色的方法。但是,我对这些修复背后的概念缺乏了解。
问题
我需要了解哪些概念才能理解为什么我的终端颜色可能会关闭?
我正在运行vim
,寻呼机bat
具有不同的颜色配置文件。所有这些都在同一个终端会话中。
我正在使用终端模拟器foot
和alacritty
Wayland (sway),以及 ssh 和 tmux。
测试颜色正确性
为了测试颜色正确性,我使用寻呼机bat
:
bat --list-themes
它向终端输出 20 多个不同主题的彩色示例代码。然后我比较不同机器和设置上的输出
PS当我写终端时,我指的是终端或终端模拟器
答案1
终端可以通过两种主要方式提供颜色:较旧的索引调色板和较新的真彩色终端模式。前者包括所有 8、16 和 256 色模式,这些模式几乎用于除以 结尾的终端定义之外的每个终端定义中-direct
。 (还有一些 88 色模式,这些模式从来都不是非常流行,而且现在实际上已经没有使用了。)
然而,8 色和 16 色序列没有标准定义,虽然 256 色调色板有惯用值,但某些终端仿真器的行为也有所不同。因此,除了假设 1 代表红色之外,您不能真正假设终端中会出现任何特定的颜色,事实上,人们可以并且确实出于各种原因选择自定义确切的颜色。例如,我使用半透明终端(最终类似于灰色),而深红色难以辨认,所以我更喜欢使用颜色较浅的主题。
维基百科文章涵盖 ANSI 颜色显示每个终端仿真器的差异,这表明终端仿真器之间可用的阴影种类繁多,所有这些都被认为是正确的行为。请注意,一般来说,是终端模拟器本身为主调色板(在我的例子中为 Alacritty)选择颜色,并且在该终端模拟器中运行的所有其他程序(包括通过 SSH 运行的程序)应该对索引调色板使用相同的值。
现在,如果您使用终端的 24 位真彩色模式,您应该获得相同的颜色。许多程序都支持此模式,但可能很难激活,因为通常TERM
未设置以 结尾的定义-direct
,这表示执行真彩色的终端类型。例如,许多终端仿真器默认为xterm-256color
即使它们实际上支持真彩色,因为xterm-direct
它更新得多并且跨系统兼容性差得多(例如,当通过 SSH 登录时)。TERM
如果您知道您的终端模拟器和操作系统将支持它,您可能需要在终端模拟器的配置或 shell 的启动代码中自行设置。
termguicolors
现代版本的 Vim 确实支持真彩色模式,并且如果启用的话可以在终端中使用 GUI 颜色(并且设置t_8f
和模式,如终端定义所示)。t_8b
许多其他程序,包括 Git,也支持配置颜色,这不仅是一个很好的功能,而且对于可访问性也很重要(例如,允许患有某些类型色盲的人选择合适的颜色)。
此外,tmux 有一个功能,它可以接受比它可以发出的颜色更多的颜色。例如,如果在 tmux 会话中,我使用tmux-direct
发出真彩色输出的程序,但稍后重新连接到 Linux 控制台(只有 16 种颜色),那么 tmux 将尝试将颜色映射到最接近的支持的色调,这将使事情正常进行(这是好事),但会导致丑陋的输出(这是坏事)。在这种情况下,除了失败之外,没有什么可以做的。