5

How can I display colors in terminal to handle hexadecimal color values ? It can be useful for theming, XResources etc. For example :

$ command '#FF0000'
// display a red square

I use urxvt, i3wm in manjaro.

5
  • Do you want to display those colours in the terminal emulator window itself? Or starting a different X application (like xlogo -bg '#ff0000') is OK? Nov 19, 2018 at 13:24
  • I tried. It's ok. But if I want to display several colors, for example with a file containing color values on each line, maybe i'll prefer some color display like neofetch or pywal. Thanks. Nov 19, 2018 at 14:09
  • 1
    It's not clear what your question is about. Please add more info to it. Are you trying to set the fg to an arbitrary color? You can do it in xterms and alike with eg. \e[38;2;213;117;37m. Similar for the bg: \e[48;2;37;213;117m. Or you already know that but don't know how to parse and split hex specs in the shell? Are you trying to modify the palette (what std colors 1,2,3 stand for)? etc.
    – user313992
    Nov 19, 2018 at 16:15
  • Related: unix.stackexchange.com/a/269085/117549
    – Jeff Schaller
    Nov 20, 2018 at 2:31
  • I'm looking for a feature to simply visualize one or several colors instead of copy/paste an hexadecimal value somewhere else (in terminal.sexy for example). Think like in some code editors which allows it when you write css for example. Just to simplify color configuration (i3, rofi etc.). Dec 1, 2018 at 20:02

3 Answers 3

10

An alternative:

show_colour() {
    perl -e 'foreach $a(@ARGV){print "\e[48:2::".join(":",unpack("C*",pack("H*",$a)))."m \e[49m "};print "\n"' "$@"
}

Example usage:

$ show_colour "FF0088" "61E931" "1256E2"

This prints spaces with the given RGB background colours. Note that you must not use # in the RGB code. I leave stripping that if present as an exercise for the reader. ☺

This does not alter the terminal emulator's palette.

Caveat: Your terminal emulator must understand direct colour SGR control sequences, using the correct ITU T.416 forms. A few do. More understand these control sequences in certain long-standing faulty formulations. And you'll find that rxvt-unicode does not understand them at all. For one common faulty formulation substitute this ambiguous form:

show_colour() {
    perl -e 'foreach $a(@ARGV){print "\e[48;2;".join(";",unpack("C*",pack("H*",$a)))."m \e[49m "};print "\n"' "$@"
}

Another alternative:

Use my portable setterm, which I mentioned at https://unix.stackexchange.com/a/491883/5132 . It understands hexadecimal RGB notation, and even uses # as the indicator for it.

Example usage:

$ setterm -7 --background '#FF0088' ; printf ' ' ; \
> setterm -7 --background '#61E931' ; printf ' ' ; \
> setterm -7 --background '#1256E2' ; printf ' ' ; \
> setterm -7 --background default ; printf '\n'

This prints the same as the other example on terminals that understand direct colour SGR control sequences.

One difference from the preceding alternative is that setterm also works on other terminals. It has fallbacks for terminal types that do not understand direct colour SGR control sequences. On terminal types that only understand indexed colour (i.e. only 256 colours) or on terminals that only understand the 16 AIXTerm colours, it tries to pick the nearest to the desired RGB colour:

% TERM=rxvt-256color setterm -7 --background "#FF0088" |hexdump -C
00000000  1b 5b 34 38 3b 35 3b 31  39 38 6d                 |.[48;5;198m|
0000000b
% TERM=ansi COLORTERM=16color setterm -7 --background "#FF0088" |hexdump -C
00000000  1b 5b 31 30 35 6d                                 |.[105m|
00000006
% TERM=ansi setterm -7 --background "#FF0088" |hexdump -C
00000000  1b 5b 34 35 6d                                    |.[45m|
00000005
%

Further reading

  • Jonathan de Boyne Pollard (2018). setterm. nosh Guide. Softwares.
2
  • Note that the standard parameter string for truecolor escape sequences, as per ITU-T T.416, is "48:2:color-space-id:red:green:blue". Omitting color-space-id (and shifting the remaining parameters to the left) and/or using semicolons are common misinterpretations of the standard.
    – egmont
    Nov 19, 2018 at 16:00
  • Nice solution! Just a note that TERM=xterm-256color works well in konsole also. I use your solution to print all the color values from css files at the console.
    – cmevoli
    Jan 30, 2019 at 14:44
3

You could change the background colour of the terminal with:

printf '\e]11;%s\a' '#ff0000'

Which seems to work with xterm, VTE-based terminals (like gnome-terminal), konsole and rxvt at least.

You can also change other colours than the background's if you prefer. Like change the colour 1 and display a rectangle in that colour with:

printf '\e]4;1;%s\a\e[0;41m   \n   \n\e[m' '#ff0000'

To display more than one colour:

show_colour() {
  for i do
    printf '\e]4;%d;%s\a\e[0;48;5;%dm%s\e[m\n' "$#" "$i" "$#" "$i"
    shift
  done
}

show_colour black purple green '#ff0000'

That does permanently change the palette for that emulator window though. Use tput oc to restore the default colours.

Other option could be to run:

xlogo -bg '#ff0000'

Or

rxvt -bg '#ff0000'
2
-1

In the KDE terminal program konsole version 21.12.3 (https://konsole.kde.org/), if you hover over a hex color code it will show you that color as a pop-up square.

Not the answer you're looking for? Browse other questions tagged or ask your own question.