]> git.donarmstrong.com Git - zsh.git/blob - .zsh/zshrc/85_vcs_prompt
correct aliases for zcp and zln
[zsh.git] / .zsh / zshrc / 85_vcs_prompt
1 # zshrc/85_git_prompt
2 #
3 # Make git information available to the prompt
4 #
5 # Copyright © 1994–2008 martin f. krafft <madduck@madduck.net>
6 # Released under the terms of the Artistic Licence 2.0
7 #
8 # Source repository: http://git.madduck.net/v/etc/zsh.git
9 #
10 # Shamelessly based on http://glandium.org/blog/?p=170
11 #
12
13 __git_get_repo_root()
14 {
15   local relroot
16   relroot="$(git rev-parse --show-cdup 2>/dev/null)" || return 1
17   if [ -n "$relroot" ]; then
18     readlink -f "$relroot"
19   else
20     echo $PWD
21   fi
22 }
23
24 __git_get_branch()
25 {
26   local ref
27   ref=$(git symbolic-ref -q HEAD 2>/dev/null \
28      || git-name-rev --name-only HEAD 2>/dev/null)
29   echo "${ref#refs/heads/}"
30 }
31
32 __get_root_offsets()
33 {
34   local pwda reporoot loc
35   pwda=(${(s:/:)PWD})
36   reporoot=(${(s:/:)1})
37   echo $((1 - $#reporoot)) $(($#pwda - $#reporoot))
38 }
39
40 __get_prompt_path_components()
41 {
42   local reporoot
43   reporoot="$1"
44
45   set -- $(__get_root_offsets "$reporoot")
46   if [ "$2" -le 0 ]; then
47     echo %~
48   else
49     echo "%${1}~" "%${2}~"
50   fi
51 }
52
53 __vcs_get_repo_type()
54 {
55   if __git_get_repo_root >/dev/null; then
56     echo git
57   else
58     echo NONE
59   fi
60 }
61
62 __vcs_set_prompt_variables()
63 {
64   local pre branch post
65   local MAXLEN=25
66
67   case "${1:-$(__vcs_get_repo_type)}" in
68     git)
69       local reporoot="$(__git_get_repo_root)"
70       set -- $(__get_prompt_path_components "$reporoot")
71       branch="$(__git_get_branch)"
72       post="${(%)2}"
73       local prelen="$((MAXLEN - $#post - $#branch))"
74       [ $prelen -lt 10 ] && prelen=10
75       pre="%${prelen}<..<${1}%<<"
76       pre="${(%)pre}"
77       ;;
78     *)
79       local p="%${MAXLEN}<..<%~%<<"
80       #TODO find a better way so we don't have to nuke $psvar, but since the
81       #     %(nv.true.false) check for prompts checks element count, not
82       #     content, that's all we get for now
83       psvar=("${(%)p}")
84       return
85   esac
86
87   psvar[1]="$pre"
88   psvar[2]="$branch"
89   psvar[3]="$post"
90 }
91
92 if ! is_root; then
93   # too dangerous to be run as root
94
95   _update_vcs_prompt_vars_if_vcs_ran() {
96     local vcs="$(__vcs_get_repo_type)"
97     case "$(history $(($HISTCMD - 1)))" in
98       # $vcs appeared in last command, so be sure to update
99       *${vcs}*) __vcs_set_prompt_variables
100     esac
101   }
102   precmd_functions+=_update_vcs_prompt_vars_if_vcs_ran
103
104   _update_vcs_prompt_vars() {
105     __vcs_set_prompt_variables
106   }
107   chpwd_functions+=_update_vcs_prompt_vars
108
109   # call it once
110   _update_vcs_prompt_vars
111 fi
112
113 # vim:ft=zsh