1 # Setup the prompt with pretty colors
3 autoload colors
; colors
;
6 [[ $(hostname) == "tardis" ]] && hostcolor
=red
9 PROMPT
='%T $(virtualenv_prompt)%n@%{$fg[$hostcolor]%}%m$(jobs_prompt)%-0>..>$(git_prompt_status)%>>
10 %(?..%{$fg_bold[white]%}%?)%{$reset_color%}$(vi_prompt_info)%{%(!.$fg[red]❰.$fg[green]❱)%1G%} '
11 RPROMPT
='%{$fg[green]%}%~%{$reset_color%}'
15 printf '%s' "%(1j. $fg_bold[white]↵%{$fg_bold[red]%}%j.)%{$reset_color%}"
19 local vicmd
="$fg_bold[green]❰$reset_color%1G"
20 local viins
="$fg_bold[blue]❱$reset_color%1G"
21 local map
=${KEYMAP:-viins}
22 printf '%s' "%{${${map/vicmd/$vicmd}/(main|viins)/$viins}%}"
25 function zle
-line-init zle
-line-finish zle
-keymap-select {
30 # zle -N zle-line-init
31 # zle -N zle-line-finish
32 zle
-N zle
-keymap-select
36 zle
&& { zle
reset-prompt; zle
-R }
39 # Get the status of the working tree
41 if ! git
rev-parse --is-inside-work-tree &>/dev
/null
; then
44 local oid
head ahead behind
45 local added deleted modified renamed unmerged untracked dirty
46 # Use porcelain status for easy parsing.
47 local status_cmd
="git status --porcelain=v2 -b"
50 while IFS
=$
'\n' read line
; do
51 if [[ "$line" == \
#\ * ]]; then
52 [[ "$line" =~
'# branch.oid ([0-9a-f]+)' ]] && oid
=$match[1]
53 [[ "$line" =~
'# branch.head (.*)' ]] && head=$match[1]
54 [[ "$line" =~
'# branch.upstream (.*)' ]] && upstream
=$match[1]
55 [[ "$line" =~
'# branch.ab \+([0-9]+) -([0-9]+)' ]] && ahead
=$match[1] && behind
=$match[2]
57 # Count added, deleted, modified, renamed, unmerged, untracked, dirty.
58 # T (type change) is undocumented, see http://git.io/FnpMGw.
60 [[ "$line" == 1\ M
[.MTD
]\
* ]] && (( updated
++ ))
61 [[ "$line" == 1\
[AC
][.MTD
]\
* ]] && (( added
++ ))
62 [[ "$line" == 1\ D
[.MT
]\
* ]] && (( deleted
++ ))
63 [[ "$line" == 2\ R
[.MTD
]\
* ]] && (( renamed
++ ))
66 [[ "$line" == 1\
[.MARCT
]A\
* ]] && (( added
++ , modified
++ )) # intend-to-add
67 [[ "$line" == 1\
[.MARCT
]M\
* ]] && (( modified
++ ))
68 [[ "$line" == 1\
[.MARCT
]D\
* ]] && (( deleted_wt
++ ))
69 [[ "$line" == \?\
* ]] && (( untracked
++ ))
72 [[ "$line" == u\
(AA
|DD
|U?
|?U
)\
* ]] && (( unmerged
++ ))
74 done < <(${(z)status_cmd} 2> /dev
/null
)
76 local git_status
=" %{$fg_bold[green]%}"
78 # Format branch and commit
79 git_status
+="$head%{$fg_no_bold[yellow]%}(${oid[1,8]})"
83 [[ -z "$upstream" ]] && upstream_str
+="%{$fg[blue]%} Ɇ"
84 (( ahead
> 0 )) && upstream_str
+="%{$fg[blue]%} >$ahead"
85 (( behind
> 0 )) && upstream_str
+="%{$fg[blue]%} <$behind"
86 git_status
+="$upstream_str"
89 push_ab
=( $(git rev-list --left-right --count @...@{push} 2>/dev/null) )
90 if (( $?
== 0 )); then
91 (( push_ab
[1] > 0 )) && git_status
+="%{$fg_bold[blue]%} ⮝$push_ab[1]"
92 (( push_ab
[2] > 0 )) && git_status
+="%{$fg_bold[blue]%} ⮟$push_ab[2]"
96 stashed
=$(git stash list | wc -l)
97 if (( stashed
> 0 )) then
98 stashed_str
+="%{$fg_bold[cyan]%} ⋎$stashed%{$reset_color%}"
100 git_status
+="$stashed_str"
104 (( updated
> 0 )) && index_str
+="%{$fg[green]%} *$updated"
105 (( added
> 0 )) && index_str
+="%{$fg[green]%} +$added"
106 (( deleted
> 0 )) && index_str
+="%{$fg[green]%} -$deleted"
107 (( renamed
> 0 )) && index_str
+="%{$fg[green]%} ≈$renamed"
108 git_status
+="$index_str"
110 # Format working tree
112 (( modified
> 0 )) && wt_str
+="%{$fg[red]%} *$modified"
113 (( deleted_wt
> 0 )) && wt_str
+="%{$fg[red]%} -$deleted_wt"
114 (( untracked
> 0 )) && wt_str
+="%{$fg[red]%} +$untracked"
115 (( unmerged
> 0 )) && wt_str
+="%{$fg[magenta]%} ♒$unmerged"
116 git_status
+="$wt_str"
118 git_status
+="%{$reset_color%}"
123 function virtualenv_prompt
() {
124 if [[ -z $VIRTUAL_ENV ]] then
127 echo "(${VIRTUAL_ENV##*/}) "
131 function print_if_fits
() {
134 zero
='%([BSUbfksu]|([FB]|){*})'
135 length
=${#${(S%%)1//$~zero/}}
136 echo "%-$length(l.$1.)"