zshrc/prompt.zsh

143 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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
# 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+="`hostname` "
fi
# setup the main sign
if [[ $CURRENT_USER == 'root' ]]; then
PR_SIGN+="☠"
elif [[ $CURRENT_USER == 'vagrant' ]]; 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