-
-
Save tonylegrone/786b0e9c1b36e4aabf57 to your computer and use it in GitHub Desktop.
My Git prompt for zsh.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Adapted from code found at <https://gist.github.com/1712320>. | |
setopt prompt_subst | |
autoload -U colors && colors # Enable colors in prompt | |
# Modify the colors and symbols in these variables as desired. | |
GIT_PROMPT_SYMBOL="%{$fg[blue]%}±" | |
GIT_PROMPT_PREFIX="" | |
GIT_PROMPT_SUFFIX="" | |
GIT_PROMPT_AHEAD="%{$fg[red]%}ANUM%{$reset_color%}" | |
GIT_PROMPT_BEHIND="%{$fg[cyan]%}BNUM%{$reset_color%}" | |
GIT_PROMPT_MERGING="%{$fg_bold[magenta]%}⚡︎%{$reset_color%}" | |
GIT_PROMPT_UNTRACKED="%{$fg[cyan]%}+%{$reset_color%}" | |
GIT_PROMPT_MODIFIED="%{$fg[yellow]%}*%{$reset_color%}" | |
GIT_PROMPT_DELETED="%{$fg[red]%}-%{$reset_color%}" | |
GIT_PROMPT_STAGED="%{$fg[green]%}●%{$reset_color%}" | |
# Show Git branch/tag, or name-rev if on detached head | |
parse_git_branch() { | |
(git symbolic-ref -q HEAD || git name-rev --name-only --no-undefined --always HEAD) 2> /dev/null | |
} | |
# Show different symbols as appropriate for various Git repository states | |
parse_git_state() { | |
# Compose this value via multiple conditional appends. | |
local GIT_STATE="" | |
local NUM_AHEAD="$(git log --oneline @{u}.. 2> /dev/null | wc -l | tr -d ' ')" | |
if [ "$NUM_AHEAD" -gt 0 ]; then | |
GIT_STATE=$GIT_STATE${GIT_PROMPT_AHEAD//NUM/$NUM_AHEAD} | |
fi | |
local NUM_BEHIND="$(git log --oneline ..@{u} 2> /dev/null | wc -l | tr -d ' ')" | |
if [ "$NUM_BEHIND" -gt 0 ]; then | |
GIT_STATE=$GIT_STATE${GIT_PROMPT_BEHIND//NUM/$NUM_BEHIND} | |
fi | |
local GIT_DIR="$(git rev-parse --git-dir 2> /dev/null)" | |
if [ -n $GIT_DIR ] && test -r $GIT_DIR/MERGE_HEAD; then | |
GIT_STATE=$GIT_STATE$GIT_PROMPT_MERGING | |
fi | |
if [[ -n $(git status | ag -w Untracked 2> /dev/null) ]]; then | |
GIT_STATE=$GIT_STATE$GIT_PROMPT_UNTRACKED | |
fi | |
if ! git diff --quiet 2> /dev/null; then | |
GIT_STATE=$GIT_STATE$GIT_PROMPT_MODIFIED | |
fi | |
if [[ -n $(git diff --name-status | ag -w D 2> /dev/null) ]]; then | |
GIT_STATE=$GIT_STATE$GIT_PROMPT_DELETED | |
fi | |
if ! git diff --cached --quiet 2> /dev/null; then | |
GIT_STATE=$GIT_STATE$GIT_PROMPT_STAGED | |
fi | |
if [[ -n $GIT_STATE ]]; then | |
echo " $GIT_PROMPT_PREFIX$GIT_STATE$GIT_PROMPT_SUFFIX" | |
fi | |
} | |
# If inside a Git repository, print its branch and state | |
git_prompt_string() { | |
local git_where="$(parse_git_branch)" | |
[ -n "$git_where" ] && echo "%{$fg[magenta]%}${git_where#(refs/heads/|tags/)}%{$reset_color%}$(parse_git_state)" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment