bash: emulate zsh 'colors' behaviour (+compat 3.x)

This commit is contained in:
Loic Nageleisen 2014-03-03 18:20:17 +01:00
parent c29d55e131
commit ca5b9f0754
5 changed files with 147 additions and 92 deletions

View file

@ -1,66 +0,0 @@
# defaults
local Z="\[\033[0m\]" # reset (zero) all attributes
local N="\[\033[0;39m\]" # reset fg to default (none)
local BGN="\[\033[0;49m\]" # reset bg to default (none)
# normal colors
local K="\[\033[30m\]" # black
local R="\[\033[31m\]" # red
local G="\[\033[32m\]" # green
local Y="\[\033[33m\]" # yellow
local B="\[\033[34m\]" # blue
local M="\[\033[35m\]" # magenta
local C="\[\033[36m\]" # cyan
local W="\[\033[37m\]" # white
# bright/bold colors
local BK="\[\033[1;30m\]" # black
local BR="\[\033[1;31m\]" # red
local BG="\[\033[1;32m\]" # greed
local BY="\[\033[1;33m\]" # yellow
local BB="\[\033[1;34m\]" # blue
local BM="\[\033[1;35m\]" # magenta
local BC="\[\033[1;36m\]" # cyan
local BW="\[\033[1;37m\]" # white
# normal background colors
local BGK="\[\033[40m\]" # black
local BGR="\[\033[41m\]" # red
local BGG="\[\033[42m\]" # green
local BGY="\[\033[43m\]" # yellow
local BGB="\[\033[44m\]" # blue
local BGM="\[\033[45m\]" # magenta
local BGC="\[\033[46m\]" # cyan
local BGW="\[\033[47m\]" # white
# transform color variables, if asked
for var in $color_vars; do
case "${!var}" in
"black") declare $var="$K";;
"red") declare $var="$R";;
"green") declare $var="$G";;
"yellow") declare $var="$Y";;
"blue") declare $var="$B";;
"magenta") declare $var="$M";;
"cyan") declare $var="$C";;
"white") declare $var="$W";;
"default") declare $var="$N";;
esac
done
# transform background color variables, if asked
for var in $bg_color_vars; do
case "${!var}" in
"black") declare $var="$BGK";;
"red") declare $var="$BGR";;
"green") declare $var="$BGG";;
"yellow") declare $var="$BGY";;
"blue") declare $var="$BGB";;
"magenta") declare $var="$BGM";;
"cyan") declare $var="$BGC";;
"white") declare $var="$BGW";;
"default") declare $var="$BGN";;
esac
done
# vim: ft=sh

115
bash/colors Normal file
View file

@ -0,0 +1,115 @@
ansi_sgr_index() {
case "$1" in
none) return 00;;
bold) return 01;;
faint) return 02;;
standout) return 03;;
underline) return 04;;
blink) return 05;;
#fast-blink) return 06;;
reverse) return 07;;
conceal) return 08;;
#strikethrough) return 09;;
#font-default) return 10;;
#font-first) return 11;;
#font-second) return 12;;
#font-third) return 13;;
#font-fourth) return 14;;
#font-fifth) return 15;;
#font-sixth) return 16;;
#font-seventh) return 17;;
#font-eighth) return 18;;
#font-ninth) return 19;;
#gothic) return 20;;
#double-underline) return 21;;
normal) return 22;;
no-standout) return 23;;
no-underline) return 24;;
no-blink) return 25;;
#proportional) return 26;;
no-reverse) return 27;;
no-conceal) return 28;;
#no-strikethrough) return 29;;
black) return 30;;
red) return 31;;
green) return 32;;
yellow) return 33;;
blue) return 34;;
magenta) return 35;;
cyan) return 36;;
white) return 37;;
#iso-8316-6) return 38;;
default) return 39;;
fg-black) return 30;;
fg-red) return 31;;
fg-green) return 32;;
fg-yellow) return 33;;
fg-blue) return 34;;
fg-magenta) return 35;;
fg-cyan) return 36;;
fg-white) return 37;;
#fg-iso-8316-6) return 38;;
fg-default) return 39;;
bg-black) return 40;;
bg-red) return 41;;
bg-green) return 42;;
bg-yellow) return 43;;
bg-blue) return 44;;
bg-magenta) return 45;;
bg-cyan) return 46;;
bg-white) return 47;;
#bg-iso-8316-6) return 48;;
bg-default) return 49;;
#no-proportional) return 50;;
#border-rectangle) return 51;;
#border-circle) return 52;;
#overline) return 53;;
#no-border) return 54;;
#no-overline) return 55;;
#through 59 reserved) return 56;;
#underline-or-right) return 60;;
#double-underline-or-right) return 61;;
#overline-or-left) return 62;;
#double-overline-or-left) return 63;;
#stress) return 64;;
#no-ideogram-marking) return 65;;
*) return 255;;
esac
}
ansi_csi_l="\033["
ansi_csi_sgr_r="m"
color=();
fg=();
fg_bold=();
fg_no_bold=();
bg=();
bg_bold=();
bg_no_bold=();
for v in {30..39}; do
fg[$v]="${ansi_csi_l}${v}${ansi_csi_sgr_r}"
ansi_sgr_index 'bold'
fg_bold[$v]="${ansi_csi_l}${?};${v}${ansi_csi_sgr_r}"
ansi_sgr_index 'normal'
fg_no_bold[$v]="${ansi_csi_l}${?};${v}${ansi_csi_sgr_r}"
done
for v in {40..49}; do
bg[$v]="${ansi_csi_l}${v}${ansi_csi_sgr_r}"
ansi_sgr_index 'bold'
bg_bold[$v]="${ansi_csi_l}${?};${v}${ansi_csi_sgr_r}"
ansi_sgr_index 'normal'
bg_no_bold[$v]="${ansi_csi_l}${?};${v}${ansi_csi_sgr_r}"
done
# vim: ft=sh

