I’m currently reinventing a wheel, driving a long debug output to
stdout. I finally came to conclusion that the only way not to get my eyes broken leads to colorizing all the output. Modern terminals like
xterm are able to show 256 colors, they do even like it. But those mastodons who are still giving their
VT100 a dust, have curly escape-sequences chosen to show a rainbow up. I revere a backward compatibility; I even have a latent tendency to cryptographic empiricism… You know, it took me a couple of hours to sort the stuff out. Internet gave not a rich detailed explanation, as well.
Nowadays a text in the X-terminal may appear in an ornate way. That’s why I came with jotting down a web-service. It’s likely a WYSIWYG for escape-sequence generation. One choses colors, font styles etc and finally gets a bundle of flourishes.
For a terminal to realize that it can show 256 colors, we should aknowledge it about:
case "$TERM" in 'xterm') TERM=xterm-256color;; 'screen') TERM=screen-256color;; 'Eterm') TERM=Eterm-256color;; esac
The color itself is encoded in quite breathtaking manner. Escape-sequence is starting with the traditional
\e[ and ending with
m. It consists of flags, the color of the background and the text color. Flags for bold, italic, underline and inverse (fg ⇐ ⇒ bg) are
07 respectively (there is a flag for the flashing as well, but what if there are children reading this?) Flags to cancel the style are
27. Flags can be written in simultaneous order, one after another, separated by semicolons. There must be no semicolon just before the final
The text color signature is
38, 05; COLOR;. The same for background color is
48, 05; COLOR;. The color here is an integer ∈ [1, 255]. The first sixteen items are well-known old-school terminal colors, the last 24 are shades of gray, and the rest… well, these are the remainder colors.
Something like that (thanks FedoraProject for the picture):
It is easy to see that the sequence
\e[01;04;38;05;196;48;05;232m turns the mode of a bold underlined red text on a black background. Haha.
It turns out that colors are encoded in the remaining 256 - 16 - 24 = 216 choices using a simple and straightforward algorithm. A range of tones is calibrated against division modulo 6. That number is treated as RGB-constituent in 6-based notation with “zero in sixteen”. For orange (
#ff9900) it gives
16 + 5 * 6² + 3 * 6 + 0 = 214). There are exceptions; they will be there any time. Those “standard” old-school colors and grayscale. Yeah.
Well, first of all, I was curious. Secondly, three hours are three hours. Furthermore I have now my logfile so weird-colored that it’s became totally ununderstandable. Plus
PS1 is surely re-written from scratch.