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

Rus*_*ord 49 colors vim terminal tmux

环境:

  • 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)
  • 多路复用器 2.2

我最近开始使用 tmux 并观察到 ​​Vim 中的颜色会根据我是在 tmux 内部还是外部运行而变化。下面是 Vim 在查看 Git 差异时在 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,我可以在 tmux 之外复制问题screen-256color

$ TERM=screen-256color vim
Run Code Online (Sandbox Code Playgroud)

所以这让我相信导致颜色差异的终端功能xterm-256colorscreen-256color终端功能之间存在一些差异。这就引出了标题中提出的问题:终端功能中具体是什么导致 Vim 颜色不同? 我看到了在:set termcaptmux 内部和外部运行之间的差异,但我很好奇哪些变量实际上导致了行为的差异。

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

  • 将 tmux 使用的默认终端显式设置~/.tmux.conf为各种值(有些不符合 tmux FAQ的建议):
    set -g 默认终端“screen-256color”
    set -g 默认终端“xterm-256color”
    set -g 默认终端“screen.xterm-256color”
    set -g 默认终端“tmux-256color”
  • 开始使用TMUX tmux -2

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

Vit*_*gov 38

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

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

并在.vimrc

set background=dark
Run Code Online (Sandbox Code Playgroud)

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

  • 这为我解决了它。出于某种原因,在 tmux 中,vim 没有检测到深色背景。在我的 vimrc 中显式设置 `bg=dark` 修复了它。 (6认同)

Tho*_*key 26

tmux不支持 terminfo 功能bce(背景颜色擦除),它会vim检查以决定是否使用其“默认颜色”方案。

那个特点tmux已经被提到过几次了——


Abd*_*ull 14

以下设置~/.tmux.conf对我有用:

# file ~/.tmux.conf
# ...

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

# make colors inside tmux look the same as outside of tmux
# see https://github.com/tmux/tmux/issues/696
# see /sf/answers/2925026471/
set-option -ga terminal-overrides ",xterm-256color:Tc"

# ...
Run Code Online (Sandbox Code Playgroud)

  • 嗯,先生,有唯一有效的答案!其他所有答案都不适用于我的情况,谢谢,如果可以的话,请投 1000 倍赞成票。 (4认同)
  • 这个答案对我有用(Windows终端+ tmux + https://github.com/cideM/yui colorcheme) (2认同)

Rus*_*ord 5

感谢@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 文件之间的终端功能有关。