# 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
typeset -g PROMPT_ADAM3_COLOR1=${1:-'multi'}
typeset -g PROMPT_ADAM3_COLOR2=${2:-'blue'}
typeset -g PROMPT_ADAM3_COLOR3=${3:-'cyan'}
typeset -g PROMPT_ADAM3_COLOR4=${4:-'green'}
# Prepare prompt
typeset -g PROMPT_ADAM3_PS1
# Promptchar
typeset -g PROMPT_ADAM3_PROMPTCHAR='%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'
# Prepare som local variables
local -i hm=15 # max chars in hostname. Recalculate if above.
# 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 "
# Set username prompt
local userprom="%K{${PROMPT_ADAM3_COLOR2}}%n@%k"
# Change color of host, based on hostname
if [[ "${PROMPT_ADAM3_COLOR1}" == 'multi' ]]; then
# Map up letters to numbers to convert hostname to a number
local -A map=( 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 \
a 0 b 1 c 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9 \
k 0 l 1 m 2 n 3 o 4 p 5 q 6 r 7 s 8 t 9 \
u 0 v 1 w 2 x 3 y 4 z 5 , 6 . 7 - 8 _ 9 \
/ 0 )
# Translate hostname into a pseudo-random number that won't change with
# time. We do this "simply" by translating each letter into a corresponding
# number, using the map above.
local -i hostnum=${HOST//(#m)?/${map[$MATCH]}}
# If we have a REALLY LONG hostname, the number we end up with will be too
# large for zsh to handle. Here's a trick to shorten the number, while
# still ending up with a predictable number for each host.
if (( $#hostnum > hm )); then
local -i s i
for i in {0..$(( $#hostnum / hm ))}; s=$(( s + 0${hostnum:$(( i * hm )):$hm} ))
hostnum=$s
fi
# define available color-bombos
local -a colors=( black,red black,green black,yellow black,blue \
black,magenta black,cyan red,white red,yellow \
red,cyan green,black green,blue yellow,black \
yellow,blue blue,white blue,red blue,yellow \
magenta,white magenta,yellow cyan,white cyan,blue \
white,black white,red white,blue white,magenta )
# Select color
local host_color=${colors[$hostnum % $#colors + 1]}
# Go bold?
local B b
((hostnum % 2)) && B=%B b=%b
# Just in case hostnum is b0rked.
(( ! hostnum )) && host_color="white,black" B= b=
# for testing purposes
#host_color=${colors[$RANDOM % $#colors + 1]}
#host_bold=$(( $RANDOM % 2 ))
# This is where we set up the actual prompt.
PROMPT_ADAM3_PS1="$userprom$B%K{${host_color%,*}}%F{${host_color##*,}}%m%f%k$b "
else
# If one wants a specific color, just set ut, plain and simple
PROMPT_ADAM3_PS1="$userprom%K{${PROMPT_ADAM3_COLOR1}}%m%k"
fi
add-zsh-hook precmd prompt_adam3_precmd
}
prompt_adam3_precmd () {
setopt localoptions extendedglob noxtrace
local nl=$'\n'
PS1="${PROMPT_ADAM3_PS1}"
# Change prompt layout at 70 cols. If more - single line. If less - double line.
if (( COLUMNS > 70 )); then
PS1+="%B%F{$PROMPT_ADAM3_COLOR3}%-40<..<%(4~,..,)%3~%f%b%<< "
RPS1="%F{$PROMPT_ADAM3_COLOR4}%*%f"
else
PS1+="%B%F{$PROMPT_ADAM3_COLOR3}%-10<..<%~%f%b%<<"
# Do clock on same line. RPS1 does not support multiline.
RPS1=
# Calculate prompt-length by first removing all zero-length characters. From
# prompt_bart_setup in zsh.
local -i prompt_length=${#${(S%%)PS1//\%([BSUbfksu]|[FK]\{*\})/}}
#local spaces=$((COLUMNS - prompt_length + 2))
#local right="%F{$PROMPT_ADAM3_COLOR4}%*%f"
#PS1+="${(l:$spaces:)right}$nl"
PS1+="${(l:$((COLUMNS - prompt_length +2)):):-"%F{$PROMPT_ADAM3_COLOR4}%*%f"}$nl"
fi
vcs_info
PS1+="${vcs_info_msg_0_}"
# Display exit-code
PS1+="%(?..[%F{red}%?%f] )"
PS1+="$PROMPT_ADAM3_PROMPTCHAR "
(( ${+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