Skip to content

Instantly share code, notes, and snippets.

@vilhelmen
Last active June 26, 2016 00:32
Show Gist options
  • Save vilhelmen/d0d7abae17b46997b5c96de1b9349cd1 to your computer and use it in GitHub Desktop.
Save vilhelmen/d0d7abae17b46997b5c96de1b9349cd1 to your computer and use it in GitHub Desktop.
#!/bin/zsh
# see documentation at http://linux.die.net/man/1/zshexpn
# A: finds the absolute path, even if this is symlinked
# h: equivalent to dirname
#local __GIT_PROMPT_DIR=${0:A:h}
local gitstatus="${0:A:h}/gitstatus"
#export GIT_PROMPT_EXECUTABLE=${GIT_PROMPT_USE_PYTHON:-"python"}
# Initialize colors.
#autoload -U colors
#colors
# SOLARIZE OVERRIDE
# Allow for functions in the prompt.
setopt PROMPT_SUBST
autoload -Uz add-zsh-hook
add-zsh-hook chpwd chpwd_update_git_vars
add-zsh-hook preexec preexec_update_git_vars
add-zsh-hook precmd precmd_update_git_vars
## Function definitions
function preexec_update_git_vars() {
case "$2" in
git*|hub*|gh*|stg*)
__EXECUTED_GIT_COMMAND=1
;;
esac
}
function precmd_update_git_vars() {
if [ -n "$__EXECUTED_GIT_COMMAND" ] || [ ! -n "$ZSH_THEME_GIT_PROMPT_CACHE" ]; then
update_current_git_vars
unset __EXECUTED_GIT_COMMAND
fi
}
function chpwd_update_git_vars() {
update_current_git_vars
}
function update_current_git_vars() {
unset __CURRENT_GIT_STATUS
#if [[ "$GIT_PROMPT_EXECUTABLE" == "python" ]]; then
# local gitstatus="$__GIT_PROMPT_DIR/gitstatus.py"
# _GIT_STATUS=`python ${gitstatus} 2>/dev/null`
#fi
#if [[ "$GIT_PROMPT_EXECUTABLE" == "haskell" ]]; then
#local gitstatus="${__GIT_PROMPT_DIR}/gitstatus"
_GIT_STATUS=$(git status --porcelain --branch --ignore-submodules &> /dev/null | ${gitstatus})
#fi
__CURRENT_GIT_STATUS=("${(@s: :)_GIT_STATUS}")
GIT_BRANCH=$__CURRENT_GIT_STATUS[1]
GIT_AHEAD=$__CURRENT_GIT_STATUS[2]
GIT_BEHIND=$__CURRENT_GIT_STATUS[3]
GIT_STAGED=$__CURRENT_GIT_STATUS[4]
GIT_CONFLICTS=$__CURRENT_GIT_STATUS[5]
GIT_CHANGED=$__CURRENT_GIT_STATUS[6]
GIT_UNTRACKED=$__CURRENT_GIT_STATUS[7]
}
git_super_status() {
precmd_update_git_vars
if [ -n "$__CURRENT_GIT_STATUS" ]; then
STATUS="${ZSH_THEME_GIT_PROMPT_PREFIX}${ZSH_THEME_GIT_PROMPT_BRANCH}${GIT_BRANCH}%{${RESET}%}"
if (( GIT_BEHIND != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_BEHIND}${GIT_BEHIND}%{${RESET}%}"
fi
if (( GIT_AHEAD != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_AHEAD}${GIT_AHEAD}%{${RESET}%}"
fi
STATUS+="$ZSH_THEME_GIT_PROMPT_SEPARATOR"
if (( GIT_STAGED != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_STAGED}${GIT_STAGED}%{${RESET}%}"
fi
if (( GIT_CONFLICTS != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_CONFLICTS}${GIT_CONFLICTS}%{${RESET}%}"
fi
if (( GIT_CHANGED != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_CHANGED}${GIT_CHANGED}%{${RESET}%}"
fi
if (( GIT_UNTRACKED != 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_UNTRACKED}%{${RESET}%}"
fi
if (( GIT_CHANGED == 0 )) && (( GIT_CONFLICTS == 0 )) && (( GIT_STAGED == 0 )) && (( GIT_UNTRACKED == 0 )); then
STATUS+="${ZSH_THEME_GIT_PROMPT_CLEAN}"
fi
STATUS+="%{${RESET}%}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
echo "$STATUS"
fi
}
# Default values for the appearance of the prompt. Configure at will.
ZSH_THEME_GIT_PROMPT_PREFIX="["
ZSH_THEME_GIT_PROMPT_SUFFIX="]"
ZSH_THEME_GIT_PROMPT_SEPARATOR="|"
ZSH_THEME_GIT_PROMPT_BRANCH="%{${VIOLET}%}"
ZSH_THEME_GIT_PROMPT_STAGED="%{${CYAN}%}%{•%G%}"
ZSH_THEME_GIT_PROMPT_CONFLICTS="%{${MAGENTA}%}%{×%G%}"
ZSH_THEME_GIT_PROMPT_CHANGED="%{${GREEN}%}%{+%G%}"
ZSH_THEME_GIT_PROMPT_BEHIND="%{${RED}%}%{↓%G%}"
ZSH_THEME_GIT_PROMPT_AHEAD="%{${GREEN}%}%{↑%G%}"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{${BLUE}%}%{…%G%}"
ZSH_THEME_GIT_PROMPT_CLEAN="%{${GREEN}%}%{✔%G%}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment