From 973a8bdf30456b1d073bd81aa94a18cfd322366b Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Mon, 24 Jan 2022 16:08:10 +0900 Subject: [PATCH] lib/{utils,omb-prompt-colors}: Support bright color names --- lib/omb-prompt-colors.sh | 70 ++++++------------ lib/utils.sh | 150 +++++++++++++++++---------------------- 2 files changed, 84 insertions(+), 136 deletions(-) diff --git a/lib/omb-prompt-colors.sh b/lib/omb-prompt-colors.sh index b2d6947..dd737e6 100644 --- a/lib/omb-prompt-colors.sh +++ b/lib/omb-prompt-colors.sh @@ -81,59 +81,29 @@ function _omb_theme_color_echo { echo "\033[${out}m" } -_omb_prompt_brown='\[\e[0;31m\]' -_omb_prompt_green='\[\e[0;32m\]' -_omb_prompt_olive='\[\e[0;33m\]' -_omb_prompt_navy='\[\e[0;34m\]' -_omb_prompt_purple='\[\e[0;35m\]' -_omb_prompt_black='\[\e[0;30m\]' -_omb_prompt_teal='\[\e[0;36m\]' -_omb_prompt_white='\[\e[0;37m\]' -_omb_prompt_red='\[\e[0;91m\]' +function _omb_prompt_color_initialize { + _omb_prompt_normal='\[\e[0m\]' + _omb_prompt_reset_color='\[\e[39m\]' -_omb_prompt_bold_black='\[\e[30;1m\]' -_omb_prompt_bold_brown='\[\e[31;1m\]' -_omb_prompt_bold_green='\[\e[32;1m\]' -_omb_prompt_bold_olive='\[\e[33;1m\]' -_omb_prompt_bold_navy='\[\e[34;1m\]' -_omb_prompt_bold_purple='\[\e[35;1m\]' -_omb_prompt_bold_teal='\[\e[36;1m\]' -_omb_prompt_bold_white='\[\e[37;1m\]' -_omb_prompt_bold_red='\[\e[91;1m\]' + # used by themes/gallifrey + _omb_prompt_bold='\[\e[1m\]' -_omb_prompt_underline_black='\[\e[30;4m\]' -_omb_prompt_underline_brown='\[\e[31;4m\]' -_omb_prompt_underline_green='\[\e[32;4m\]' -_omb_prompt_underline_olive='\[\e[33;4m\]' -_omb_prompt_underline_navy='\[\e[34;4m\]' -_omb_prompt_underline_purple='\[\e[35;4m\]' -_omb_prompt_underline_teal='\[\e[36;4m\]' -_omb_prompt_underline_white='\[\e[37;4m\]' -_omb_prompt_underline_red='\[\e[91;4m\]' + local -a normal_colors=(black brown green olive navy purple teal silver) + local -a bright_colors=(gray red lime yellow blue magenta cyan white) + local index + for ((index = 0; index < 8; index++)); do + printf -v "_omb_prompt_${normal_colors[index]}" %s '\[\e[0;3'"$index"'m\]' + printf -v "_omb_prompt_bold_${normal_colors[index]}" %s '\[\e[3'"$index"';1m\]' + printf -v "_omb_prompt_underline_${normal_colors[index]}" %s '\[\e[3'"$index"';4m\]' + printf -v "_omb_prompt_background_${normal_colors[index]}" %s '\[\e[4'"$index"'m\]' + printf -v "_omb_prompt_${bright_colors[index]}" %s '\[\e[0;9'"$index"'m\]' + printf -v "_omb_prompt_bold_${bright_colors[index]}" %s '\[\e[9'"$index"';1m\]' + printf -v "_omb_prompt_underline_${bright_colors[index]}" %s '\[\e[9'"$index"';4m\]' + printf -v "_omb_prompt_background_${bright_colors[index]}" %s '\[\e[10'"$index"'m\]' + done +} +_omb_prompt_color_initialize -_omb_prompt_background_black='\[\e[40m\]' -_omb_prompt_background_brown='\[\e[41m\]' -_omb_prompt_background_green='\[\e[42m\]' -_omb_prompt_background_olive='\[\e[43m\]' -_omb_prompt_background_navy='\[\e[44m\]' -_omb_prompt_background_purple='\[\e[45m\]' -_omb_prompt_background_teal='\[\e[46m\]' -_omb_prompt_background_white='\[\e[47;1m\]' -_omb_prompt_background_red='\[\e[101m\]' - -_omb_prompt_normal='\[\e[0m\]' -_omb_prompt_reset_color='\[\e[39m\]' - -# These colors are intended to be used with `echo` - -# These variables are defined in "lib/utils.sh" -# - _omb_term_{,_bold,_underline,_background}{,red,white,violet} - -_omb_term_normal=$'\e[0m' -_omb_term_reset_color=$'\e[39m' - -# used by themes/gallifrey -_omb_prompt_bold='\[\e[1m\]' _omb_deprecate_function 20000 color _omb_theme_color_prompt _omb_deprecate_function 20000 echo_color _omb_theme_color_echo diff --git a/lib/utils.sh b/lib/utils.sh index 8961dda..43e7118 100644 --- a/lib/utils.sh +++ b/lib/utils.sh @@ -124,35 +124,29 @@ _omb_util_function_exists() { # Set Colors # # Use colors, but only if connected to a terminal, and that terminal -# supports them. -if [[ ! -t 1 ]]; then - _omb_term_colors= - _omb_term_bold= - _omb_term_underline= - _omb_term_reset= +# supports them. These colors are intended to be used with `echo` +# +_omb_term_color_initialize() { + local name + local -a normal_colors=(black brown green olive navy purple teal silver) + local -a bright_colors=(gray red lime yellow blue magenta cyan white) - _omb_term_black= - _omb_term_brown= - _omb_term_green= - _omb_term_olive= - _omb_term_navy= - _omb_term_purple= - _omb_term_teal= - _omb_term_silver= + if [[ ! -t 1 ]]; then + _omb_term_colors= + _omb_term_bold= + _omb_term_underline= + _omb_term_reset= + _omb_term_normal= + _omb_term_reset_color= + for name in "${normal_colors[@]}" "${bright_colors[@]}" violet; do + printf -v "_omb_term_$name" '' + printf -v "_omb_term_background_$name" '' + printf -v "_omb_term_bold_$name" '' + printf -v "_omb_term_underline_$name" '' + done + return 0 + fi - _omb_term_background_black= - _omb_term_background_brown= - _omb_term_background_green= - _omb_term_background_olive= - _omb_term_background_navy= - _omb_term_background_purple= - _omb_term_background_teal= - _omb_term_background_silver= - - _omb_term_red= - _omb_term_white= - _omb_term_violet= -else if _omb_util_binary_exists tput; then _omb_term_colors=$(tput colors 2>/dev/null || tput Co 2>/dev/null) _omb_term_bold=$(tput bold 2>/dev/null || tput md 2>/dev/null) @@ -164,81 +158,65 @@ else _omb_term_underline=$'\e[4m' _omb_term_reset=$'\e[0m' fi + _omb_term_normal=$'\e[0m' + _omb_term_reset_color=$'\e[39m' + # normal colors if ((_omb_term_colors >= 8)); then - _omb_term_black=$(tput setaf 0 2>/dev/null || tput AF 0 2>/dev/null) - _omb_term_brown=$(tput setaf 1 2>/dev/null || tput AF 1 2>/dev/null) - _omb_term_green=$(tput setaf 2 2>/dev/null || tput AF 2 2>/dev/null) - _omb_term_olive=$(tput setaf 3 2>/dev/null || tput AF 3 2>/dev/null) - _omb_term_navy=$(tput setaf 4 2>/dev/null || tput AF 4 2>/dev/null) - _omb_term_purple=$(tput setaf 5 2>/dev/null || tput AF 5 2>/dev/null) - _omb_term_teal=$(tput setaf 6 2>/dev/null || tput AF 6 2>/dev/null) - _omb_term_silver=$(tput setaf 7 2>/dev/null || tput AF 7 2>/dev/null) + local index + for ((index = 0; index < 8; index++)); do + local fg=$(tput setaf "$index" 2>/dev/null || tput AF "$index" 2>/dev/null) + [[ $fg ]] || fg=$'\e[3'$index'm' + printf -v "_omb_term_${normal_colors[index]}" %s "$fg" + printf -v "_omb_term_background_${normal_colors[index]}" '\e[4%sm' "$index" + done else - _omb_term_black=$'\e[30m' - _omb_term_brown=$'\e[31m' - _omb_term_green=$'\e[32m' - _omb_term_olive=$'\e[33m' - _omb_term_navy=$'\e[34m' - _omb_term_purple=$'\e[35m' - _omb_term_teal=$'\e[36m' - _omb_term_silver=$'\e[37m' + local index + for ((index = 0; index < 8; index++)); do + printf -v "_omb_term_${normal_colors[index]}" '\e[3%sm' "$index" + printf -v "_omb_term_background_${normal_colors[index]}" '\e[4%sm' "$index" + done fi - _omb_term_background_black=$'\e[40m' - _omb_term_background_brown=$'\e[41m' - _omb_term_background_green=$'\e[42m' - _omb_term_background_olive=$'\e[43m' - _omb_term_background_navy=$'\e[44m' - _omb_term_background_purple=$'\e[45m' - _omb_term_background_teal=$'\e[46m' - _omb_term_background_silver=$'\e[47m' - + # bright colors if ((_omb_term_colors >= 16)); then - _omb_term_red=$(tput setaf 9 2>/dev/null || tput AF 9 2>/dev/null) - _omb_term_white=$(tput setaf 15 2>/dev/null || tput AF 15 2>/dev/null) - _omb_term_background_red=$_omb_term_background_brown$'\e[101m' - _omb_term_background_white=$_omb_term_background_silver$'\e[107m' + local index + for ((index = 0; index < 8; index++)); do + local fg=$(tput setaf $((index+8)) 2>/dev/null || tput AF $((index+8)) 2>/dev/null) + [[ $fg ]] || fg=$'\e[9'$index'm' + local refbg=_omb_term_background_${normal_colors[index]} + local bg=${!refbg}$'\e[10'$index'm' + printf -v "_omb_term_${bright_colors[index]}" %s "$fg" + printf -v "_omb_term_background_${bright_colors[index]}" %s "$bg" + done else - _omb_term_red=$_omb_term_bold$_omb_term_brown - _omb_term_white=$_omb_term_bold$_omb_term_silver - _omb_term_background_red=$_omb_term_bold$_omb_term_background_brown - _omb_term_background_white=$_omb_term_bold$_omb_term_background_silver + # copy normal colors to bright colors (with bold) + local index + for ((index = 0; index < 8; index++)); do + local reffg=_omb_term_${normal_colors[index]} + local refbg=_omb_term_background_${normal_colors[index]} + printf -v "_omb_term_${bright_colors[index]}" %s "$_omb_term_bold${!reffg}" + printf -v "_omb_term_background_${bright_colors[index]}" %s "$_omb_term_bold${!refbg}" + done fi + # index colors if ((_omb_term_colors == 256)); then - _omb_term_violet=$(tput setaf 171 2>/dev/null || tput AF 171 2>/dev/null) + _omb_term_violet=$'\e[38;5;171m' _omb_term_background_violet=$'\e[48;5;171m' else _omb_term_violet=$_omb_term_purple _omb_term_background_violet=$_omb_term_background_purple fi -fi - -_omb_term_bold_black=$_omb_term_bold$_omb_term_black -_omb_term_bold_brown=$_omb_term_bold$_omb_term_brown -_omb_term_bold_green=$_omb_term_bold$_omb_term_green -_omb_term_bold_olive=$_omb_term_bold$_omb_term_olive -_omb_term_bold_navy=$_omb_term_bold$_omb_term_navy -_omb_term_bold_purple=$_omb_term_bold$_omb_term_purple -_omb_term_bold_teal=$_omb_term_bold$_omb_term_teal -_omb_term_bold_silver=$_omb_term_bold$_omb_term_silver -_omb_term_bold_red=$_omb_term_bold$_omb_term_red -_omb_term_bold_white=$_omb_term_bold$_omb_term_white -_omb_term_bold_violet=$_omb_term_bold$_omb_term_violet - -_omb_term_underline_black=$_omb_term_underline$_omb_term_black -_omb_term_underline_brown=$_omb_term_underline$_omb_term_brown -_omb_term_underline_green=$_omb_term_underline$_omb_term_green -_omb_term_underline_olive=$_omb_term_underline$_omb_term_olive -_omb_term_underline_navy=$_omb_term_underline$_omb_term_navy -_omb_term_underline_purple=$_omb_term_underline$_omb_term_purple -_omb_term_underline_teal=$_omb_term_underline$_omb_term_teal -_omb_term_underline_silver=$_omb_term_underline$_omb_term_silver -_omb_term_underline_red=$_omb_term_underline$_omb_term_red -_omb_term_underline_white=$_omb_term_underline$_omb_term_white -_omb_term_underline_violet=$_omb_term_underline$_omb_term_violet + # bold / underline versions + for name in "${normal_colors[@]}" "${bright_colors[@]}" violet; do + local ref=_omb_term_$name + printf -v "_omb_term_bold_$name" %s "$_omb_term_bold${!ref}" + printf -v "_omb_term_underline_$name" %s "$_omb_term_underline${!ref}" + done +} +_omb_term_color_initialize # # Headers and Logging