aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/prompt_adam3_setup
blob: c3ef586945d3559da569333929d4551b5b73335e (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    PROMPT_ADAM3_COLOR1=${1:-'multi'}
  typeset    PROMPT_ADAM3_COLOR2=${2:-'blue'}
  typeset    PROMPT_ADAM3_COLOR3=${3:-'cyan'}
  typeset -g PROMPT_ADAM3_COLOR4=${4:-'green'}

  # Prepare prompt
  typeset -g PROMPT_ADAM3_PS1

  # 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'

  # DIR in single-line-mode
  typeset -g PROMPT_ADAM3_SL_DIR="%B%F{$PROMPT_ADAM3_COLOR3}%-40<..<%(5~|%-1~/../%3~|%4~)%f%b%<< "
  # DIR in double-line-mode
  typeset -g PROMPT_ADAM3_DL_DIR="%B%F{$PROMPT_ADAM3_COLOR3}%-10<..<%~%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

  # time
  local time="%F{$PROMPT_ADAM3_COLOR4}%*%f"

  # vcs
  vcs_info #$vcs_info_msg_0_

  local prom
  prom=$PROMPT_ADAM3_PS1
  prom+=$PROMPT_ADAM3_SL_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 (( (COLUMNS / 2) < prompt_length )); then
    prom=$PROMPT_ADAM3_PS1      # reset prompt
    prom+=$PROMPT_ADAM3_DL_DIR  # dir

    # We need to recalculate prompt_length to know where to put time
    prompt_length=${#${(S%%)prom//\%([BSUbfksu]|[FK]\{*\})/}}

    # Add time. Left-pad with spaces.
    prom+=${(l:$((COLUMNS - prompt_length + 1 )):)time}
    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=$time
  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