Display xterm color palette

note, May 25, 2023, on Mitja Felicijan's blog

  • bash xterm-palette.sh - will show you number of max colors available
  • bash xterm-palette.sh -v - will create a list of all colors with codes
xterm color palette
#!/usr/bin/env bash
# xterm-palette.sh

trap 'tput sgr0' exit		# Clean up even if user hits ^C

function setfg () {
    printf '\e[38;5;%dm' $1
}

function setbg () {
    printf '\e[48;5;%dm' $1
}

function showcolors() {
    # Given an integer, display that many colors
    for ((i=0; i<$1; i++))
    do
	printf '%4d ' $i
	setbg $i
	tput el
	tput sgr0
	echo
    done
    tput sgr0 el
}

# First, test if terminal supports OSC 4 at all.
printf '\e]4;%d;?\a' 0
read -d $'\a' -s -t 0.1 </dev/tty
if [ -z "$REPLY" ]
then
    # OSC 4 not supported, so we'll fall back to terminfo
    max=$(tput colors)
else
    # OSC 4 is supported, so use it for a binary search
    min=0
    max=256
    while [[ $((min+1)) -lt $max ]]
    do
	i=$(( (min+max)/2 ))
	printf '\e]4;%d;?\a' $i
	read -d $'\a' -s -t 0.1 </dev/tty
	if [ -z "$REPLY" ]
	then
            max=$i
	else
	    min=$i
	fi
    done
fi


# If -v is given, show all the colors
case ${1-none} in
    none)
	echo $max
	;;
    -v)
	showcolors $max
	;;
    *)
	if [[ "$1" -gt 0 ]]; then
	    showcolors $1
	else
	    echo $max
	fi
	;;
esac | less --raw-control-chars --QUIT-AT-EOF --no-init