61

Environment:

  • Fedora 25 (4.9.12-200.fc25.x86_64)
  • GNOME Terminal 3.22.1 Using VTE version 0.46.1 +GNUTLS
  • VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Feb 22 2017 16:26:11)
  • tmux 2.2

I recently started using tmux and have observed that the colors within Vim change depending on whether I'm running inside or outside of tmux. Below are screenshots of Vim outside (left) and inside (right) of tmux while viewing a Git diff:

enter image description here

My TERM variable is

  • Outside tmux: xterm-256color
  • Inside tmux: screen-256color

Vim reports these terminal types as expected (via :set term?):

  • Outside tmux: term=xterm-256color
  • Inside tmux: term=screen-256color

Vim also reports both instances are running in 256-color mode (via :set t_Co?):

  • Outside tmux: t_Co=256
  • Inside tmux: t_Co=256

There are many similar questions out there regarding getting Vim to run in 256-color mode inside tmux (the best answer I found is here), but I don't think that's my problem given the above information.

I can duplicate the problem outside of tmux if I run Vim with the terminal type set to screen-256color:

$ TERM=screen-256color vim

So that makes me believe there's simply some difference between the xterm-256color and screen-256color terminal capabilities that causes the difference in color. Which leads to the question posed in the title: what specifically in the terminal capabilities causes the Vim colors to be different? I see the differences between running :set termcap inside and outside of tmux, but I'm curious as to which variables actually cause the difference in behavior.

Independent of the previous question, is it possible to have the Vim colors be consistent when running inside or outside of tmux? Some things I've tried include:

  • Explicitly setting the default terminal tmux uses in ~/.tmux.conf to various values (some against the advice of the tmux FAQ):
    set -g default-terminal "screen-256color"
    set -g default-terminal "xterm-256color"
    set -g default-terminal "screen.xterm-256color"
    set -g default-terminal "tmux-256color"
  • Starting tmux using tmux -2.

In all cases, Vim continued to display different colors inside of tmux.

Rusty Shackleford
  • 773
  • 2
  • 6
  • 11
  • Could you please start `script`, start `vim`, quit `vim` and then quit `script`'s shell, and attach the resulting `typescript` file? Then repeat the same steps with `TERM=screen-256color vim` instead. – egmont Mar 03 '17 at 11:07
  • @egmont Here you go: [typescript-xterm-256color](http://pastebin.com/xT5PHM3t) and [typescript-screen-256color](http://pastebin.com/7JSbw82n). – Rusty Shackleford Mar 03 '17 at 18:59
  • 1
    I can see 256-color escape sequences in the `xterm-256color` version (search for "38;5;" in the file), but cannot in the `screen-256color`. E.g. wherever there's a `\e[38;5;81m` in `xterm-256color` (color #81 of the 256-color palette, a middle blue shade), `screen-256color` contains `\e[34m` instead (the standard blue of the 8-color palette). So the main question is why does vim not use the 256-color palette in case of `TERM=screen-256color`. – egmont Mar 03 '17 at 21:04
  • Another interesting thing is that the `xterm-256color` version seems to print the screen twice, first with the legacy colors and then with the 256-color palette. Search for e.g. "F1" in the file, you'll find two matches in `xterm-256color`, the first with `\e[34m` color, the second with `\e[38;5;81m`. I don't know what's going on here. – egmont Mar 03 '17 at 21:06
  • Adding `set -g default-terminal "screen.xterm-256color"` in `~/.tmux.conf` and reload the config in tmux (: source-file ~/.tmux.conf) worked for me (highlight issue). thx – dtrckd Aug 21 '19 at 13:15

7 Answers7

50

I had the similar issue before. Comments in blue in Vim were hard to read. In .tmux.conf I set this:

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

And in .vimrc:

set background=dark

Now it looks as follows and works both in Gnome Terminal and Cygwin: enter image description here

Vitali Plagov
  • 927
  • 8
  • 19
  • 7
    This solved it for me. For some reason, inside tmux, vim wasn't detecting a dark background. Explicitly setting `bg=dark` in my vimrc fixed it. – Adam Keenan Nov 14 '17 at 17:39
  • Strange - my `$TERM` both inside and outside `tmux` was `"xterm-256color"` and explicitly setting the backgroun did it for me as well. Thank you! – nronnei Oct 11 '18 at 00:36
  • 1
    Worked for me too. I thought the problem was with `stterm` because in `xfce4-terminal` everything looked comfortable(comments appearing in `cyan` instead of `blue` which is very hard to read with dark background). after this change everything works fine. But remember to add `unlet! skip_defaults_vim source $VIMRUNTIME/defaults.vim` to vimrc file to use syntax highlighting etc... – Abinash Dash Jun 05 '19 at 18:16
34

tmux doesn't support the terminfo capability bce (back color erase), which vim checks for, to decide whether to use its "default color" scheme.

That characteristic of tmux has been mentioned a few times -

Thomas Dickey
  • 75,040
  • 9
  • 171
  • 268
9

The following settings inside ~/.tmux.conf worked for me:

# 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 https://stackoverflow.com/a/41786092
set-option -ga terminal-overrides ",xterm-256color:Tc"

# ...
Abdull
  • 665
  • 1
  • 7
  • 13
6

Thanks to @egmont's analysis of what colors Vim was outputting when TERM=screen-256color, I was inspired to look at the color scheme Vim is using in the two scenarios.

Vim reports it is using the default color scheme in both cases. I thought that odd because the default color scheme on Fedora 25 (/usr/share/vim/vim80/colors/default.vim) doesn't appear to match the colors I actually see when TERM=xterm-256color. If I explicitly set the color scheme using :colorscheme default when TERM=xterm-256color, Vim's appearance changes to that when TERM=screen-256color. To get the colors back to what they were when I first start Vim, I had to use the ron color scheme. Progress!

I found an Ask Ubuntu answer that suggests that when Vim reports it is using the default color scheme, it doesn't necessarily mean default.vim but rather some theme-specific color scheme. As the answer points out, a dark theme (which I am using) corresponds to the ron color scheme, just as I discovered above. (Even though this post is with respect to Ubuntu, I'm assuming the OP was using GNOME.)

