-
Notifications
You must be signed in to change notification settings - Fork 2
/
prompt_efgit_setup
114 lines (87 loc) · 2.5 KB
/
prompt_efgit_setup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env zsh
prompt_efgit_status() {
git rev-parse --git-dir >&- 2>&- || {
echo -n $'\0'
return
}
local -a parts
local fd line head ahead behind conflicts staged changed untracked
exec {fd}< <(git status --porcelain=v2 --branch)
while read -A -u $fd line; do
case "$line" in
'# branch.head'*) # Current branch
head="$line[3]"
[[ $head == "(detached)" ]] && head="$(echo ":$(git rev-parse --short HEAD)")"
;;
'# branch.ab'*) # Divergence from upstream
ahead="${line[3]/#+}"
behind="${line[4]/#-}"
;;
(1|2)*) # Modified or renamed/copied
[[ "${${line[2]}[1]}" != "." ]] && ((staged++))
[[ "${${line[2]}[2]}" != "." ]] && ((changed++))
;;
'u'*) # Unmerged
((conflicts++))
;;
'?'*) # Untracked
((untracked++))
;;
esac
done
exec {fd}<&-
parts+="%F{8}$head%f"
local -a upstream_divergence
[[ $ahead > 0 ]] && upstream_divergence+="%F{blue}↑$ahead%f"
[[ $behind > 0 ]] && upstream_divergence+="%F{blue}↓$behind%f"
if [[ $#upstream_divergence > 0 ]]; then
parts+="${(j::)upstream_divergence}"
fi
local -a working_info
[[ $conflicts > 0 ]] && working_info+="%F{red}×$conflicts%f"
[[ $staged > 0 ]] && working_info+="%F{green}●$staged%f"
[[ $changed > 0 ]] && working_info+="%F{208}✻$changed%f"
[[ $untracked > 0 ]] && working_info+="%F{red}+$untracked%f"
if [[ $#working_info > 0 ]]; then
parts+="${(j::)working_info}"
else
parts+="%F{green}✔%f"
fi
echo -n "${(j: :)parts}"
}
prompt_efgit_define_prompt() {
setopt localoptions extendedglob
local -a parts=()
# Abbreviated current working directory
parts+="%F{blue}${${PWD/#$HOME/~}//(#b)([^\/])[^\/][^\/]#\//$match[1]/}%f"
# Git info (loaded async)
if [[ "$1" != $'\0' ]] then
if [[ -n "$1" ]]; then
parts+="$1"
else
parts+="..."
fi
fi
# Prompt arrow (red for non-zero status)
parts+="%(?.%F{8}.%F{red})❯%f"
PROMPT=" ${(j: :)parts} "
}
prompt_efgit_response() {
typeset -g _prompt_efgit_fd
prompt_efgit_define_prompt "$(<&$1)"
zle reset-prompt
zle -F $1
exec {1}<&-
unset _prompt_efgit_fd
}
prompt_efgit_precmd() {
typeset -g _prompt_efgit_fd
prompt_efgit_define_prompt
[[ -n $_prompt_efgit_fd ]] && {
zle -F $_prompt_efgit_fd
exec {_prompt_efgit_fd}<&-
}
exec {_prompt_efgit_fd}< <(prompt_efgit_status)
zle -F $_prompt_efgit_fd prompt_efgit_response
}
add-zsh-hook precmd prompt_efgit_precmd