为什么Vim颜色在tmux内部和外部看起来有所不同?


29

环境:

  • Fedora 25(4.9.12-200.fc25.x86_64)
  • GNOME终端3.22.1使用VTE版本0.46.1 + GNUTLS
  • VIM-Vi IMproved 8.0(2016年9月12日,2017年2月22日16:26:11编译)
  • tmux 2.2

我最近开始使用tmux,并且观察到Vim中的颜色会根据我在tmux内部还是外部运行而变化。下面是查看Git差异时Vim在tmux外部(左)和内部(右)的屏幕截图:

在此处输入图片说明

我的TERM变量是

  • 外部tmux: xterm-256color
  • 内部tmux: screen-256color

Vim按预期(通过:set term?)报告以下终端类型:

  • 外部tmux: term=xterm-256color
  • 内部tmux: term=screen-256color

Vim还报告两个实例都以256色模式运行(通过:set t_Co?):

  • 外部tmux: t_Co=256
  • 内部tmux: t_Co=256

关于让Vim在tmux中以256色模式运行(我发现最好的答案是在这里),还有很多类似的问题,但是鉴于以上信息,我认为这不是我的问题。

如果我在终端类型设置为Vim的情况下运行Vim,则可以在tmux之外复制该问题screen-256color

$ TERM=screen-256color vim

因此,我认为xterm-256colorscreen-256color终端功能之间仅存在一些差异会导致颜色差异。这就引起了标题中提出的问题:终端功能中的哪些特定因素导致Vim颜色不同? 我看到了在:set termcap内部和外部运行tmux 之间的差异,但是我很好奇哪个变量实际上导致了行为上的差异。

与上一个问题无关,在tmux内部或外部运行时,Vim颜色是否可以保持一致? 我尝试过的一些事情包括:

  • 显式地将默认终端tmux使用设置~/.tmux.conf为各种值(有些违反了tmux FAQ的建议):
    设置-g默认终端“ screen-256color”
    设置-g默认终端“ xterm-256color”
    设置-g默认终端“ screen.xterm-256color”
    设置-g默认终端“ tmux-256color”
  • 使用启动tmux tmux -2

在所有情况下,Vim继续在tmux内部显示不同的颜色。


您能否启动script,启动vim,退出vim然后退出script的shell,并附加生成的typescript文件?然后TERM=screen-256color vim改为重复相同的步骤。
egmont

@egmont到这里:typescript -xterm-256colortypescript-screen-256color
Rusty Shackleford

