I was trying to make the syntax highlighting (with 256 colors) of vim work inside screen, which is running inside gterm.
It works quite fine in the beginning. What I mean by “in the beginning” is, after I start screen, and enter vim, the colors look fine, and there are really 256 colors.
But after a while (I don’t know exactly how long) the colors automatically change back to an appearance as if there are only 8 (or 16?) colors.
For example, after this has already occurred, if I enter the command
hi Comment ctermfg=68
inside vim, the comments appear to be “pure” green; however, if I open another vim outside screen (in the same terminal), then with the same command the comments appear to be a “yellowish” green.
The following is my .screenrc settings related to color:
attrcolor b ".I"
defbce "on"
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
term xterm-256color
After running a python script to display all the colors, I find out that maybe this is a problem of screen itself, and has nothing to do with vim.
What I did is, inside the screen session with problems, this script gives 256 colors, but many of them are actually the same; however, when I start a new screen session with the same configuration, this script gives 256 colors which are distinct from each other.
Edit:
Last night I connected to my Linux computer (which is in my office and it is always on) with putty, then opened a screen session with multiple windows in it. The colors are correct last night. Then before I went to sleep I detached the screen session and closed putty.
Now in the morning when I attach that screen session in putty again, the colors crash: they appear as if there are only 8 colors.
The colors are fine outside screen (but still in putty).
Edit:
Three years later after I asked this question, today I saw a similar problem. The problem is that vim can display 256 colors outside screen, and screen can display 256 colors with a test script, but vim can’t display any color (can only display black and white) inside screen. Just as a note to myself, here is the .screenrc file I am using
hardstatus alwayslastline "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %Y-%m-%d %c"
shell "bash"
startup_message off
vbell off
altscreen on
attrcolor b ".I"
defbce "on"
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
term screen-256color
The solution to the problem is already mentioned in the accepted answer, namely, I need to include
export TERM=xterm-256color
in .bashrc.
Short Answer
Set
TERMtoxterm-256colorin your.bashrc, and putterm screen-256colorin your.screenrc.Long Answer
Here’s why this breaks: gnome-terminal, screen, tmux, bash, putty and vim have all been written to intelligently handle 256 colors, but you need to set things up correctly at the earliest possible point. Using
termcapinfoin your.screenrcis actually a duct tape solution!If your
TERMis set correctly, it will signal to bash that you’re in 256-color mode, which means it will play nice with screen being in 256-color mode as well.So, in your
.bashrc,export TERM=xterm-256color. [1]In your
.screenrc, usescreen-256colorforTERMinstead ofxterm-256color, and delete the rest of the cruft!In your PuTTy configuration, use
putty-256color.You can download the termcap entry files and put them in
~/.terminfo/sand~/.terminfo/p, if your box doesn’t have them by default.Footnotes
[1] Setting
TERMtoxterm-256colorin your.bashrccan be a little presumptuous, especially if you use the same.bashrcon multiple machines. I have found the following snippet to be fairly effective:The
aliasof ssh is a defensive measure to prevent us from trying to open a 256-color terminal on a remote machine that doesn’t necessarily support it. The main block is the other half of the equation; it checks to see if the corresponding terminfo entry exists, and sets it if it does.