Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Color standards for terminal emulators

License

NotificationsYou must be signed in to change notification settings

termstandard/colors

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 

Repository files navigation

(Previously published and discussed athttps://gist.github.com/XVilka/8346728.)

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

  • Plain ASCII without color controls;
  • Using ANSI escape sequences:
    • 8 colors as a 2×2×2 color-cube, plus bright and dim foreground;
    • 16 colors: 8 colors, plus corresponding bright versions;
    • 256-color palette: 16 colors, plus a 6×6×6 color-cube and a 24-level gray scale;
    • 24-bit TrueColor as a 256×256×256 color-cube (aka "16 million" or just "888")

The 256-color palette has a standardized initial arrangement, but all entriesare separately reprogrammable. Using this mode, a terminal can display any 24-bitRGB colors, the same as TrueColor, but only 256 distinct colors simultaneously.The other modes do not use a palette; they just specify colors directly.

To see if your terminal supports TrueColor, run:

fgbg=48# backgroundfgbg=38# foregroundred=255green=102blue=0printf'\e[%u;2;%u;%u;%um%s\e[m\n'"$fgbg""$red""$green""$blue" TRUECOLOR

which will printTRUECOLOR in brown if itunderstands Xterm-style TrueColor escape sequences.

For a more thorough test, run:

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";}'

Some other tests:

You can download these scripts and inspect them before running them, by:
# make a sandboxmkdir tmp$$cd tmp$$# downloads scriptswget https://github.com/robertknight/konsole/raw/master/tests/color-spaces.pl \     https://gist.github.com/lilydjwg/fdeaf79e921c2f413f44b6f613f6ad53/raw/94d8b2be62657e96488038b0e547e3009ed87d40/colors.py \     https://github.com/JohnMorales/dotfiles/raw/master/colors/24-bit-color.sh \     https://gitlab.gnome.org/GNOME/vte/-/raw/master/perf/img.sh# read the scripts with your editor$EDITOR*

Stop!Only if you're satisfied that the scripts are trustworthy should you proceed:

# if you trust them, run themperl color-spaces.plpython colors.pybash 24-bit-color.shbash img.sh

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

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

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

Truecolor Detection

Checking for COLORTERM

VTE,Konsole andiTerm2 all advertisetruecolor support by placingCOLORTERM=truecolor in the environment of theshell user's shell. This has been in VTE for a while, but is relatively new inKonsole and iTerm2 and has to be enabled at compile time (most packages do not,so you have to compile them yourself from the git source repo).

The S-Lang library has a check that$COLORTERM contains either "truecolor" or"24bit" (case sensitive).

Terminfo has supported the 24-bit TrueColor capability sincencurses-6.0-20180121,under the name "RGB".You need to use the "setaf" and "setab" commands to set the foreground andbackground respectively.

Having an extra environment variable (separate fromTERM) is not ideal: bydefault it is not forwarded via sudo, ssh, etc, and so it may still beunreliable even where support is available in programs. (It does however err onthe side of safety: it does not advertise support when it is not actuallysupported, and the programs should fall back to using 8-bit color.)

These issues can be ameliorated by addingCOLORTERM to:

  • theSendEnv list in/etc/ssh/ssh_config on ssh clients;
  • theAcceptEnv list in/etc/ssh/sshd_config on ssh servers; and
  • theenv_keep list in/etc/sudoers.

Despite these problems, it's currently the best option, so checking$COLORTERM is recommended since it will lead to a more seamless desktopexperience where only one variable needs to be set.

App developers can freely choose to check for this variable, or introduce theirown method (e.g. an option in their config file). They should use whichevermethod best matches the overall design of their app.

Ideally any terminal that really supports truecolor would set this variable;but as a work-around you might need to put a check in your shell's start-up file(e.g./etc/profile or~/.profile or~/.bashrc or~/.zshrc) to setCOLORTERM=truecolor when$TERM matches any terminal type known to haveworking truecolor:

case $TERM in  iterm       |\  vte*        |\  *-truecolor ) export COLORTERM=truecolor ;;esac

Querying The Terminal

In an interactive program that can read terminal responses, a more reliablemethod is available that is transparent to sudo & ssh. Simply try sending aTrueColor escape sequence to the terminal, followed by a query to ask whatcolor it currently has. If the response indicates the same color aswas just set, then TrueColor is supported.

If the response indicates an 8-bit color, or does not indicate a color, or ifno response is forthcoming within a few centiseconds, then TrueColor isprobably unsupported.

$ (printf'\e[48:2:1:2:3m\eP$qm\e\\'; xxd -g1 )^[P1$r48:2:1:2:3m^[\00000000: 1b 50 31 24 72 34 38 3a 32 3a 31 3a 32 3a 33 6d  .P1$r48:2:1:2:3m

Here we set the background color toRGB(1,2,3) - an unlikely defaultchoice - and request the value that we just set. The response comes back thatthe request was understood (1), and that the color is indeed48: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: 1b 50 31 24 72 34 30 6d 1b 5c 0a              .P1$r40m.\.

This terminal replied that the color is40 - it has not accepted our requestto set48:2:1:2:3.

^[P0$r^[\00000000: 1b 50 30 24 72 1b 5c 0a                      .P0$r.\.

This terminal did not even understand theDECRQSS request - its response wasCSI+0$r. This does not indicate whether it set the color, but since itdoesn't understand how to reply to our request it is unlikely to supporttruecolor either.

Truecolor Support in Output Devices

Fully Supporting

Terminal Emulators

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

Multiplexers

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

Re-players

Partial Support

These terminal emulators parse ANSI color sequences, but approximate the truecolor using a palette or limit number of true colors that can be used at thesame time. A 256-color (8-bit) palette is used unless specified.

Note about color differences

Human eyes are sensitive to the primary colors in such a way that the simpleGaussian distance √(R²+G²+B²) gives poor results when trying to find the"nearest" available color as perceived by most humans.

TheCIEDE2000formula provides much better perceptual matching, but it is considerably morecomplex and may perform very slowly if used blindly [2].

[2]neovim/neovim#793 (comment)

Not Supporting Truecolor

Console Programs + Truecolor

Console Programs Supporting Truecolor

Console Programs Not Supporting Truecolor

About

Color standards for terminal emulators

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors30


[8]ページ先頭

©2009-2026 Movatter.jp