Add git information to your ZSH prompt.
update_current_git_vars |
if [ -n "$__EXECUTED_GIT_COMMAND" ]; then | |
update_current_git_vars | |
unset __EXECUTED_GIT_COMMAND | |
fi |
case "$1" in | |
git*) | |
__EXECUTED_GIT_COMMAND=1 | |
;; | |
esac |
if [ -n "$__CURRENT_GIT_BRANCH" ]; then | |
local s="(" | |
s+="$__CURRENT_GIT_BRANCH" | |
case "$__CURRENT_GIT_BRANCH_STATUS" in | |
ahead) | |
s+="↑" | |
;; | |
diverged) | |
s+="↕" | |
;; | |
behind) | |
s+="↓" | |
;; | |
esac | |
if [ -n "$__CURRENT_GIT_BRANCH_IS_DIRTY" ]; then | |
s+="⚡" | |
fi | |
s+=")" | |
printf " %s%s" "%{${fg[yellow]}%}" $s | |
fi |
unset __CURRENT_GIT_BRANCH | |
unset __CURRENT_GIT_BRANCH_STATUS | |
unset __CURRENT_GIT_BRANCH_IS_DIRTY | |
local st="$(git status 2>/dev/null)" | |
if [[ -n "$st" ]]; then | |
local -a arr | |
arr=(${(f)st}) | |
if [[ $arr[1] =~ 'Not currently on any branch.' ]]; then | |
__CURRENT_GIT_BRANCH='no-branch' | |
else | |
__CURRENT_GIT_BRANCH="${arr[1][(w)4]}"; | |
fi | |
if [[ $arr[2] =~ 'Your branch is' ]]; then | |
if [[ $arr[2] =~ 'ahead' ]]; then | |
__CURRENT_GIT_BRANCH_STATUS='ahead' | |
elif [[ $arr[2] =~ 'diverged' ]]; then | |
__CURRENT_GIT_BRANCH_STATUS='diverged' | |
else | |
__CURRENT_GIT_BRANCH_STATUS='behind' | |
fi | |
fi | |
if [[ ! $st =~ 'nothing to commit' ]]; then | |
__CURRENT_GIT_BRANCH_IS_DIRTY='1' | |
fi | |
fi |
# Initialize colors. | |
autoload -U colors | |
colors | |
# Allow for functions in the prompt. | |
setopt PROMPT_SUBST | |
# Autoload zsh functions. | |
fpath=(~/.zsh/functions $fpath) | |
autoload -U ~/.zsh/functions/*(:t) | |
# Enable auto-execution of functions. | |
typeset -ga preexec_functions | |
typeset -ga precmd_functions | |
typeset -ga chpwd_functions | |
# Append git functions needed for prompt. | |
preexec_functions+='preexec_update_git_vars' | |
precmd_functions+='precmd_update_git_vars' | |
chpwd_functions+='chpwd_update_git_vars' | |
# Set the prompt. | |
PROMPT=$'%{${fg[cyan]}%}%B%~%b$(prompt_git_info)%{${fg[default]}%} ' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
line 16 of
update_current_git_vars.sh
will fail to match a diverged repository since the status message in that case is along the lines of "Your branch and origin/master have diverged". Simply removing the word "is" from the match string should take care of that.