# Filename: prompt_adam3_setup
# Purpose: a zsh-prompt that changes the color of your prompt based on
# the hostname of your current host
# Authors: Dennis Eriksen <https://dnns.no>
# Bug-Reports: Email <idgatt@dnns.no>
# License: This file is licensed under the GPL v2.
################################################################################
# adam3 prompt theme
prompt_adam3_help () {
cat <<'EOF'
This prompt changes the color of your prompt based on the
hostname of your current host. This can be quite nice if you log in to a lot of
different hosts (if you can manage to distribute the prompt, of course).
EOF
}
prompt_adam3_setup () {
setopt localoptions extendedglob
autoload -Uz vcs_info
# Colors
# Prefer positional arguments. Use environment if posititionals are not
# provided.
# Colors are given in a comma-separated way. "foreground,bacground,bold".
# Both fore- and background-colors may be given by name or number. Bold
# should be given with 1 for bold, 0 for no bold. Arguments can be dropped
# from the right. I.e. "blue,white,1" for bold blue text on white background.
# "blue,white" for blue (non-bold) on white background. Or just "blue" for
# just blue text and no given background. 'none' can be given as a color, and
# indicates no color. So, bold blue text with no background is "blue,none,1".
local -A prom color
color[host]=${1:-${PROMPT_ADAM3_COLOR1:-multi}} # host color
color[user]=${2:-${PROMPT_ADAM3_COLOR2:-white,blue}} # user color
color[dirS]=${3:-${PROMPT_ADAM3_COLOR3:-39,none,1}} # dir (single-mode) color
color[dirD]=${3:-${PROMPT_ADAM3_COLOR3:-39,none,1}} # dir (double mode) color
color[time]=${4:-${PROMPT_ADAM3_TIME:-${PROMPT_ADAM3_COLOR4:-66}}} # time color
# Username
prom[user]='%n@'
# Hostname
prom[host]='%m'
# DIR in single-line-mode
prom[dirS]='%-40<..<%(5~|%-1~/../%3~|%4~)%<< '
# DIR in double-line-mode
prom[dirD]='%-10<..<%~%<<'
# Time
[[ $timecolor != false ]] && prom[time]='%D{%H:%M:%S}'
# SHLVL
prom[shlvl]='%(10L.%F{58}%L%f .)'
# Promptchar (including exitcode)
typeset -g PROMPT_ADAM3_PROMPTCHAR='%(?..[%F{red}%?%f] )%B%F{%(!.red.white)}%#%f%b '
# same as above, but with $ instead of % as promptchar for unprivileged users
#typeset -g PROMPT_ADAM3_PROMPTCHAR='%B%(!.%F{red}#.F{white}$)%f%b '
# Set some styles for vcs_info
zstyle ':vcs_info:*' enable git svn
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' check-for-staged-changes true
zstyle ':vcs_info:*' stagedstr ' S'
zstyle ':vcs_info:*' unstagedstr ' U'
zstyle ':vcs_info:*' formats '%s %F{green}%b%F{red}%u%c%f '
zstyle ':vcs_info:git*' actionformats '%s %r/%S %F{green}%b%F{red}%u%c%a%f '
# Change color of host, based on hostname
if [[ $color[host] == 'multi' ]]; then
# Here we take the charset-number of each character in the hostname, and
# add them together.
local -i hostnum i
local c
for i in {1..$#HOST}; do
c=$HOST[$i]
(( hostnum += #c ))
done
local -a colors=( red,black green,black yellow,black blue,black \
magenta,black cyan,black white,red yellow,red \
cyan,red black,green blue,green black,yellow \
blue,yellow white,blue red,blue yellow,blue \
white,magenta yellow,magenta white,cyan blue,cyan \
black,white red,white blue,white magenta,white )
# Select color
color[host]=${colors[$hostnum % $#colors + 1]}
# Go bold?
((hostnum % 2)) && color[host]+=',1'
# for testing purposes
#color[host]=${colors[$RANDOM % $#colors + 1]}
#((RANDOM % 2)) && color[host]+=',1'
fi
# colorize the prompt-parts. See footnotes for extra comments.
for item in user host dirS dirD time; do
c=(${(s.,.)color[$item]}) # cheaper to do this expansion just once
[[ ${c[1]:-none} != none ]] && prom[$item]="%F{${c[1]}}$prom[${item}]%f"
[[ ${c[2]:-none} != none ]] && prom[$item]="%K{${c[2]}}$prom[${item}]%k"
(( ${c[3]} )) && prom[$item]="%B$prom[${item}]%b"
done
# Make each prompt-part global
typeset -g PROMPT_ADAM3_PS1="$prom[user]$prom[host] "
typeset -g PROMPT_ADAM3_SLM_DIR=$prom[dirS]
typeset -g PROMPT_ADAM3_DLM_DIR=$prom[dirD]
typeset -g PROMPT_ADAM3_RPS1=$prom[shlvl]$prom[time]
# Set up hook
add-zsh-hook precmd prompt_adam3_precmd
}
prompt_adam3_precmd () {
setopt localoptions extendedglob noxtrace
# vcs
vcs_info #$vcs_info_msg_0_
local prom
prom=$PROMPT_ADAM3_PS1
prom+=$PROMPT_ADAM3_SLM_DIR
prom+=$vcs_info_msg_0_
prom+=$PROMPT_ADAM3_PROMPTCHAR
# Calculate prompt-length by first removing all zero-length characters. From
# prompt_bart_setup in zsh.
local prompt_length=${#${(S%%)prom//\%([BSUbfksu]|[FK]\{*\})/}}
# If the prompt is over half the terminal, we go into multiline-mode.
if (( prompt_length > ( COLUMNS / 2 ) )); then
prom=$PROMPT_ADAM3_PS1 # reset prompt
prom+=$PROMPT_ADAM3_DLM_DIR # double-line-mode dir
# We need to recalculate prompt_length to know where to put time
prompt_length=${#${(S%%)prom//\%([BSUbfksu]|[FK]\{*\})/}}
local rprompt_length=${#${(S%%)PROMPT_ADAM3_RPS1//\%([BSUbfksu]|[FK]\{*\})/}}
local timepadding=$((COLUMNS - prompt_length + $#PROMPT_ADAM3_RPS1 - rprompt_length - 3 ))
# Add time. Left-pad with spaces.
prom+=${(l:$timepadding:)PROMPT_ADAM3_RPS1}
prom+=$'\n' # newline
prom+=$vcs_info_msg_0_ # vcs
prom+=$PROMPT_ADAM3_PROMPTCHAR # promptchar
RPS1= # RPS1 does not support multiline, so reset it when we're in multiline
else
RPS1=$PROMPT_ADAM3_RPS1
fi
PS1=$prom
(( ${+VIRTUAL_ENV} )) && PS1="%F{208}(${VIRTUAL_ENV:t})%f ${PS1}"
PS2="${PS1}%_> %b%f%k"
PS3="${PS1}?# %b%f%k"
}
prompt_adam3_setup "${@}"
# END OF FILE #################################################################
# vim: filetype=zsh