256-Color XTerms in Ubuntu
« 14 Years to Unicode
» Don’t Play Hurt
Code: 256 colors, screen, terminals, Ubuntu, vim, xterm, yak shave
It’s not commonly used, but most Linux terminals can support 256 colors. It’s also a bit of a pain in the ass to set up if it doesn’t Just Work out of the box. Having spent a while today tinkering and searching and cursing and testing and trading mail/IM with folks who understand the eldritch depths of terminals better than I, I thought I’d write up my findings for anyone else who’d like spiffy colors.
Ncurses and other terminal programming libraries need to know what capabilities your terminal supports, like highlighting, underlining, blinking, and colors. This used to be done with termcap but now everyone uses terminfo, which hold the specifications in a set of files. The first thing to do is make sure you have a 256-color terminfo file for your terminal:
$ find /lib/terminfo /usr/share/terminfo -name "*256*"
What you need is to see a filed named terminal-256color. For example, mine is xterm-256color. My first hassle was that Ubuntu doesn’t install this by default. I can’t guess what it will be named in your distribution (look for packages with ‘ncurses’ or ‘term’ in their names), but in Ubuntu it’s just a quick:
$ sudo aptitude install ncurses-term
Xterm needs a little more configuration, edit ~/.Xdefaults to add:
*customization: -color XTerm*termName: xterm-256color
To make this apply to new terminals (so you don’t have to log out and back in), run:
$ xrdb -merge ~/.Xdefaults # you'll also want to add this to your ~/.xsession so it happens every time you log in: if [ -f $HOME/.Xdefaults ]; then xrdb -merge $HOME/.Xdefaults fi
One tricky thing about xterm is that is supports 256 colors via ANSI escape sequences, but they won’t be available to programs without the right terminfo file. So popular test scripts will work while ncurses-based programs will fail. I spent a lot of time catching on to this one. This config file will tell xterm to enable 256 colors and set the TERM environment variable to ‘xterm-256color’ so the right terminfo file is used. You can test this with:
$ tput colors 256 $ echo $TERM xterm-256color
At this point, you’re all set. Individual applications may need some configuring to use 256-color schemes. In vim, :set t_Co should now report that you have 256 colors available. Run locate vim | grep 256 to find the color schemes available, and :colo desert256 to use one. If none of those suit you, there are plenty more available. I put a little code in my ~/.vimrc to only load it when I have colors available, because sometimes I use different terminals.
colorscheme desert if &t_Co > 2 || has("gui_running") syntax on endif if &t_Co == 256 colorscheme inkpot endif
GNU screen needs a hint to use 256 colors. You can add the following to your ~/.screenrc, or just wait for Ubuntu Intrepid Ibex later this month to include it by default:
# terminfo and termcap for nice 256 color terminal # allow bold colors - necessary for some reason attrcolor b ".I" # tell screen how to set colors. AB = background, AF=foreground termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' # erase background with current bg color defbce "on" # set TERM term screen-256color-bce
This was all (of course) an hours-long session of yak shaving because I’m playing around with a secret project I’m not yet ready to announce.