aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/prompt_adam3_setup
blob: ad6fefbc2fd41cc2df7788f966d2653cc48630e5 (plain) (tree)
1
2
3
4
5
6
7
8
9






                                                                                
                    
 
                      
             
 


                                                                               
 


   
                       
                                  
 

                       
          



                                              
 

                             
 



                                                                               
 

                                                               
 







                                                                              
 










































                                                                                     
 


                                                 
 

                                                                                    
      
                                                                  
                                                              

    
                                         

 
                        
                                           
 
                
 





                                                                                  
      










                                                                                     
    
 

                           
 
                     
                             
 

                                                                   

                        
 

 
                         


                                                                               
# 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