支持tmux,TERM和256色


48

介绍

我的问题来自必须理解为什么现在(经过多次试验)为何支持256种颜色的终端tmux,tput colors告诉我它们只有8种。


背景

让我们从头开始。

我使用的是Ubuntu盒子,GuaketmuxVim,我喜欢主题Solarized。它们看起来非常糟糕,所以我决定启用256色支持并稍作调整。

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

在此处输入图片说明

尽管在支持256256色的环境中我用标志将其称为Vim,但Vim看起来也不错。

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

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

在此处输入图片说明

但调用tmux-2标志使一切都做工精细,神奇

在此处输入图片说明

现在,我唯一可以确定的是,-2等效的export TERM=screen-256color)。

Guake的行为举止类似于Terminal,他们俩都回答xterm了这个问题echo $TERM


基本上,有人知道即使一切都不起作用,为什么一切正常吗?

  • 我是否在抱怨为什么事情会奏效?也许。
  • 有更好的理由吗?当然:我想修复办公室中其他Ubuntu盒子的外观,并且我想了解为什么事情起作用或不起作用。

额外实验

在我的计算机上运行此脚本(稍作修改)xterm可以得到以下结果:256色,但只有16种可以正确显示。

在此处输入图片说明

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

在此处输入图片说明

以下是更多测试。

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

在此处输入图片说明

观察:从理论上讲dircolor ansi-dark日光配色方案应与之紧密匹配dircolor 256dark。对于列出的特定文件,这显然没有发生。相反,当工作目录中有文件夹文本文件符号链接时,就会发生这种情况。结论:在编码256dark颜色时没有太多注意。


初步结论

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


1
阅读此答案及其下面的评论。它能回答您的问题吗?还可以查看此脚本以获取支持的实际颜色数量。
terdon

嗯...我还是有点困惑...但是,我想我至少了解这tput colors是一个不可靠的测试。你能检查一下我的初步结论吗?
Atcold

2
我对Gilleś答案的理解是,tput colors它只能返回一个值,并且在支持2,8、16、88或256种颜色的终端中,仅返回第一个值(在您的情况下为8)。要获得真正的价值,请使用我上次评论中的脚本。那会返回什么?
terdon

检查我上面的其他实验:)
Atcold 2014年

啊,对不起,我不好。
terdon

Answers:


33

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"

您可以在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/

我确实感谢您的解释,但是我不确定它是否针对我的问题。嗯,我同意我的问题范围很广,但是我并没有特别关注tmux。实际上,tmux是唯一表现符合预期的家伙。更神秘的是,xterm即使tput colors说了8个,也如何显示256种颜色。我猜想这个特定问题的答案已经由@terdon在他对问题本身的评论中解决。
Atcold

@Atcold这是一个很长的问题,但据我所知我已经回答了。我和terdon链接(并写了)的答案涵盖了与tmux无关的部分。如果不是tmux方面,您的问题将是该问题的重复。您还希望从答案中得到什么?
吉尔斯(Gillles)“所以-别再邪恶了”

1
@Gilles,我不想听起来刻薄。即使他在另一个问题中提到您的答案,我仍在尝试认可@terdon的“可接受的答案”。尽管如此,该set -g default_terminal "screen-256color"命令仍不足以在tmux中启用256色。您需要alias tmux='export TERM=screen-256color; /usr/bin/tmux'参考)。
Atcold

@Atcold不,不需要别名(我测试过)。此外,该别名没有意义:它假装tmux在屏幕或tmux内部运行。但是,tmux -2如果tmux认为您当前的终端不支持256色,则您确实需要按照我的上一段运行alias tmux='tmux -2'
吉尔斯(Gilles)'所以

2
@Atcold U&L答案具有的意义TERM=xterm-256color tmux,与有所不同TERM=screen-256color tmuxtmux -2之所以优越,是因为它即使screen-256color不在本地terminfo数据库中也能工作。
吉尔(Gilles)'所以

20

我对答案(和问题!)的格式和详细程度印象深刻。尽管它们提供了有关您提到的工具的有价值的信息和解决方案,但他们对到底发生什么,以及最重要的是,为什么事情(某些)在某些情况下本来应该对某些工具起作用却知之甚少。

因此,这里有一些关于您的基本问题的见解:

  • 终端支持什么和报告什么是不同的。例如,Gnome终端能够显示256种颜色,但是它通过仿真器(通过8种颜色)向环境宣布自身(通过$TERM变量xterm)。

  • 像工具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中等字体:

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"

暗色

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

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

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

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

观察结果

使用我使用的配置,结果在tmux的内部和外部都是相同的(我在vi中已经反转了注释(#),但否则插件的行为应达到预期的效果,并且多路复用器对此没有影响)。字体在日晒特征定义中扮演着重要角色,并且需要一种好的字体来最大化体验。使用256dark文件的日光化目录颜色与参考匹配,并且不需要特定的终端仿真器配置。


结论

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


“我不理解您的结论,认为没有对256dark编码给予太多关注,实际上,这是唯一产生日晒目录列表的彩色文件吗?” 我之所以感到困惑,是因为我考虑将其ansi-dark作为正确的输出(因为它使用的是非降级版本)。然后,如果您将的输出作为参考256dark,则您的思维定势将相反。
Atcold

“使用我使用的配置,tmux的内部和外部结果都相同。”当然,如果您使用256色,那么当然,只要您支持256色,它们都将以相同的方式呈现。“目前尚不清楚在这种情况下ansi解决方案还将提供什么...”结果将是真正的 Solarized(而不是近似值)。
Atcold

我明白。我还没有真正研究过ansi部分,因此我无法理解您来自哪里。无论如何,我发现您的Q令我非常感谢。也许现在我会更喜欢使用vi,因为我觉得它很不错。至于ansi的结果,实际上我现在已经看到了它的外观……他们只在这里展示了dir-colors 。为什么是h。他们在下面有不同的编码吗?...我的意思是我看到.txt绿色...灰色如何接近绿色?我不太了解他们的项目。

是的,我亲自联系了作者,答案是“这是他的个人定制,因为他喜欢这种方式”。我无语了...我很高兴我的Q帮助了某人:)
Atcold 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.