I also found another question that seems to describe the same problem I'm having. I came across it while searching before I posted this question, but, for some reason, the color scheme didn't strike me as being relevant.

I ended up doing what @LapshinDmitry did in his answer and explicitly set colorscheme ron in my ~/.vimrc file. Now, whether I start Vim inside or outside of tmux, the colors appear the same. The only drawback is if I ever change my desktop theme from a dark flavor to a light flavor, Vim won't automatically switch to the "default" light theme color scheme, which is apparently peachpuff. I can live with that, as I'm unlikely to ever change my theme.

I'm not going to accept this answer because I consider explicitly setting the color scheme in my ~/.vimrc a workaround rather than the solution. If someone can explain why Vim loads a different "default" color scheme depending on the value of TERM, I'll be happy to accept that answer, as I'm more interested in understanding the root cause. I suspect it has something to do with how Vim interprets the terminal capabilities between the two terminfo files.

Rusty Shackleford
  • 773
  • 2
  • 6
  • 11
  • I'm also curious why `vim` behaves this way. After all, the `bce` capability should have nothing to do with the available number of colors. – egmont Mar 04 '17 at 14:54
  • @egmont I interpreted @ThomasDickey's answer as: 1) Vim checks the `bce` capability of the terminal, 2) if present, select color scheme "A", 3) otherwise, select color scheme "B". I believe the color _depth_ is the same in both cases (i.e. 256 colors, as `t_Co` shows). It's just that color scheme "B" on my system happens to only use an 8-color palette even though 256 colors are _possible_ (I _think_ that explains what you observed in your typescript analysis; please correct me if I'm wrong). Remember, after I run `:colorscheme ron`, I see 256-color escape sequences in the same Vim session. – Rusty Shackleford Mar 04 '17 at 16:14
  • Thanks for the explanation - I still cannot see any rationale behind this though. Nevermind. `vim` has really weird design decisions. – egmont Mar 04 '17 at 19:47
0

My TERM variable is Outside tmux: xterm-256color Inside tmux: screen-256color

That's correct and working for me. Try it with a different terminal (I use urxvt) to see if Gnome Terminal is the problem. 

Also check COLORTERM (mine is set to rxvt) and unset TERMCAP.

laktak
  • 5,616
  • 20
  • 38
  • Thanks for the suggestions. I ran the same test with urxvt (outer `TERM` is `rxvt-unicode-256color`) using an appropriate `~/.Xdefaults` and unfortunately still observed different colors inside and outside of tmux. For the gnome-terminal scenario, `COLORTERM` is `truecolor` and `TERMCAP` is empty both inside and outside tmux. For the urxvt scenario, `COLORTERM` is `rxvt-xpm` outside and `truecolor` inside tmux, while `TERMCAP` is empty both inside and outside tmux. – Rusty Shackleford Mar 03 '17 at 02:32
  • @RustyShackleford this is only for Vim? Are you using 'termguicolors'? Take a look at `:help xterm-true-color` or try with a more default Vim config. – laktak Mar 03 '17 at 08:08
  • I've only noticed the problem in Vim so far (like I said, I only recently started using tmux). For example, my terminal prompt and Git CLI output appear to have the same colors both inside and outside of tmux. I do not set `termguicolors` in my `.vimrc` and `:set termguicolors?` reports `notermguicolors` in both cases. I'll look at the help topic you referenced; thanks! – Rusty Shackleford Mar 03 '17 at 19:16
0

Thanks for all the answers. I have some new findings.

  1. In VIM, there are default color schemes and a color scheme named 'default'. Confusing, huh? The default color schemes are 'ron' for dark background, and 'default' otherwise. Checking https://github.com/vim/vim/blob/master/runtime/colors/default.vim, set bg& is causing the trouble.

  2. Only dark background is affected by this problem because the background is mistaken as light. Query :set background? to find out.

  3. iTerm2 works with no issue when TERM=screen-256color. But it still does not work when you run tmux in iTerm2. The reason is iTerm use COLORFGBG, which vim can use to determine bg. This explains many magic behaviours. iTerm2 sometimes adds COLORFGBG, but sometimes not.

workaround:

  1. Explicitly set colorscheme, e.g. colorscheme ron
  2. set background=dark
  3. Passing query of bg to outer terminal by
if exists("$TMUX")
    let &t_RB = "\ePtmux;\e\e]11;?\007\e\\"
endif

So far, this is the method I'm using. The best would be tmux to implement support of osc 11 sequences and Vim recognize tmux and set t_RB accordingly.

Haodong Du
  • 61
  • 1
  • 3
0

For me I have to add below into the .tmux.conf to get the RGB color and eliminate the color difference.

set -ag terminal-overrides ",xterm-256color:RGB"
set  -g default-terminal "tmux-256color"