Skip to content

Instantly share code, notes, and snippets.

@techieimposter
Forked from XVilka/TrueColour.md
Created May 12, 2019 10:00
Show Gist options
  • Save techieimposter/a99fdeb59039985a11c9c84be496d461 to your computer and use it in GitHub Desktop.
Save techieimposter/a99fdeb59039985a11c9c84be496d461 to your computer and use it in GitHub Desktop.
True Colour (16 million colours) support in various terminal applications and terminals

Terminal Colors

There exists common confusion about terminal colors. This is what we have right now:

  • Plain ASCII
  • ANSI escape codes: 16 color codes with bold/italic and background
  • 256 color palette: 216 colors + 16 ANSI + 24 gray (colors are 24-bit)
  • 24-bit true color: "888" colors (aka 16 milion)
printf "\x1b[${bg};2;${red};${green};${blue}m\n"

The 256-color palette is configured at start and is a 666-cube of colors, each of them defined as a 24-bit (888 rgb) color.

This means that current support can only display 256 different colors in the terminal while "true color" means that you can display 16 million different colors at the same time.

Truecolor escape codes do not use a color palette. They just specify the color itself.

This is a good test case:

printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"
awk 'BEGIN{
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
    for (colnum = 0; colnum<77; colnum++) {
        r = 255-(colnum*255/76);
        g = (colnum*510/76);
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'

Keep in mind that it is possible to use both ';' and ':' as Control Sequence Introducer delimiters.

According to Wikipedia[1], this behavior is only supported by xterm and konsole.

[1] https://en.wikipedia.org/wiki/ANSI_color

Since ncurses-6.0-20180121, terminfo began to support the 24-bit True Color capability under the name of "RGB". You need to use the "setaf" and "setab" commands to set the foreground and background respectively.

True Color Detection

There will be no reliable way to detect the "RGB" flag until the new release of terminfo/ncurses. S-Lang author added a check for $COLORTERM containing either "truecolor" or "24bit" (case sensitive). In addition, VTE, Konsole and iTerm2 set this variable to "truecolor". It has been in VTE for a while and but is relatively new, being still git-only in Konsole and iTerm2).

This is obviously not a reliable method, and is not forwarded via sudo, SSH etc. However, whenever it errs, it errs on the safe side. It does not advertise support when it is actually supported. App developers can freely choose to check for this same variable, or introduce their own method (e.g. an option in their config file). They should use whichever method best matches the overall design of their app. Checking $COLORTERM is recommended though since it will lead to a more seamless desktop experience where only one variable needs to be set. This would be system-wide so that the user would not need to set it separately for each app.

Terminals + True Color

Now Supporting True Color

There are a bunch of libvte-based terminals for GTK2, so they are listed in the another section.

Also, while this one is not a terminal, but a terminal replayer, it is still worth mentioning:

Improper Support for True Color

Terminals that parse ANSI color sequences, but approximate them to 256 palette

Note about color differences: a) RGB axes are not orthogonal, so you cannot use sqrt(R^2+G^2+B^2) formula b) for color differences there is more correct (but much more complex) CIEDE2000 formula (which may easily blow up performance if used blindly) [2].

[2] neovim/neovim#793 (comment)

Terminal multiplexers

  • tmux - starting from version 2.2 (support since 427b820...)
  • screen - has support in 'master' branch, need to be enabled (see 'truecolor' option)
  • pymux - tmux clone in pure Python (to enable truecolor run pymux with --truecolor option)
  • dvtm - not yet supporting True Color martanne/dvtm#10

NOT Supporting True Color

Console Programs + True Color

Console Programs Supporting True Color

Console Programs Not Supporting True Color

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment