tmux、TERM 和 256 色支持

Atc*_*old 56 colors vim terminal tmux

介绍

我的问题源于需要了解为什么现在(经过多次试验)支持 256 种颜色的终端tmuxtput colors告诉我只有 8种颜色。


背景

让我们从头开始。

我正在使用Ubuntu盒子、GuaketmuxVim并且我喜欢主题Solarized。它们看起来非常糟糕,所以我决定启用 256 色支持并稍微玩一下。

让我们看看我的Terminal会发生什么。tput colors说有8种颜色。我个人将它们设置为紫色,在左侧,当然在右侧我们有 2 种不同深浅的蓝色。$TERMxterm。(有颜色的lseval 这个在我的.bashrc。)

在此处输入图片说明

Vim看起来也不错,尽管我256支持256 色的环境中用标志调用它。

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized
Run Code Online (Sandbox Code Playgroud)

唯一抱怨色彩空间减少的人是tmux。调用tmux提供了“错误”的预期结果。

在此处输入图片说明

但是tmux-2标志调用使一切正常,神奇地

在此处输入图片说明

现在我唯一明白的是它-2相当于export TERM=screen-256colorsource)。

Guake 的行为类似于Terminal并且他们都回答xterm了这个问题echo $TERM


基本上,有没有人明白为什么即使不应该一切正常?

  • 我抱怨为什么事情有效吗?也许。
  • 有更好的理由吗?当然:我想修复我办公室中其他 Ubuntu 盒子的外观,我想了解为什么事情有效或无效。

额外的实验

在 my 上运行此脚本(稍作修改)xterm提供以下结果:256 种颜色,但只有 16 种颜色显示正确。

在此处输入图片说明

然后,更改终端的配置文件,这 16 种颜色也会发生变化。

在此处输入图片说明

更多测试如下。

从左至右,从上到下,我们有Solarized色彩主题,dircolor ansi-dark256dark,然后默认(探戈)配色方案,dircolor ansi-dark256dark

在此处输入图片说明

观察:在理论上,dircolor ansi-darkSolarized配色方案应紧扣有比赛dircolor 256dark。对于特定列出的文件,这并没有明显发生。相反,当工作目录中有文件夹文本文件符号链接时,就会发生这种情况。结论:在编码256dark颜色时没有给予太多关注。


初步结论

xterm不管怎么说,它支持 256 种颜色tput colors。程序可以参考ansi调色板(可由用户定制)或定义它们的颜色,从总共 256 种颜色中进行选择。

Gil*_*il' 39

tmux FAQ 中有一些关于 256 色支持的信息。

不幸的是,由于历史原因,检测终端支持的颜色数量并不简单。有关解释,请参阅检查我的终端仿真器支持多少种颜色。这意味着

  • tmux 无法可靠判断终端是否支持超过 8 种颜色;
  • tmux 无法可靠地通知应用程序它支持超过 8 种颜色。

当您在 tmux 中时,您正在与之交互的终端是 tmux。它不支持所有 xterm 的控制序列。特别是,它不支持OSC 4 ; …查询或设置颜色值的控制序列。您需要在 tmux 之外的 xterm 中直接运行时使用它。

如果您运行tmux -2,则 tmux 以 256 色支持开始,即使它认为您的终端不支持 256 色(这很常见)。

默认情况下,tmux 宣称自己screen不支持 256 色。您可以更改TERMin的值.tmux.conf以指示 256 色支持:

set -g default-terminal "screen-256color"
Run Code Online (Sandbox Code Playgroud)

您可以在 Ubuntu 上使用TERM=xterm-256colorTERM=screen-256color。如果您登录到没有这些名称的 termcap/terminfo 条目的远程计算机,这些值只会导致麻烦。您可以将条目复制到远程机器上的主目录;这适用于大多数现代 terminfo 实现。

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
Run Code Online (Sandbox Code Playgroud)

  • @Atcold U&L 的答案有“TERM=xterm-256color tmux”,这是明智的,与“TERM=screen-256color tmux”不同。`tmux -2` 更胜一筹,因为即使 `screen-256color` 不在本地 terminfo 数据库中,它也能工作。 (2认同)

Mes*_*ion 26

我对答案(和问题!)的格式和详细程度印象深刻。虽然他们提供了有关您提到的工具的有价值的信息和解决方案,但他们几乎没有提供关于到底发生什么的见解,最重要的是,为什么事情(在某种程度上)适用于某些工具,而它们本来不应该工作。

