There exists common confusion about terminal colors. This is what we have right now:
- Plain ASCII
- ANSI escape codes:
- 8 colors
- 8 colors + extra 8 foreground colors (when SGR 1 interpreted as bright colors, some terminal emulators can be configured to bright, bold or both)
- 16 colors: 8 colors + 8 aixterm bright colors
- 256 color palette: 216 colors + 16 ANSI + 24 gray (colors are 24-bit)
- 24-bit true color: "888" colors (aka 16 milion), direct color
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"
- 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 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.
ncurses 6.1, released January 27, 2018 added the 'RGB' flag, it's an extension which tells the library how to quickly compute the color-content for a given color value.
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 unsupported. 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.
A more reliable method in an interactive program which can read terminal responses, and one that is transparent to things like sudo, SSH, etc.. is to simply try setting a truecolor value and then query the terminal to ask what color it currently has. If the response replies the same color that was set then it indicates truecolor is supported.
$ (echo -e '\e[48:2:1:2:3m\eP$qm\e\\' ; xxd)
^[P1$r48:2:1:2:3m^[\
00000000: 1b50 3124 7234 383a 323a 313a 323a 336d .P1$r48:2:1:2:3m
Here we ask to set the background color to RGB(1,2,3)
- an unlikely default
choice - and request the value that we just set. The response comes back that
the request was understood (1
), and that the color is indeed 48:2:1:2:3
.
This tells us also that the terminal supports the colon delimiter. If instead,
the terminal did not support truecolor we might see a response like
^[P1$r40m^[\
00000000: 1b50 3124 7234 306d 1b5c 0a .P1$r40m.\.
This terminal replied the color is 40
- it has not accepted our request to
set 48:2:1:2:3
.
^[P0$r^[\
00000000: 1b50 3024 721b 5c0a .P0$r.\.
This terminal did not even understand the DECRQSS request - its response was
0$r
. We do not learn if it managed to set the color, but since it doesn't
understand how to reply to our request it is unlikely to support truecolor
either.
- 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] - > 0.14.1 versions (issue #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 6cfa4aef598146cfbde7f7a4a83438c3769a2835
- pangoterm [delimeter: colon, semicolon]
- Termux [delimeter: semicolon] - Android platform
- ConnectBot - Android platform - since 3bcc75ccedaf2136b04c5932c81a5155f29dc3b5 commit.
- 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
- since version 0.71 (released 2019-03-16)
- Tera Term [delimeter: colon, semicolon] - Windows platform
- ConEmu [delimeter: semicolon] - Windows platform
- Windows Powershell [delimeter: semicolon] - aka Powershell 5.x and below Windows 10
- Powershell Core [delimeter: semicolon] aka Powershell 6+ Windows 10
- cmd.exe [delimeter: semicolon] Builtin Windows shell that is mostly unchanged since DOS Windows 10
- 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 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
- upterm Windows/Macos/Linux Electron - A terminal emulator for the 21st century.
- Windows 10 bash console, since Windows Insiders build 14931
- All libvte based terminals
(since 0.36 version) [delimeter: colon, semicolon] -
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 72536e7ba448ad9ef1126ce45fbde3a3407a271b
- libvte-based ROXTerm
- libvte-based evilvte - no release yet, version from git https://github.com/caleb-/evilvte
- libvte-based Termit
- libvte-based Termite (NOT MAINTAINED)
- libvte-based Tilda
- libvte-based tinyterm
- libvte-based Pantheon Terminal
- libvte-based lxterminal - with --enable-gtk3 configure flag.
- libvte-based guake - A top-down terminal for GNOME
- All xterm.js based terminals (since v3.13, v4.3 for webgl) [delimeter: semicolon]
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:
- mlterm - built with --with-gtk=3.0 configure flag. Approximates colors to 512 embedded palette (https://sourceforge.net/p/mlterm/bugs/74/)
- xterm (but doing it wrong: "it uses nearest color in RGB color space, with a usual false 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 still)
- linux console (fbcon), since v3.16 - https://bugzilla.kernel.org/show_bug.cgi?id=79551 (downgraded to 16 foregrounds and 8 backgrounds)
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)
- tmux
- starting from version 2.2 (support since 427b820...)
- since version 2.7, added the 'RGB' flag detection, old 'Tc' extension was keept for backwards compatability fe7a871...
- 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
- Terminal.app: Macos Terminal builtin
- Terminology (Enlightenment) - https://phab.enlightenment.org/T746
- Cmder: Portable console emulator for Windows, based on ConEmu.
- mrxvt (looks abandoned) - https://sourceforge.net/p/materm/feature-requests/41/
- aterm (looks abandoned) - https://sourceforge.net/p/aterm/feature-requests/23/
- FreeBSD console - https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191652
- yaft framebuffer terminal - issue #12
- KiTTY - Windows platform
- MTPuTTY - Windows platform
- mRemoteNG - Windows platform - issue #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:
- 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.
- mutt (email client) - http://dev.mutt.org/trac/ticket/3674
- neomutt (email client) - issue #58
- termbox library - issue #37 (there is a fork termbox_next with the support
- https://bitbucket.org/McKael/mcabber-crew (jabber client) - issue #126
- tig (git TUI) - issue #227
- cmus (music player) - issue #799
- weechat (chat client) - issue #1364
- scim (spreadsheet program) - issue #306
- gui.cs Terminal UI toolkit for .NET (curses-like) - issue #48