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
+