How can I change the colors of my xterm using Ansi escape sequences?
ANSI escape sequences consist of a sequence of characters beginning with the Escape character, character 27. The next character is often (though not always) an open-square-bracket: [
The echo command can send escape characters if you specify
-e and use
\e for escape.
The ANSI standard defines 8 colours, plus a bright mode, giving a total of 16 posibilities. The sequence is:
<number> is one of:
- 30 Black
- 31 Red
- 32 Green
- 33 Yellow
- 34 Blue
- 35 Magenta
- 36 Cyan
- 37 White
- 40 Black
- 41 Red
- 42 Green
- 43 Yellow
- 44 Blue
- 45 Magenta
- 46 Cyan
0 Reset all
- 1 Bold
So to make your foreground red and your background yellow:
$ echo -e "\e[31m\e[43m"
And to enable bold:
$ echo -e "\e[1m"
Of course, you can combine them all together:
$ echo -e "\e[31m\e[43m\e[1m"
There are many many other escape codes for doing other things.
For example - clear the screen and move the cursor to the top-left:
$ echo -e "\e[2J\e[1;1H"
Which is useful when changing the colour:
$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"
Which will change the colours, clear the screen, and put the cursor at the top-left. Well, almost the top left. Echo puts a carriage return in, so it moves down a line. You can add
-n to echo to prevent this if you're fussy.
If you mess it all up and can't see what you're typing you can reset the terminal colours to normal by pressing:
Ctrl+v [ 0 m Return
At what you hope is the command prompt. It will whinge about an unknown command, but you will be able to see what you're doing again.
Note that modern Xterms support 32-bit color!
Simple example. To set a nice dark purple background (hey, each to his own) of value #53186f, you do:
echo -ne "\033]11;#53186f\007"
Note that this instantly changes the color of the whole window, not just of the subsequent text. This is especially nice for making a window obviously different after ssh'ing to a server (for example). Put the above 'echo' into your .bashrc and your terminal automatically changes colors when you log into that server (but won't change back when you Ctrl-D out)
You can spend HOURS on the net looking for this - most docs only talk about the original 16 ANSI colors.
Sources: http://www.steike.com/code/xterm-colors/ and http://rtfm.etla.org/xterm/ctlseq.html (look under "Operating System Controls")
Please note: the escape sequence above is valid for XTerms, and may not work for other implementations of "XTerm-like" windowing terminal emulators that may "look" like an XTerm. For example, "gnome-terminal" or "konsole" have different escape sequences, or may not implement color change at all.
Yes. ANSI terminals support ANSI Escape Codes. Each
Control Sequence Introducer(
CSI) Code in the following format:
The Ascii character
ESC character) or
1b in hexadecimal, followed by a left square bracket, and then a letter denoting the action to be used.
Note that a list of
; separated parameters may be supplied directly before the
Now, colors use a subset of
CSI codes, the
Select Graphic Rendition codes. These are in the form:
SGR code is passed as a parameter the
CSI. Relevant to your question are the
SGR codes 30-49. Codes 30-39 set the foreground color. Codes 40-49 set the background color.
30 - Foreground Black 31 - Foreground Red 32 - Foreground Green 33 - Foreground Yellow 34 - Foreground Blue 35 - Foreground Magenta 36 - Foreground Cyan 37 - Foreground White 40 - Background Black 41 - Background Red 42 - Background Green 43 - Background Yellow 44 - Background Blue 45 - Background Magenta 46 - Background Cyan 47 - Background White
Codes 38 and 48 are special codes. These are the ones which allow you to use RGB values. The format for these is:
ESC[38;2;<r>;<g>;<b>m (Foreground) ESC[48;2;<r>;<g>;<b>m (Background)
Note: alternative uses include
\x1b[<3 or 4>8;5;<web safe color index>m. With this usage, there is a completely different color encoding. See the link at the top of this answer for more information.
Codes 39 and 49 set the foreground and background colors to their defaults, which are defined on a terminal-by-terminal basis.
In practice, the colors 30-37 40-47 are slightly different than what their labels say they are.
0 - Black 1 - Darker Red 2 - Darker Green 3 - Dark/Yellow or Brown (varies between terminals) 4 - Dark Blue 5 - Dark Magenta 6 - Dark Cyan 7 - Light Grey
To get light colors, you use the SGI for bold,
1. Bold is a misleading name. It does not make the font bold. It actually increases the brightness of the text. With bold applied the colors become:
0 - Dark Grey 1 - Bright Red 2 - Bright Green 3 - Bright Yellow 4 - Bright Blue 5 - Bright Magenta 6 - Bright Cyan 7 - White
Notice: the last two blocks of colors' numbers are are relevant to both fore- and background (
<index> + (30 or 40)).
To remove all styles (back to default/normal mode) use
CSI codes are not all graphical. For example,
ESC[2J will clear your terminal.
ESC[<y>;<x>H sets the cursor position (1-indexed). See the wikipedia article for more information.
Note: to test these, use
echo -e or