1
我可以在xterm-256color版本中看到256色的转义序列(在文件中搜索“ 38; 5;”),但在中看不到screen-256color。例如,无论哪里有\e[38;5;81min xterm-256color(包含256色调色板的颜色#81,中间的蓝色阴影),都screen-256color包含\e[34m(包含8色调色板的标准蓝色)。所以主要的问题是为什么在vim的情况下vim不使用256色调色板TERM=screen-256color
egmont

另一个有趣的事情是,该xterm-256color版本似乎在屏幕上打印了两次,首先是使用旧色,然后是256色调色板。在文件中搜索“ F1”,您将在中找到两个匹配项xterm-256color,第一个匹配项带有\e[34m颜色,第二个匹配项带有\e[38;5;81m。我不知道这是怎么回事。
egmont

添加set -g default-terminal "screen.xterm-256color"~/.tmux.conf并重新加载在TMUX的配置:对我来说(亮点问题)的工作(<铯>源文件〜/ .tmux.conf)。thx
dtrckd

Answers:



17

我以前也有类似的问题。Vim中蓝色的注释很难阅读。在.tmux.conf我设置:

set -g default-terminal "screen-256color"

并在.vimrc

set background=dark

现在看起来如下所示,并且可以在Gnome Terminal和Cygwin中使用: 在此处输入图片说明


3
这为我解决了。由于某种原因,在tmux内部,vim并未检测到深色背景。bg=dark在我的vimrc中显式设置可以修复它。
亚当·基南

奇怪-我的$TERM内部和外部tmux都是如此,"xterm-256color"并且明确设置背景也对我有用。谢谢!
nronnei 18-10-11

也为我工作。我认为问题出在哪里,stterm因为xfce4-terminal一切看起来都很舒服(出现的注释cyan而不是blue深色背景,很难阅读)。更改之后,一切正常。但是请记住要添加unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vim到vimrc文件中以使用语法突出显示等...
Abinash Dash

2

感谢@egmont对Vim何时输出什么颜色的分析,TERM=screen-256color启发了我看一下Vim在两种情况下使用的配色方案。

Vim报告default两种情况下都使用配色方案。我觉得很奇怪,因为defaultFedora 25(/usr/share/vim/vim80/colors/default.vim)上的配色似乎与我当时实际看到的颜色不符TERM=xterm-256color。如果我使用:colorscheme defaultwhen 显式设置颜色方案TERM=xterm-256color,则Vim的外观将变为when TERM=screen-256color。为了使颜色恢复到我第一次启动Vim时的状态,我必须使用ron颜色方案。进展!

我发现一个Ask Ubuntu的答案表明,当Vim报告它正在使用default配色方案时,它不一定表示default.vim特定主题的配色方案。正如答案所指出的ron,就像我在上面发现的那样,深色主题(我正在使用)与配色方案相对应。(即使这篇文章是关于Ubuntu的,我还是假设OP正在使用GNOME。)

我还发现了另一个问题,似乎在描述我遇到的相同问题。在发布此问题之前,我在搜索时碰到了它,但是由于某种原因,配色方案并没有让我感到与之相关。

我最终做了@LapshinDmitry在他的回答中所做的事情,并明确地colorscheme ron在我的~/.vimrc文件中进行了设置。现在,无论我在tmux内部还是外部启动Vim,颜色看起来都一样。唯一的缺点是,如果我将桌面主题从深色调变为浅色调,Vim不会自动切换到“默认”浅色主题配色方案,这显然是peachpuff。我可以忍受,因为我不太可能改变自己的主题。

我不会接受这个答案,因为我考虑在~/.vimrc解决方法中而不是在解决方案中显式设置颜色方案。如果有人可以解释为什么Vim根据的值加载不同的“默认”配色方案TERM,我将很乐意接受该答案,因为我对理解根本原因更感兴趣。我怀疑这与Vim如何解释两个terminfo文件之间的终端功能有关。


我也很好奇为什么vim会这样。毕竟,该bce功能应该与可用的颜色数量无关。
egmont

@egmont我将@ThomasDickey的答案解释为:1)Vim检查bce终端的功能,2)如果存在,请选择配色方案“ A”,3)否则,请选择配色方案“ B”。我相信两种情况下的色彩深度都是相同的(即如图t_Co所示为256色)。这只是配色方案“B”我的系统上发生的,只使用,即使256点的颜色是8色调色板可能(我认为这说明了你在你的打字稿分析观察到的东西;请纠正我,如果我错了)。记住,运行后:colorscheme ron,我在同一Vim会话中看到256色转义序列。
Rusty Shackleford

感谢您的解释-尽管我仍然看不到任何背后的理由。没关系。vim有非常奇怪的设计决策。
egmont

0

我的TERM变量是tmux外部:xterm-256color tmux内部:screen-256color

没错,对我有用。在其他终端(我使用urxvt)上尝试一下,看看Gnome终端是否有问题。</ s> </ s> </ s> 

还要检查COLORTERM(我的设置为rxvt)和unset TERMCAP


感谢您的建议。我使用urxvt(外部TERMrxvt-unicode-256color)进行了相同的测试,但使用了适当的代码~/.Xdefaults,不幸的是仍然在tmux的内部和外部观察到了不同的颜色。对于gnome-terminal场景,tmux内部和外部的COLORTERMis truecolorTERMCAP为空。对于urxvt的情况下,COLORTERMrxvt-xpm外面和truecolor里面TMUX,虽然TERMCAP是空的内外TMUX。
Rusty Shackleford

@RustyShackleford这仅适用于Vim吗?您是否在使用'termguicolors'?查看:help xterm-true-color或尝试使用更默认的Vim配置。
laktak

到目前为止,我只注意到Vim中的问题(就像我说的那样,我直到最近才开始使用tmux)。例如,我的终端提示符和Git CLI输出在tmux内部和外部都具有相同的颜色。在这两种情况下termguicolors,我均未设置.vimrc:set termguicolors?报告notermguicolors。我将看一下您引用的帮助主题。谢谢!
Rusty Shackleford

0

以后我无疑会在Google上设置此机器时,以供我参考。

  • Vim8 / Neovim
  • Windows 10
  • git bash
  • Tmux 2.7

使用以下说明将必要的二进制文件和DLL放入Git bash的PATH中:

https://blog.pjsen.eu/?p=440

使用以下命令进行配置:

echo 'set -g default-terminal "screen.xterm-256color"' > ~/.tmux.conf
tmux -2u
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.