How do I enable full-color support in Vim?

110,373

Solution 1

GNOME Terminal supports 256 colors, but doesn't advertise its support. You can override vim's autodetection by putting the following:

if $COLORTERM == 'gnome-terminal'
  set t_Co=256
endif

in your ~/.vimrc.

Note: if you use GNU screen, it will happily eat those 256-color codes and convert them to basic 16 colors. A better fix is to change TERM to xterm-256color before launching screen/vim.

Update for 2017: if you have a sufficiently recent Vim (7.4.1799 or newer), and a sufficiently advanced terminal emulator (xterm, or gnome-terminal based on a sufficiently recent version of VTE), you can :set termguicolors and terminal vim will use full 24-bit colors as defined by your vim theme using highlight guifg=#rrggbb guibg=#rrggbb.

Solution 2

A more general solution is to install the term type "xterm-256color". In 10.04 I think it's installed by default. Previously you needed to install "ncurses-term" to get it.

Then set the term type in .bashrc with something like the following:

if [ -n "$DISPLAY" -a "$TERM" == "xterm" ]; then
    export TERM=xterm-256color
fi

If you'd prefer to only have the 256 colour capability for certain programs (perhaps it confuses some others) use instead:

TERM=xterm-256color myprogram

and perhaps set that as an alias for the program.

Then check your terminal colour capabilities with:

$ tput colors
256

You still may need the vim setting above to have vim recognise it. Most applications will recognise the 256 colours automatically (if they can use them).

Emacs also has colour themes that are much better with 256 colours. To check if it 256-colour capable run:

M-x list-colors-display

256colors.pl is Perl script that will display all the colours in your terminal.

Solution 3

Just include the line below into your $HOME/.bashrc (preferably in the last line of the file):

export TERM="xterm-256color"

And save it. After, restart your gnome-terminal. This change will be available not only in vim, but for all your terminal applications.

To check if it works, run this little script:

#!/usr/bin/env python
# Copyright (C) 2006 by Johannes Zellner, <[email protected]>
# modified by [email protected] to fit my output needs
# modified by [email protected] to fit my output needs

import sys
import os

def echo(msg):
    os.system('echo -n "' + str(msg) + '"')

def out(n):
    os.system("tput setab " + str(n) + "; echo -n " + ("\"% 4d\"" % n))
    os.system("tput setab 0")

# normal colors 1 - 16
os.system("tput setaf 16")
for n in range(8):
    out(n)
echo("\n")
for n in range(8, 16):
    out(n)

echo("\n")
echo("\n")

y=16
while y < 231:
    for z in range(0,6):
        out(y)
        y += 1

    echo("\n")


echo("\n")

for n in range(232, 256):
    out(n)
    if n == 237 or n == 243 or n == 249:
        echo("\n")

echo("\n")
os.system("tput setaf 7")
os.system("tput setab 0")

Thereafter, you will see something like the following (depends on your gnome-terminal theme):

terminal

Solution 4

Well, you can always configure Gvim to make it look like Vim. You just have to create a ~/.gvimrc file and paste in it these customisation tricks:

set guioptions-=r  " no scrollbar on the right
set guioptions-=l  " no scrollbar on the left
set guioptions-=m  " no menu
set guioptions-=T  " no toolbar

I don't think this solves your problem, but who knows ;-)

Share:
110,373

Related videos on Youtube

David Siegel
Author by

David Siegel

Design @ Microsoft

Updated on September 17, 2022

Comments

  • David Siegel
    David Siegel over 1 year

    I have a lovely Vim colorscheme (xoria256) and it looks brilliant in GVim, but when I use normal vim in Terminal, the colorscheme is only partially supported -- for example, the default semi-transparent aubergine background color is used. How do I make Terminal faithfully render my Vim colorscheme?

    • Admin
      Admin over 13 years
      Even the default color scheme looks better with 256 colors. If it wasn't for your question, I'd have never found it out. This should be the default.
  • David Siegel
    David Siegel almost 14 years
    This didn't work, my terminal is still aubergine!
  • Marius Gedminas
    Marius Gedminas almost 14 years
    What can I say -- it works for me when I do :set t_Co=256 | colorscheme xoria256.
  • Matt
    Matt almost 14 years
    You could test for the presence of gnome-terminal in your vimrc, then set the t_Co variable appropriately. e.g.: if $COLORTERM == 'gnome-terminal' ` set t_Co = 256` endif (I'm not sure how to add multi-line blocks of code in comments, so add newlines before and after the set statement)
  • Matt
    Matt almost 14 years
    You can use if has("gui_running") in your vimrc to set gui specific options.
  • John Einem
    John Einem about 13 years
    Actually, gnome-256color is more correct for gnome-terminal.
  • jrg
    jrg about 13 years
    Nice. I'd just about given up and just decided to go with the default, then I found this. Thanks!
  • Tim
    Tim over 11 years
    will it work in zsh, i don't use bash?
  • JJD
    JJD over 11 years
    Dave, I am not 100% sure if it is correct but here is a oneliner version of your command: [[ -n "$DISPLAY" && "$TERM" = "xterm" ]] && export TERM=xterm-256color. Please verify and feel free to add it to the post.
  • trusktr
    trusktr about 11 years
    It doesn't work for me... I think some themes designed for gVim need more than 256 colors... How do we enable FULL color support, like with gVim? When I set t_Co=256, some themes look better, but they are still not exactly on par with the gVim ones. It seems that with today's technology, have full color in a linux tty should be no problem. For example, as many color as there are in hex (e.g. #bf3ea2) there should also be at least that many in a tty.
  • Marius Gedminas
    Marius Gedminas about 11 years
    @trusktr google up CSApprox and CSExact vim extensions.
  • trusktr
    trusktr almost 11 years
    @MariusGedminas That's effing nice. Thanks. Too bad Linux console has only 16 colors.
  • somasekhar
    somasekhar over 10 years
    @JJD Should work, but you can always use ; to make everthing a one-liner.
  • somasekhar
    somasekhar over 10 years
    @dave-jennings The link to the script is broken.
  • Alex Hirzel
    Alex Hirzel over 10 years
    Setting t_Co=256 also seems to work for xterm.
  • dolmen
    dolmen over 9 years
    You should also check the value of $COLORTERM, to avoid false positives.
  • MestreLion
    MestreLion over 9 years
    I wonder why make the script in Python if it only contains shell commands. There are loops, whiles, ifs and functions in Bash, you know ;)
  • Admin
    Admin over 6 years
    @trusktr When you're using a terminal emulator in Linux you're not using anything like "today's technology".