#!/bin/zsh # vcs-info config # # Partly based on Seth House's zsh promp autoload -Uz vcs_info # Set up VCS_INFO zstyle ':vcs_info:*' enable git hg svn zstyle ':vcs_info:(hg*|git*):*' get-revision true zstyle ':vcs_info:(hg*|git*):*' check-for-changes true zstyle ':vcs_info:hg*' formats "(%s)[%i%u %b %m]" # rev+changes branch misc zstyle ':vcs_info:hg*' actionformats "(%s|${white}%a${rpscolor})[%i%u %b %m]" zstyle ':vcs_info:hg*:netbeans' use-simple true zstyle ':vcs_info:hg*:*' get-bookmarks true zstyle ':vcs_info:hg*:*' get-mq true zstyle ':vcs_info:hg*:*' get-unapplied true zstyle ':vcs_info:hg*:*' patch-format "mq(%g):%n/%c %p" zstyle ':vcs_info:hg*:*' nopatch-format "mq(%g):%n/%c %p" zstyle ':vcs_info:hg*:*' hgrevformat "%r" # only show local rev. zstyle ':vcs_info:hg*:*' branchformat "%b" # only show branch zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b$vcs_revision:%f%r%f" if [[ -z $(git ls-files --other --exclude-standard 2> /dev/null) ]] { zstyle ':vcs_info:git*' formats "(%s) %12.12i %c%u %b%m" # hash changes branch misc zstyle ':vcs_info:git*' actionformats "(%s|${white}%a${rpscolor}) %12.12i %c%u %b%m" } else { zstyle ':vcs_info:git*' formats "(%s) %12.12i %c%u${gituntracked} %b%m" # hash changes branch misc zstyle ':vcs_info:git*' actionformats "(%s|${white}%a${rpscolor}) %12.12i %c%u %b%m" } zstyle ':vcs_info:*' stagedstr "$gitstaged●$rpscolor" zstyle ':vcs_info:*' unstagedstr "$gitdirty●$rpscolor" # zstyle ':vcs_info:hg:*:-all-' command fakehg # zstyle ':vcs_info:*+*:*' debug true zstyle ':vcs_info:hg*+set-hgrev-format:*' hooks hg-hashfallback zstyle ':vcs_info:hg*+set-message:*' hooks mq-vcs zstyle ':vcs_info:git*+set-message:*' hooks git-st git-stash zstyle ':vcs_info:*+pre-get-data:*' hooks vcs-detect disable_pattern=() for i in $MPATH/filter/*; do filter="$(readlink -f $i)(|/*)" disable_pattern=("${disable_pattern[@]}" "$filter"); done zstyle ':vcs_info:*' disable-patterns "${disable_pattern[@]}" +vi-vcs-detect() { export VCS_DETECTED=$vcs } function vcs_char { case $VCS_DETECTED in git) echo '±';; hg) echo '☿';; svn) echo '☣';; *) echo '#';; esac } exitstatus () { local exitstatus=$? if [ $exitstatus -ne 0 ] ; then if [ $exitstatus -gt 128 -a $exitstatus -lt 163 ] ; then echo "${SIG_PROMPT_PREFIX}SIG$signals[$exitstatus-127]${SIG_PROMPT_SUFFIX}" else echo "${SIG_PROMPT_PREFIX}${exitstatus}${SIG_PROMPT_SUFFIX}" fi fi } ### Dynamically set hgrevformat based on if the local rev is available # We don't always know the local revision, e.g. if use-simple is set # Truncate long hash to 12-chars but also allow for multiple parents function +vi-hg-hashfallback() { if [[ -z ${hook_com[localrev]} ]] ; then local -a parents parents=( ${(s:+:)hook_com[hash]} ) parents=( ${(@r:12:)parents} ) hook_com[rev-replace]="${(j:+:)parents}" ret=1 fi } # Show remote ref name and number of commits ahead-of or behind function +vi-git-st() { local ahead behind remote local -a gitstatus # Are we on a remote-tracking branch? remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} \ --symbolic-full-name --abbrev-ref 2>/dev/null)} if [[ -n ${remote} ]] ; then # for git prior to 1.7 # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) (( $ahead )) && gitstatus+=( "${gitstaged}+${ahead}${rpscolor}" ) # for git prior to 1.7 # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) (( $behind )) && gitstatus+=( "${gitdirty}-${behind}${rpscolor}" ) hook_com[branch]="${hook_com[branch]} [ ${remote}${gitstatus:+ }${gitstatus} ]" fi } # Show count of stashed changes function +vi-git-stash() { local -a stashes if [[ -s ${hook_com[base]}/.git/refs/stash ]] ; then stashes=$(git stash list 2>/dev/null | wc -l) hook_com[misc]+=" (${stashes} stashed)" fi }