View file

@ -3,18 +3,18 @@ source "$DOTFILES_BASH_DIR/prompt_segments"
source "$DOTFILES_SHELL_DIR/prompt_vcs" source "$DOTFILES_SHELL_DIR/prompt_vcs"
prompt_host() { prompt_host() {
local bg='black' local host_bg='black'
local fg='white' local host_fg='white'
if [[ $UID -eq 0 ]]; then if [[ $UID -eq 0 ]]; then
bg='red' host_bg='red'
fi fi
if [[ -n $SSH_CLIENT ]]; then if [[ -n $SSH_CLIENT ]]; then
fg='yellow' host_fg='yellow'
fi fi
prompt_segment $bg $fg '\u@\h' prompt_segment $host_bg $host_fg '\u@\h'
} }
prompt_dir() { prompt_dir() {

View file

@ -5,10 +5,10 @@ SEGMENT_DEFAULT_FG='default'
CURRENT_BG='NONE' CURRENT_BG='NONE'
lprompt_segment() { lprompt_segment() {
local bg fg fake_bg local real_bg real_fg fake_bg
[[ -n $1 ]] && bg="$1" || bg='default' [[ -n $1 ]] && real_bg="$1" || real_bg='default'
[[ -n $2 ]] && fg="$2" || fg='default' [[ -n $2 ]] && real_fg="$2" || real_fg='default'
if [[ $CURRENT_BG == 'default' ]]; then if [[ $CURRENT_BG == 'default' ]]; then
fake_bg=$SEGMENT_DEFAULT_BG fake_bg=$SEGMENT_DEFAULT_BG
@ -16,16 +16,18 @@ lprompt_segment() {
fake_bg=$CURRENT_BG fake_bg=$CURRENT_BG
fi fi
# evaluate color vars # resolve colors
local color_vars="fg fake_bg" ansi_sgr_index "bg-$real_bg"
local bg_color_vars="bg" real_bg="${bg[$?]}"
source "$DOTFILES_BASH_DIR/ansi_colors" ansi_sgr_index $fake_bg
fake_bg="${fg[$?]}"
ansi_sgr_index $real_fg
real_fg="${fg[$?]}"
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
echo -n " \[$bg$fake_bg\]$SEGMENT_SEPARATOR\[$fg\] " echo -n " \[$real_bg$fake_bg\]$SEGMENT_SEPARATOR\[$real_fg\] "
else else
echo -n "\[$bg$fg\] " echo -n "\[$real_bg$real_fg\] "
fi fi
CURRENT_BG=$1 CURRENT_BG=$1
@ -36,28 +38,31 @@ lprompt_segment() {
# End the prompt, closing any open segments # End the prompt, closing any open segments
prompt_end() { prompt_end() {
local $bg; local $real_bg;
local $fg; local $real_fg;
local $fake_bg; local $fake_bg;
bg="default" real_bg="default"
fg="default" real_fg="default"
if [[ -n $CURRENT_BG ]]; then if [[ -n $CURRENT_BG ]]; then
fake_bg=$CURRENT_BG fake_bg=$CURRENT_BG
fi fi
# evaluate color vars # resolve colors
local color_vars="fg fake_bg" ansi_sgr_index "bg-$real_bg"
local bg_color_vars="bg" real_bg="${bg[$?]}"
source "$DOTFILES_BASH_DIR/ansi_colors" ansi_sgr_index $fake_bg
fake_bg="${fg[$?]}"
ansi_sgr_index $real_fg
real_fg="${fg[$?]}"
if [[ -n $CURRENT_BG ]]; then if [[ -n $CURRENT_BG ]]; then
echo -n " \[$bg$fake_bg\]$SEGMENT_SEPARATOR" echo -n " \[$real_bg$fake_bg\]$SEGMENT_SEPARATOR"
else else
echo -n "\[$bg\]" echo -n "\[$real_bg\]"
fi fi
echo -n "\[$fg\]" echo -n "\[$real_fg\]"
CURRENT_BG='' CURRENT_BG=''
} }

View file

@ -4,6 +4,7 @@
source $DOTFILES_SHELL_DIR/aliases source $DOTFILES_SHELL_DIR/aliases
source $DOTFILES_BASH_DIR/ext source $DOTFILES_BASH_DIR/ext
source $DOTFILES_BASH_DIR/colors
source $DOTFILES_BASH_DIR/prompt source $DOTFILES_BASH_DIR/prompt
source $DOTFILES_BASH_DIR/history source $DOTFILES_BASH_DIR/history
source $DOTFILES_BASH_DIR/term_title source $DOTFILES_BASH_DIR/term_title