所以这里有一些关于你的基本问题的见解:

  • 终端支持什么和它报告什么是不同的东西。例如,Gnome 终端能够显示 256 种颜色,但它作为模拟器(8 种颜色)向环境(通过变量)宣布自己。$TERMxterm

  • tput按照任何TERM设置的工具:tput colors可能会打印 8,而env TERM=xterm-256color tput colors会打印 256,无论您的终端是否真的支持这样的功能。

  • vimTERM默认情况下也遵循,但正如告诉它使用 256 种颜色(通过标志或set t_Co=256),它将使用 256 种颜色。它之所以有效,是因为您的终端实际上支持它。

  • tmux,就像 Gnome 终端一样,默认情况下也将自己报告为 8 色终端。但是,与 Gnome Terminal 不同的是,如果您使用该标志,它只能启用256 色功能-2,这也使其将自己报告xterm-256color兼容的模拟器。

  • xterm,就像在X11 的终端仿真器软件中一样,肯定支持 256 种颜色。但xterm因为TERM=xterm是 8 色“标准”。它意味着原始 的能力xterm。很久以前,当它升级为支持 256 色时,它创造了这个xterm-256color术语。

所以这一切都归结为:

  • 您的终端实际支持哪些功能(并已启用)

  • 它如何通过以下方式向环境报告此类功能 TERM

  • 工具如何相应地解释TERM和调整自身。

  • 正如你可以从上面推断的那样,避免export TERM=xterm-256color在你的~/.bashrc和这样的脚本中敲打。由于这些文件的执行与您实际使用的终端无关,因此它将使您的所有终端(包括从 Windows 与 Putty、Linux 控制台终端等进行远程连接)报告为与 xterm-256color 兼容。这对某些人来说可能是正确的,但肯定不是对所有人来说。例如,getty您使用CTRL+ALT+1..6,访问的 linux 控制台不会。

  • 终端应该将自己报告为它们最兼容的“标准”。如果您知道它们可以处理 256 种颜色,请将它们配置为这样做广告。

最后但并非最不重要的是,关于TERM256 种颜色的惊人阅读是:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/


小智 5

我将提供一个补充答案,该答案仅针对与曝光目录颜色相关的其他实验。

设置

我们有来自测试脚本的相同颜色输出。唯一的区别是我lxterminalOpenbox 上使用了slimxcompmgr并且没有 DM。因此,我无法像您一样轻松设置自定义调色板,因为该终端模拟器不提供 GUI 中的这些设置,并且没有特定的主题(仅存在于少数终端模拟器中)。所以我只是使用一些半透明的、未装饰的终端和蓝色作为前景色和蓝色的Gentoo背景。由于我无法使用颜色文件的ansi版本,因此我只专注于使用dircolors.256dark“降级”简单版本获得结果。

我使用了以下相关配置和inconsolata medium 字体:

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"
Run Code Online (Sandbox Code Playgroud)

目录色

下图显示了使用这些设置在tmux内部和外部发生的情况。左边的前三分之一显示了垂直堆叠的未修饰的lxterminal窗口 (3)。在右侧,您有一个tmux程序集,显示相同的程序 (3) 我还使用完整包中包含的.Xresources 文件包含了一个显示 nano的日光化xterm1(并使用 对其进行采样):xrdb -load ~/.Xresources

在此处输入图片说明 请右键单击/查看图像以全分辨率检查

左上角的第一个终端展示了默认的目录颜色。下面是降级的日晒版本。除了.c我添加的文件的蓝色背景上的粉红色外,它与预期的相同(请参阅下图以供参考)。与默认值相比,它进一步构建了扩展属性,即粗体/浅色/反转等,并且颜色明显不同。.txt许多发行版中文件的默认颜色分配为绿色,但在solarized时应为灰色。将.txt 文件渲染为绿色的ansi文件要么无法正确渲染,要么根本无法渲染。您显示的右侧结果是与以下参考相关的正确结果(256dark):

在此处输入图片说明 日晒“退化”dircolors参考图

观察

使用我使用的配置,结果在 tmux 内部和外部看起来是相同的(我在 vi 中反转了注释 (#),否则插件的行为应该如此,多路复用器对此没有影响)。字体在solarized功能定义中发挥着巨大的作用,需要一个好的字体来最大化体验。使用256dark文件的日光化目录颜色与参考匹配,不需要特定的终端仿真器配置。


结论

实际上目录颜色的ansi渲染与降级的solarized(256dark)完全不同。以至于ansi 下的.txt文件都是绿色的。一个不能用于验证另一个的渲染。两种解决方案都需要不同的配置并产生完全不同的结果。