Skip to content

Instantly share code, notes, and snippets.

@miaLDN
Last active April 26, 2026 01:09
Show Gist options
  • Select an option

  • Save miaLDN/632cbaec40e44f65c4e77e07c450e633 to your computer and use it in GitHub Desktop.

Select an option

Save miaLDN/632cbaec40e44f65c4e77e07c450e633 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
#
# shellcheck shell=bash
# shellcheck disable=SC2034
#
# (C) miaLDN 2026
# Control Sequence Introducer (CSI) = `ESC[`
CSI="\033["
CSI_END="m"
FG_XTERM256="38:"
BG_XTERM256="38:"
FG_RGB24="38:2::"
BG_RGB24="48:2::"
# Generate an xterm256 FG escape code from R G B (0-5)
# Usage: MY_COLOR=$(rgb256 5 2 0) # Returns Orange
rgb256() {
local r=$1 g=$2 b=$3
local color_idx=$(( 16 + (36 * r) + (6 * g) + b ))
echo -e "${CSI}38;5;${color_idx}m"
}
# Control sequence `CSI n m` is named Select Graphic Rendition (SGR)
# ANSI SGR
ANSI_DEFAULT="${CSI}0m"
BOLD="${CSI}1m"
ITALIC="${CSI}3m"
UNDERLINE="${CSI}4m"
FONT_NORMAL="${CSI}10m"
FONT1="${CSI}11m"
FONT2="${CSI}12m"
FONT3="${CSI}13m"
FONT4="${CSI}14m"
FONT5="${CSI}15m"
FONT6="${CSI}16m"
FONT7="${CSI}17m"
FONT8="${CSI}18m"
NOT_BOLD="${CSI}22m"
NOT_ITALIC="${CSI}22m"
NOT_UNDERLINE="${CSI}24m"
CURSOR_HOME="${CSI}H"
CURSOR_UP="${CSI}A"
CURSOR_DOWN="${CSI}B"
CURSOR_FORWARD="${CSI}C"
CURSOR_BACKWARD="${CSI}D"
CURSOR_NEXT_LINE="${CSI}E"
CURSOR_PREVIOUS_LINE="${CSI}F"
ERASE_LINE="${CSI}K"
ERASE_DISPLAY="${CSI}J"
SMCUP="${CSI}?1049h" #Save cursor position and switch to alternate screen buffer
RMCUP="${CSI}?1049l" # Restore cursor position and switch back to normal screen buffer
# Red background, white bold text
ERR_RED_B="${CSI}48;5;124;97;1m"
# ANSI 16Colors
FG_BLACK="${CSI}30m"
FG_RED="${CSI}31m"
FG_GREEN="${CSI}32m"
FG_YELLOW="${CSI}33m"
FG_BLUE="${CSI}34m"
FG_MAGENTA="${CSI}35m"
FG_CYAN="${CSI}36m"
FG_WHITE="${CSI}37m"
BG_BLACK="${CSI}40m"
BG_RED="${CSI}41m"
BG_GREEN="${CSI}42m"
BG_YELLOW="${CSI}43m"
BG_BLUE="${CSI}44m"
BG_MAGENTA="${CSI}45m"
BG_CYAN="${CSI}46m"
BG_WHITE="${CSI}47m"
# ANSI 16Colors Bright
FG_BLACK_B="${CSI}90m"
FG_RED_B="${CSI}91m"
FG_GREEN_B="${CSI}92m"
FG_YELLOW_B="${CSI}93m"
FG_BLUE_B="${CSI}94m"
FG_MAGENTA_B="${CSI}95m"
FG_CYAN_B="${CSI}96m"
FG_WHITE_B="${CSI}97m"
BG_BLACK_B="${CSI}100m"
BG_RED_B="${CSI}101m"
BG_GREEN_B="${CSI}102m"
BG_YELLOW_B="${CSI}103m"
BG_BLUE_B="${CSI}104m"
BG_MAGENTA_B="${CSI}105m"
BG_CYAN_B="${CSI}106m"
BG_WHITE_B="${CSI}107m"
# ␛[38;5;⟨n⟩m Select foreground color where n is a number from the table below
# ␛[48;5;⟨n⟩m Select background color
# ␛ 0- 7: standard colors (as in ␛ [ 30–37 m)
# ␛ 8- 15: high intensity colors (as in ␛ [ 90–97 m)
# ␛ 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
# ␛232-255: grayscale from dark to light in 24 steps
# ␛[38;2;⟨r⟩;⟨g⟩;⟨b⟩m select RGB foreground color
# ␛[48;2;⟨r⟩;⟨g⟩;⟨b⟩m select RGB background color
# ␛[39m select default foreground color
# ␛[49m select default background color
# ␛[⟨n⟩m select 8-color mode
# ⟨n⟩ = 30....37 standard foreground
# ⟨n⟩ = 40....47 standard background
# ⟨n⟩ = 90....97 intense foreground
# ⟨n⟩ = 100...107 intense background
# ITU T.416 uses ":" as separator instead of ";"
# ANSI Colors
PLEX_ORANGE="${CSI}48;5;166m"
PLEX_ORANGE_SUBDUED="${CSI}48;2;171;120;10;38;2;255;255;255m"
RED="${CSI}48;5;88m"
PLUM="${CSI}48;5;89m"
PINK="${CSI}48;5;205m"
PINK1="${CSI}48;5;163m"
PINK2="${CSI}48;5;128m"
PINK3="${CSI}48;5;205m"
GREEN1="${CSI}48;5;22m"
GREEN2="${CSI}48;5;28m"
GREEN3="${CSI}48;5;46m"
BLUE="${CSI}48;5;21m"
BLUE2="${CSI}48;5;19m"
BLUE1="${CSI}48;5;18m"
BLUE0="${CSI}48;5;17m"
PURPLE="${CSI}48;5;57m"
ORANGE_TEXT="${CSI}38;5;202m"
BLUE1_TEXT="${CSI}38;5;33m"
BLUE2_TEXT="${CSI}38;5;45m"
BLUE3_TEXT="${CSI}38;5;21m"
BLUE_TEXT="${CSI}38;2;58;150;221m" # #3a96dd
GREEN1_TEXT="${CSI}38;5;34m"
GREEN2_TEXT="${CSI}38;5;40m"
GREEN3_TEXT="${CSI}38;5;46m"
RED_TEXT="${CSI}38;5;124m"
RED1_TEXT="${CSI}38;5;88m"
RED2_TEXT="${CSI}38;5;160m"
RED3_TEXT="${CSI}38;5;196m"
PURPLE_TEXT="${CSI}38;5;63m"
PINK_TEXT="${CSI}38;5;205m"
PINK1_TEXT="${CSI}38;5;198m"
PINK2_TEXT="${CSI}38;5;163m"
PINK3_TEXT="${CSI}38;5;128m"
YELLOW1_TEXT="${CSI}38;5;11m"
YELLOW2_TEXT="${CSI}38;5;229m"
# ANSI Colors Bright
PLEX_ORANGE_B="${CSI}48;5;166;97;1m" # DarkOrange3 #d75f00
PLEX_ORANGE_SUBDUED_B="${CSI}48;2;171;120;10;38;2;255;255;255;1m"
RED_B="${CSI}48;5;88;1m"
PLUM_B="${CSI}48;5;89;1m"
PINK_B="${CSI}48;5;205;1m" # HotPink #ff5faf
PINK1_B="${CSI}48;5;198;1m" # DeepPink1 #ff0087
PINK2_B="${CSI}48;5;163;1m" # Magenta3 #d700af
PINK3_B="${CSI}48;5;128;1m" # DarkViolet #af00d7
GREEN1_B="${CSI}48;5;22;1m" # DarkGreen #005f00
GREEN2_B="${CSI}48;5;28;1m" # Green4 #008700
GREEN3_B="${CSI}48;5;46;1m" # Green1 #00ff00
BLUE_B="${CSI}48;5;21;1m"
BLUE2_B="${CSI}48;5;19;1m"
BLUE1_B="${CSI}48;5;18;1m"
BLUE0_B="${CSI}48;5;17;1m"
PURPLE_B="${CSI}48;5;57;1m"
ORANGE_TEXT_B="${CSI}38;5;202;1m" # OrangeRed1 #ff5f00
BLUE1_TEXT_B="${CSI}38;5;33;1m"
BLUE2_TEXT_B="${CSI}38;5;45;1m"
GREEN1_TEXT_B="${CSI}38;5;34;1m"
GREEN2_TEXT_B="${CSI}38;5;40;1m"
GREEN3_TEXT_B="${CSI}38;5;46;1m"
RED1_TEXT_B="${CSI}38;5;88;1m" # DarkRed #870000
RED2_TEXT_B="${CSI}38;5;160;1m" # Red3 #d70000
RED3_TEXT_B="${CSI}38;5;196;1m" # Red1 #ff0000
PURPLE_TEXT_B="${CSI}38;5;63;1m"
PINK_TEXT_B="${CSI}38;5;205;1m"
PINK1_TEXT_B="${CSI}38;5;198;1m"
PINK2_TEXT_B="${CSI}38;5;163;1m"
PINK3_TEXT_B="${CSI}38;5;128;1m"
YELLOW1_TEXT_B="${CSI}38;5;11;1m" # Yellow (SYSTEM) #ffff00
YELLOW2_TEXT_B="${CSI}38;5;229;1m" # Wheat1 #ffffaf
PLUM_TEXT_B="${CSI}38;5;89;1m"
# Pastel colors
#
# ESC[38;2;⟨R⟩;⟨G⟩;⟨B⟩m where R, G, B are integers from 0⋯255
SOFT_PINK_TEXT_B="${CSI}38;2;255;173;173;1m"
LIGHT_PEACH_TEXT_B="${CSI}38;2;255;214;165;1m"
PASTEL_YELLOW_TEXT_B="${CSI}38;2;253;255;182;1m"
_TEXT_B="${CSI}38;2;202;255;191;1m"
TRON_BLUE_TEXT_B="${CSI}38;2;155;246;255;1m"
_TEXT_B="${CSI}38;2;160;196;255;1m"
_TEXT_B="${CSI}38;2;189;178;255;1m"
_TEXT_B="${CSI}38;2;255;198;255;1m"
C0_TEXT_B="${CSI}38;2;255;173;173;1m"
C1_TEXT_B="${CSI}38;2;255;214;165;1m"
C2_TEXT_B="${CSI}38;2;253;255;182;1m"
C3_TEXT_B="${CSI}38;2;202;255;191;1m"
C4_TEXT_B="${CSI}38;2;155;246;255;1m"
C5_TEXT_B="${CSI}38;2;160;196;255;1m"
C6_TEXT_B="${CSI}38;2;189;178;255;1m"
C7_TEXT_B="${CSI}38;2;255;198;255;1m"
PLEX_ORANGE_SUBDUED_B="${CSI}48;2;171;120;10;38;2;255;255;255;1m"
@miaLDN

miaLDN commented Apr 26, 2026

Copy link
Copy Markdown
Author

My WIP ANSI color library is also here (it's a partial copy from my Python module, and a refactor is pending):

ansi_colors.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment