# 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 # Bug-Reports: Email # 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]='%*' # 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 - 1)) # 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