# 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="%{$fg[green]%}[%{$reset_color%}" | |
GIT_PROMPT_SUFFIX="%{$fg[green]%}]%{$reset_color%}" | |
GIT_PROMPT_AHEAD="%{$fg[red]%}ANUM%{$reset_color%}" | |
GIT_PROMPT_BEHIND="%{$fg[cyan]%}BNUM%{$reset_color%}" | |
GIT_PROMPT_MERGING="%{$fg[magenta]%}⚡︎%{$reset_color%}" | |
GIT_PROMPT_UNTRACKED="%{$fg[red]%}●%{$reset_color%}" | |
GIT_PROMPT_MODIFIED="%{$fg[yellow]%}●%{$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 ls-files --other --exclude-standard 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 ! 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 "$GIT_PROMPT_SYMBOL$(parse_git_state)$GIT_PROMPT_PREFIX%{$fg[yellow]%}${git_where#(refs/heads/|tags/)}$GIT_PROMPT_SUFFIX" | |
} | |
# Set the right-hand prompt | |
RPS1='$(git_prompt_string)' |
This comment has been minimized.
This comment has been minimized.
Very nice, thank you! |
This comment has been minimized.
This comment has been minimized.
I just forked it and added some code to check and see if you're not on any branch and to color the branch red if so; but I haven't much idea how these gists work... |
This comment has been minimized.
This comment has been minimized.
Apologies for the four months of silence, somehow I wasn't subscribed to notifications for my own Gist! |
This comment has been minimized.
This comment has been minimized.
@zanshin For me, the prompt string is properly cleared for me when I switch to a non-Git directory. How are you including the prompt in your .zshrc? You should be sourcing it:
|
This comment has been minimized.
This comment has been minimized.
@massysett Glad you like it! |
This comment has been minimized.
This comment has been minimized.
@joshdick When you say to source it in your .zshrc; what do you mean, exactly? Thanks! |
This comment has been minimized.
This comment has been minimized.
say if you downloaded this prompt and called it git-prompt.zsh and put it in your home folder ~/. sourcing it in your .zshrc would be.
|
This comment has been minimized.
This comment has been minimized.
This is terrific -- thank you! |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Nice. The only bad thing about it is that the repos I'm working with are enormous, so this introduces a noticeable lag (like 2 seconds) every time I press enter (because git status is slow) :( |
This comment has been minimized.
This comment has been minimized.
Very nice, don't suppose it could be made available for install via homebrew on OS X? |
This comment has been minimized.
This comment has been minimized.
It has been a while, but I made some cosmetic tweaks and code cleanup to this prompt. Details here. |
This comment has been minimized.
I like this approach to displaying git information in the prompt. However, when I implement this in my .zshrc the git_promtp_string is not getting cleared when I change to a non-git directory. I have to re-source the ~/.zshrc file to cause that to happen. Are you seeing that behavior in your implementation?