It's a common confusion about terminal colours... Actually we have this:
- plain ascii
- ansi escape codes (16 colour codes with bold/italic and background)
- 256 colour palette (216 colours + 16 ansi + 24 gray) (colors are 24bit)
- 24bit true colour ("888" colours (aka 16 milion))
printf "\x1b[${bg};2;${red};${green};${blue}m\n"
The 256 colour palete is configured at start, and it's a 666 cube of colours, each of them defined as a 24bit (888 rgb) colour.
This means that current support can only display 256 different colours in the terminal, while truecolour means that you can display 16 milion different colours at the same time.
Truecolour escape codes doesn't use a colour palette. They just specify the colour itself.
Here's a test case:
printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"
- or https://raw.githubusercontent.com/JohnMorales/dotfiles/master/colors/24-bit-color.sh
- or http://github.com/robertknight/konsole/tree/master/tests/color-spaces.pl
- or https://git.gnome.org/browse/vte/tree/perf/img.sh
- or just run this:
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 parameters delimiter.
According to Wikipedia[1], this is only supported by xterm and konsole.
[1] https://en.wikipedia.org/wiki/ANSI_color
Since ncurses-6.0-20180121 terminfo started to support 24-bit truecolor capability under the name of "RGB" - you need to use the "setaf" and "setab" commands to set foreground and background correspondingly.
There's no reliable way until the new release of terminfo/ncurses. After that the "RGB" flag should be available for detection. S-Lang author added a check for $COLORTERM containing either "truecolor" or "24bit" (case sensitive). In turn, VTE, Konsole and iTerm2 set this variable to "truecolor" (it's been there in VTE for a while, it's relatively new and maybe 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: does not advertise support whereas it's 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), whichever matches better the overall design of the given app. Checking $COLORTERM is recommended though, since that would lead to a more unique desktop experience where the user has to set one variable only and it takes effect across all the apps, rather than something separately for each app.
- st (from suckless) [delimeter: semicolon] - http://lists.suckless.org/dev/1307/16688.html
- xst - fork of st
- konsole [delimeter: colon, semicolon] - https://bugs.kde.org/show_bug.cgi?id=107487
- iTerm2 [delimeter: colon, semicolon] - since v3 version
- Therm [delimeter: colon, semicolon] - fork of iTerm2
- qterminal [delimeter: semicolon] - lxqt/qterminal#78
- alacritty [delimeter: semicolon] - written in Rust
- kitty [delimeter: colon,semicolon] - uses OpenGL
- cool-retro-term [delimeter: semicolon]
- mosh (Mobile SHell) [delimeter: semicolon] - since commit https://github.com/mobile-shell/mosh/commit/6cfa4aef598146cfbde7f7a4a83438c3769a2835
- pangoterm [delimeter: semicolon] - abandoned
- Termux [delimeter: semicolon] - Android platform
- ConnectBot - Android platform - since https://github.com/connectbot/connectbot/commit/3bcc75ccedaf2136b04c5932c81a5155f29dc3b5
- Black Screen [delimeter: semicolon] - crossplatform, HTML/CSS/JS-based
- hterm - HTML/CSS/JS-based (ChromeOS)
- PuTTY - landed in git (patched version [3] {xterm-like approximation to 256 colors} and [4] {real true colors} available) - Windows platform
- Tera Term [delimeter: colon, semicolon] - Windows platform
- ConEmu [delimeter: semicolon] - Windows platform
- FinalTerm [delimeter: semicolon] - abandoned, iTerm2 borrowing it's ideas and features.
- MacTerm [delimeter: semicolon] - Mac OS X platform
- mintty [delimeter: semicolon] Cygwin and MSYS/MSYS2 since commit https://github.com/mintty/mintty/commit/43f0ed8a46c6549cb9a3ea27abc057b5abe13bdb (2.0.1 release) - Windows platform
- MobaXterm Windows platform - closed source (run
lscolors
to see a truecolor test) - ZOC Windows/OS X platform - closed source since 7.19.0 version
- Windows 10 bash console, since Windows Insiders build 14931
- all libvte based terminals (since 0.36 version) [delimeter: colon, semilocon] - https://bugzilla.gnome.org/show_bug.cgi?id=704449
- libvte-based Gnome Terminal
- libvte-based sakura
- libvte-based xfce4-terminal - since 0.6.90 release, if compiled with GTK+3
- libvte-based Terminator - since 1.90 release
- libvte-based Tilix - written in D. Similar user interface as for Terminator.
- libvte-based Lilyterm - since commit https://github.com/Tetralet/LilyTerm/commit/72536e7ba448ad9ef1126ce45fbde3a3407a271b
- libvte-based ROXTerm
- libvte-based evilvte - no release yet, version from git https://github.com/caleb-/evilvte
- libvte-based Termit
- libvte-based Termite
- libvte-based Tilda
- libvte-based tinyterm
- libvte-based Pantheon Terminal
- libvte-based lxterminal - with --enable-gtk3 configure flag.
But there are bunch of libvte-based terminals for GTK2 so they are listed in the another section.
Also, while this one is not exactly a terminal, but a terminal replayer, it still worth mentioning:
- mlterm - build with --with-gtk=3.0 configure flag - approximates colors to 512 embedded palette https://sourceforge.net/p/mlterm/bugs/74/
- xterm (though doing it wrong: "it uses nearest colour in RGB colour space, with a usualfalse assumption about orthogonal axes")
- urxvt aka rxvt-unicode - since Revision 1.570 http://lists.schmorp.de/pipermail/rxvt-unicode/2016q2/002261.html (Note there is a restriction of colors count at once still)
- linux console (since v3.16): https://github.com/torvalds/linux/commit/cec5b2a97a11ade56a701e83044d0a2a984c67b4
Note about colour differences: a) RGB axes are not orthogonal, so you cannot use sqrt(R^2+G^2+B^2) formula, b) for colour 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)
- 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 truecolour run pymux with
--truecolor
option) - dvtm - not yet supporting True Colour martanne/dvtm#10
- Terminology (Enlightenment) - https://phab.enlightenment.org/T746
- Hyper.app [delimeter: semicolon] - crossplatform, HTML/CSS/JS-based (Electron) vercel/hyper#2294
- mrxvt (looks abandoned) - https://sourceforge.net/p/materm/feature-requests/41/
- aterm (looks abandoned) - https://sourceforge.net/p/aterm/feature-requests/23/
- fbcon (from linux kernel) - https://bugzilla.kernel.org/show_bug.cgi?id=79551
- FreeBSD console - https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191652
- yaft framebuffer terminal - uobikiemukot/yaft#12
- KiTTY - Windows platform
- MTPuTTY - Windows platform
- mRemoteNG - Windows platform - mRemoteNG/mRemoteNG#717
- JuiceSSH - Adroid platform, closed source
- Termius - Linux, Windows, OS X platforms, closed source
- SmarTTY - Windows platform - closed source (sent them a request)
- Netsarang XShell - closed source (sent them an email)
- libvte and GTK2 - based:
- libvte-based GTKTerm2
- libvte-based stjerm (looks abandoned) - stjerm/stjerm#39
Supporting True Colour:
- s-lang library - (since pre2.3.1-35, for 64bit systems)
- ncurses library - since 6.1 version
- Eternal Terminal - automatically reconnecting shell
- mc - since 682a5.... See also ticket #3724 for truecolor themes.
- irssi - since PR #48
- neovim - since commit 8dd415e887923f99ab5daaeba9f0303e173dd1aa; need to set termguicolors to enable true color.
- vim - (from 7.4.1770); need to set termguicolors to enable true color.
- joe - (from 4.5 version)
- emacs - since 26.1 release
- micro editor
- elinks - configure.in:1410 (./configure --enable-true-color)
- tcell library for Go language
- timg - Terminal Image Viewer
- tv - tool to quickly view high-resolution multi-band imagery directly in terminal
- termimage - terminal image viewer
- explosion - terminal image viewer
- ls-icons - fork of coreutils with
ls
program that supports icons - mpv - video player with support of console-only output (since 0.22 version)
- radare2 - reverse engineering franework; since 0.9.6 version.
Not supporting True Colour:
- mutt (email client) - http://dev.mutt.org/trac/ticket/3674
- neomutt (email client) - neomutt/neomutt#85
- termbox library - nsf/termbox#37
- mcabber (jabber client) - https://bitbucket.org/McKael/mcabber-crew/issue/126/support-for-true-color-16-millions-colors
- tig (git TUI) - jonas/tig#227
- cmus (music player) - cmus/cmus#799
- scim (spreadsheet program) - andmarti1424/sc-im#306
- gui.cs Terminal UI toolkit for .NET (curses-like) - gui-cs/Terminal.Gui#48