# enable hook method autoload add-zsh-hook # enable and configure vcs_info autoload -Uz vcs_info add-zsh-hook precmd vcs_info zstyle ':vcs_info:*' enable hg git cvs svn zstyle ':vcs_info:*' formats '%s|%b|%a|%i|%R|%r|%S|%m' # my prompt theme function promptSetup () { setopt prompt_subst local TERMWIDTH (( TERMWIDTH = ${COLUMNS} - 1 )) NOCOLOR="%{$terminfo[sgr0]%}" PS1=''; RPS1='' PS2="↷ %_>"; RPS2='' PS3="↷ ?#"; RPS3='' PS4="↷ +i>"; RPS3='' # prepare vcs info VCS_LINE='' VCS=$vcs_info_msg_0_ VCS_TYPE=$VCS[(ws:|:)1] VCS_BRANCH=$VCS[(ws:|:)2] VCS_CHANGES='' # setup the prompt sign if [[ $VCS_TYPE != '' ]]; then VCS_LINE+=$NOCOLOR VCS_LINE+='➜ ' case $VCS_TYPE in 'hg') VCS_LINE+='☿ ' VCS_CHANGES=`hg st 2>/dev/null | wc -l` ;; 'git') VCS_LINE+='± ' ;; *) VCS_LINE+="$VCS_TYPE " ;; esac fi VCS_LINE+=$VCS_BRANCH if [[ $VCS_CHANGES > 0 ]]; then VCS_LINE+="%F{166}%B" VCS_LINE+=' ★ ' VCS_LINE+=$VCS_CHANGES fi if [[ $VCS_PROJECTNAME != "" ]]; then VCS_LINE+=" ($VCS_PROJECTNAME)" fi # rootshell gets another prompt sign CURRENT_USER=`whoami` PR_SIGN=$NOCOLOR PR_SIGN+="%F{160}%B" # prepend the hostname if we are outside if [[ "$MYHOSTEXPRESSION" == "" ]]; then # if not set, home is nowhere MYHOSTEXPRESSION="^$" fi if [[ "`hostname`" =~ "$MYHOSTEXPRESSION" ]]; then # we are on our home desktop else # we are outside on a server PR_SIGN+="%F{green}$LOGNAME@`hostname`%F{white} " fi # full path PR_SIGN+="%F{blue}%~%F{white} " # setup the main sign if [[ $CURRENT_USER == 'root' ]]; then PR_SIGN+="☠" else PR_SIGN+="∴" fi PR_SIGN+="%F{white}%b" # http://unix.stackexchange.com/questions/1022/is-it-possible-to-display-stuff-below-the-prompt-at-a-prompt terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1] # Finally, the prompt. PS1=$'\n' # newline (specially quotet, see zsh FAQ 3.13) PS1+="%{$terminfo_down_sc$VCS_LINE$terminfo[rc]%}" # the second line PS1+=$PR_STITLE # tmux title if present PS1+=$PR_VCSSIGN # version control part if present PS1+=%(?..'%F{136}%B%'?) # output last error number if present PS1+=$PR_SIGN # the user sign PS1+=" " # an additional space # reset the tmux title promptSetMultiplexerTabTitle "zsh" } add-zsh-hook precmd promptSetup # set a tmux / screen 'tabulator' title if needed function promptSetMultiplexerTabTitle () { if [[ "$TERM" == "screen" ]]; then if [[ "$1" == "" ]]; then local CMD=${1[(wr)^(*=*|sudo|-*)]} echo -n "\ekttt$CMD\e\\" else local title="$1 ttt" # I dont know how to prevent errors on one word strings title=$title[(w)1] echo -n "\ek$title\e\\" fi fi } add-zsh-hook preexec promptSetMultiplexerTabTitle # setup tmux environment (context + status) # TODO: shorten the path variable # TODO: remove sudo if available... function tmuxChangeDirectory () { # set the tmux status line if [[ "$TMUX" != "" ]]; then newMailCountTool="/home/seebi/bin/scripts/newMailCount.py" tmux set-option -g status-right "$PWD ✉ #($newMailCountTool $MAIL)" | tee >/dev/null fi if [[ $VCS_TYPE == 'hg' ]]; then #tmux kill-pane -t 1 #tmux split-window -h -l 40 "while true; do clear; date; echo; hg xlog-small -l 5 || exit; sleep 600; done;" #tmux select-pane -t 0 fi } add-zsh-hook chpwd tmuxChangeDirectory # remove the line after the prompt on execution # http://unix.stackexchange.com/questions/1022/is-it-possible-to-display-stuff-below-the-prompt-at-a-prompt function eraseSecondLine () { print -rn -- $terminfo[el]; #echo; # this would keep the second line } add-zsh-hook preexec eraseSecondLine