dots/zsh/prompt
Jacobi Carter ce5a60f62b Fixes
2016-11-03 21:30:53 -07:00

175 lines
5.7 KiB
Text
Executable file

# prompt
RESETCOLOR=''
HOSTCOLOR=''
PATHCOLOR=''
BOLDERRORCOLOR=''
BLACKCOLOR=''
case "${TERM}" in
*256color*|xterm-termite)
RESETCOLOR=$'%{\e[00;00m%}'
if [ -z "${SSH_TTY}" ] ; then
HOSTCOLOR=$'%{\e[01;38;5;113m%}'
else
HOSTCOLOR=$'%{\e[01;38;5;80m%}'
fi
PATHCOLOR=$'%{\e[38;5;74m%}'
ERRORCOLOR=$'%{\e[38;5;1m%}'
BOLDERRORCOLOR=$'%{\e[01;38;5;9m%}'
CLOCKCOLOR=$'%{\e[01;38;5;221m%}'
JOBCOLOR=$'%{\e[38;5;30m%}'
if [ "${TERM_PROGRAM}" = "Apple_Terminal" ] ; then
BLACKCOLOR=$'%{\e[00;30m%}'
else
BLACKCOLOR=$'%{\e[38;5;232m%}'
fi
;;
dumb)
;;
*)
if command -v tput >/dev/null 2>&1 && [ `tput colors` != -1 ] ; then
RESETCOLOR=$'%{\e[00;00m%}'
if [ -z "${SSH_TTY}" ] ; then
HOSTCOLOR=$'%{\e[01;32m%}'
else
HOSTCOLOR=$'%{\e[01;36m%}'
fi
PATHCOLOR=$'%{\e[01;34m%}'
ERRORCOLOR=$'%{\e[00;31m%}'
BOLDERRORCOLOR=$'%{\e[01;31m%}'
CLOCKCOLOR=$'%{\e[01;33m%}'
JOBCOLOR=$'%{\e[00;36m%}'
BLACKCOLOR=$'%{\e[00;30m%}'
fi
;;
esac
GREEN=$'%{\e[01;32m%}'
RED=$'%{\e[01;31m%}'
GRAY=$'%{\e[01;30m%}'
PURPLE=$'%{\e[00;35m%}'
YELLOW=$'%{\e[01;33m%}'
function havegit () {
if which git > /dev/null
then
local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]
then
true
else
false
fi
else
false
fi
}
ZSH_THEME_GIT_PROMPT_UNTRACKED="?"
ZSH_THEME_GIT_PROMPT_ADDED="+"
ZSH_THEME_GIT_PROMPT_MODIFIED="!"
ZSH_THEME_GIT_PROMPT_DELETED="-"
ZSH_THEME_GIT_PROMPT_UNMERGED="&"
ZSH_THEME_GIT_PROMPT_RENAMED=">"
ZSH_THEME_GIT_PROMPT_SUBMODULE="_"
git_prompt_status() {
INDEX=$(git status --porcelain 2> /dev/null)
STATUS=""
if $(echo "$INDEX" | grep '^?? ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
fi
if $(echo "$INDEX" | grep '^A ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
elif $(echo "$INDEX" | grep '^M ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
fi
if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
fi
if $(echo "$INDEX" | grep '^R ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
fi
if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
fi
if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
fi
if $(cd "$1" ; git submodule status --recursive 2>/dev/null | egrep '^(\+|-)' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_PROMPT_SUBMODULE$STATUS"
fi
echo $STATUS
}
function updateprompt () {
if havegit ; then
local gitdir="$(readlink -m $(git rev-parse --git-dir 2>/dev/null))"
local repodir="$(dirname "${gitdir}")"
local reponame="$(basename "${repodir}")"
local curdir="$(pwd)"
local repopath=".${curdir#${repodir}}"
local additional
local branch
if [ -d "$gitdir/rebase-apply" ]; then
if test -f "$gitdir/rebase-apply/rebasing"; then
additional="|${PURPLE}REBASE"
elif test -f "$gitdir/rebase-apply/applying"; then
additional="|${PURPLE}AM"
else
additional="|${PURPLE}AM/REBASE"
fi
branch="$(git symbolic-ref HEAD 2>/dev/null)"
elif [ -f "$gitdir/rebase-merge/interactive" ]; then
additional="|${PURPLE}REBASE-i"
branch="$(cat "$gitdir/rebase-merge/head-name")"
elif [ -d "$gitdir/rebase-merge" ]; then
additional="|${PURPLE}REBASE-m"
branch="$(cat "$gitdir/rebase-merge/head-name")"
elif [ -f "$gitdir/MERGE_HEAD" ]; then
additional="|${PURPLE}MERGING"
branch="$(git symbolic-ref HEAD 2>/dev/null)"
else
if [ -f "$gitdir/BISECT_LOG" ]; then
additional="|${PURPLE}BISECTING"
fi
if ! branch="$(git symbolic-ref HEAD 2>/dev/null)"; then
if ! branch="$(git describe --exact-match HEAD 2>/dev/null)"; then
branch="$(cut -c1-7 "$gitdir/HEAD")..."
fi
fi
fi
branch="${branch##refs/heads/}"
local remote=${$(git rev-parse --verify ${branch}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/}
local remotepart=""
local -a gitstatus
if [[ -n ${remote} ]] ; then
# for git prior to 1.7
# ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l)
local ahead="$(git rev-list ${branch}@{upstream}..HEAD 2>/dev/null | wc -l)"
gitstatus+=( "${GREEN}+${ahead}${GRAY}" )
# for git prior to 1.7
# behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l)
local behind="$(git rev-list HEAD..${branch}@{upstream} 2>/dev/null | wc -l)"
gitstatus+=( "${RED}-${behind}${GRAY}" )
remotepart="${RESETCOLOR}${GRAY}[${remote} ${(j:/:)gitstatus}]${RESETCOLOR}"
fi
local stashpart=""
if [[ -s ${gitdir}/refs/stash ]] ; then
stashes=$(git stash list 2>/dev/null | wc -l)
stashpart="${RESETCOLOR}${GRAY}(${GREEN}${stashes}${GRAY} stashed)${RESETCOLOR}"
fi
local stats="$(git_prompt_status "${repodir}")"
PROMPT=${RESETCOLOR}${HOSTCOLOR}$'%n@'${LHOSTNAME}${BLACKCOLOR}':'${PATHCOLOR}"${reponame} ${RED}${branch}${YELLOW}${stats}${BLACKCOLOR}${additional} ${PATHCOLOR}"$'%45<...<'"${repopath}"' %(?..'${BOLDERRORCOLOR}$')%(!.#.$) '${RESETCOLOR}
RPROMPT=${RESETCOLOR}${stashpart}${remotepart}$'%1(j.'${JOBCOLOR}$'[%j].)%(?..'${ERRORCOLOR}$'[%?])'${CLOCKCOLOR}$'[%t]'${RESETCOLOR}
cdpath=( . "$repodir" ~ ~/oktagit ~/git .. )
else
PROMPT=${RESETCOLOR}${HOSTCOLOR}$'%n@'${LHOSTNAME}${BLACKCOLOR}':'${PATHCOLOR}$'%45<...<%~ %(?..'${BOLDERRORCOLOR}$')%(!.#.$) '${RESETCOLOR}
RPROMPT=${RESETCOLOR}$'%1(j.'${JOBCOLOR}$'[%j].)%(?..'${ERRORCOLOR}$'[%?])'${CLOCKCOLOR}$'[%t]'${RESETCOLOR}
cdpath=( . ~ ~/oktagit ~/git .. )
fi
}
updateprompt