irongit
dotfiles/oh-my-zsh/themes/antares.zsh-theme
391 lines12 KB
1
2###
3### You can re-define the following variables in your .zshrc file
4### in order to customize the appearance of the prompt
5###
6
7# The indentation of the rprompt
8ZLE_RPROMPT_INDENT=${ZLE_RPROMPT_INDENT:-0}
9
10# Whether to use oh-my-zsh's git-prompt plugin
11# or the builtin logic written in this file
12ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT=""
13
14# Whether to gather additional details about the git status
15# This option only applies when using the builtin logic
16# Usefull when dealing with huge repositories to speed things up
17ZSH_ANTARES_USE_LIGHT_GIT_MODE=""
18
19# The colors to use for the various elements of the prompt
20ZSH_ANTARES_FG_EXECTIME="#dd00ff"
21ZSH_ANTARES_FG_ERRVAL="#c31a1a"
22ZSH_ANTARES_FG_DECO="#ffffff"
23ZSH_ANTARES_FG_PWD_OK="#ffffff"
24ZSH_ANTARES_BG_PWD_OK="#0055ff"
25ZSH_ANTARES_FG_PWD_ERR="#ffffff"
26ZSH_ANTARES_BG_PWD_ERR="#c31a1a"
27ZSH_ANTARES_FG_GIT_INIT="#000000"
28ZSH_ANTARES_BG_GIT_INIT="#b5f3a1"
29ZSH_ANTARES_FG_GIT_BARE="#000000"
30ZSH_ANTARES_BG_GIT_BARE="#b07a4e"
31ZSH_ANTARES_FG_GIT_BRANCH="#000000"
32ZSH_ANTARES_BG_GIT_BRANCH="#47cc2b"
33ZSH_ANTARES_FG_GIT_DETACH="#000000"
34ZSH_ANTARES_BG_GIT_DETACH="#eeaa22"
35ZSH_ANTARES_FG_GIT_CONFLICT="#000000"
36ZSH_ANTARES_BG_GIT_CONFLICT="#c31a1a"
37ZSH_ANTARES_FG_GIT_AHEAD="#cfcfcf"
38ZSH_ANTARES_FG_GIT_BEHIND="#9f9f9f"
39ZSH_ANTARES_FG_GIT_STAGED="#6cc6ee"
40ZSH_ANTARES_FG_GIT_ADDED="#04c304"
41ZSH_ANTARES_FG_GIT_DELETED="#e7165a"
42ZSH_ANTARES_FG_GIT_CHANGED="#ee9931"
43ZSH_ANTARES_FG_GIT_CONFLICTS="#ff0000"
44ZSH_ANTARES_FG_GIT_UNTRACKED="#bbffff"
45ZSH_ANTARES_FG_GIT_STASHED="#eaa0ff"
46ZSH_ANTARES_FG_GIT_TAG="#ffffff"
47ZSH_ANTARES_FG_JOBS="#9f9f9f"
48ZSH_ANTARES_FG_PRIVILEDGES="#ffdd44"
49
50# The characters (or strings, by will) to use for some of the elements
51ZSH_ANTARES_STR_GIT_BARE="⛁"
52ZSH_ANTARES_STR_GIT_AHEAD="↑"
53ZSH_ANTARES_STR_GIT_BEHIND="↓"
54ZSH_ANTARES_STR_GIT_STAGED="●"
55ZSH_ANTARES_STR_GIT_ADDED="✚"
56ZSH_ANTARES_STR_GIT_DELETED="━"
57ZSH_ANTARES_STR_GIT_CHANGED="✱"
58ZSH_ANTARES_STR_GIT_CONFLICTS="✖"
59ZSH_ANTARES_STR_GIT_UNTRACKED="❍"
60ZSH_ANTARES_STR_GIT_STASHED="⚑"
61ZSH_ANTARES_STR_GIT_TAG="🏲"
62ZSH_ANTARES_STR_JOBS="⚙"
63ZSH_ANTARES_STR_ROOT="#"
64ZSH_ANTARES_STR_USER="$"
65
66# The path expansion to use to display the pwd
67ZSH_ANTARES_PATHVAR='%~'
68
69# The minimum amount of time (in seconds) a command shall take to complete
70# in order to display the execution time in the prompt
71ZSH_ANTARES_MIN_EXEC_TIME=0
72
73# The control character used to insert a new line
74# You shouldn't edit this variable, but if you really want to...
75ZSH_ANTARES_LINEFEED=$'\n'
76
77###
78### End of the re-definable section
79###
80
81
82antares_update_git_status()
83{
84 ZSH_ANTARES_GIT_STATUS=""
85 ZSH_ANTARES_GIT_IN_WORKING_TREE=0
86 ZSH_ANTARES_GIT_IS_INIT_REPO=0
87 ZSH_ANTARES_GIT_IS_BARE_REPO=0
88 ZSH_ANTARES_GIT_IS_DETACHED_HEAD=0
89 ZSH_ANTARES_GIT_HAS_CONFLICTS=0
90 ZSH_ANTARES_GIT_HAS_TAGS=0
91 ZSH_ANTARES_GIT_TAG=""
92
93 if ( $(git rev-parse --is-inside-work-tree 1>/dev/null 2>/dev/null) )
94 then
95 ZSH_ANTARES_GIT_IN_WORKING_TREE=1
96 private branch_name="$(git branch --show-current)"
97 if [ -n "$branch_name" ]
98 then
99 if [ -z "$ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT" ]
100 then
101 GIT_BRANCH="$branch_name"
102 fi
103 if ( ! $(git rev-parse --verify HEAD 1>/dev/null 2>/dev/null) )
104 then
105 ZSH_ANTARES_GIT_IS_INIT_REPO=1
106 fi
107 if [ $(git rev-parse --is-bare-repository) = "true" ]
108 then
109 ZSH_ANTARES_GIT_IS_BARE_REPO=1
110 GIT_BRANCH="$ZSH_ANTARES_STR_GIT_BARE"
111 fi
112 else
113 ZSH_ANTARES_GIT_IS_DETACHED_HEAD=1
114 if [ -z "$ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT" ]
115 then
116 GIT_BRANCH="$(git rev-parse --short HEAD)"
117 if [ -z "$ZSH_ANTARES_USE_LIGHT_GIT_MODE" ]
118 then
119 private git_tag="$(git tag --points-at=HEAD)"
120 if [ -n "$git_tag" ]
121 then
122 ZSH_ANTARES_GIT_HAS_TAGS=1
123 private n_tags="$(echo "$git_tag" | wc -l)"
124 if (( n_tags == 1 ))
125 then
126 ZSH_ANTARES_GIT_TAG=" $ZSH_ANTARES_STR_GIT_TAG $git_tag"
127 elif (( n_tags > 1 ))
128 then
129 ZSH_ANTARES_GIT_TAG=" $ZSH_ANTARES_STR_GIT_TAG $n_tags"
130 else
131 fi
132 fi
133 fi
134 fi
135 fi
136 else
137 antares_reset_git_info
138 return
139 fi
140
141 if (( ZSH_ANTARES_GIT_IS_BARE_REPO ))
142 then
143 antares_reset_git_counts
144 GIT_AHEAD=$(git rev-list --left-only HEAD..FETCH_HEAD --count)
145 GIT_BEHIND=$(git rev-list --right-only HEAD..FETCH_HEAD --count)
146 return
147 fi
148
149 if [ -n "$ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT" ]
150 then
151 GIT_ADDED=0
152 elif [ -n "$ZSH_ANTARES_USE_LIGHT_GIT_MODE" ]
153 then
154 antares_reset_git_counts
155 return
156 else
157 private git_status="$(git status -sb)"
158 if [ -n "$git_status" ]
159 then
160 GIT_STAGED=$(echo $git_status | grep '^[AMD]. ' | wc -l)
161 GIT_ADDED=$(echo $git_status | grep '^A ' | wc -l)
162 GIT_DELETED=$(echo $git_status | grep -E '^(D |.D) ' | wc -l)
163 GIT_CHANGED=$(echo $git_status | grep -E '^(M |.M) ' | wc -l)
164 GIT_CONFLICTS=$(echo $git_status | grep '^U. ' | wc -l)
165 GIT_UNTRACKED=$(echo $git_status | grep '^?? ' | wc -l)
166 GIT_STASHED=$(git stash list | wc -l)
167 if (( ZSH_ANTARES_GIT_IS_DETACHED_HEAD ))
168 then
169 GIT_AHEAD=0
170 GIT_BEHIND=0
171 elif (( ! ZSH_ANTARES_GIT_IS_INIT_REPO ))
172 then
173 private left_right=$(echo $git_status | grep '^## ' | cut -d" " -f2)
174 GIT_AHEAD=$(git rev-list --left-only $left_right --count)
175 GIT_BEHIND=$(git rev-list --right-only $left_right --count)
176 fi
177 fi
178 fi
179
180 ZSH_ANTARES_GIT_HAS_CONFLICTS=$(( GIT_CONFLICTS > 0 ))
181}
182
183antares_reset_git_info()
184{
185 if [ -z "$ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT" ]
186 then
187 GIT_BRANCH=""
188 fi
189 antares_reset_git_counts
190}
191antares_reset_git_counts()
192{
193 if [ -n "$ZSH_ANTARES_USE_OHMYZSH_GIT_PROMPT" ]
194 then
195 GIT_ADDED=0
196 else
197 GIT_AHEAD=0
198 GIT_BEHIND=0
199 GIT_STAGED=0
200 GIT_ADDED=0
201 GIT_DELETED=0
202 GIT_CHANGED=0
203 GIT_CONFLICTS=0
204 GIT_UNTRACKED=0
205 GIT_STASHED=0
206 fi
207}
208
209antares_update_prompt()
210{
211 ZSH_ANTARES_RETURN=""
212 if [ -n "$ZSH_ANTARES_EXEC_FLAG" ]
213 then
214 if (( ZSH_ANTARES_MIN_EXEC_TIME >= 0 ))
215 then
216 private exec_time=$(( SECONDS - ZSH_ANTARES_EXEC_START ))
217 if (( exec_time >= ZSH_ANTARES_MIN_EXEC_TIME ))
218 then
219 ZSH_ANTARES_RETURN+="%F{$ZSH_ANTARES_FG_EXECTIME}%B⤷%b $exec_time%f"
220 fi
221 fi
222 if [[ "$ZSH_ANTARES_ERR_CODE" != "0" ]]
223 then
224 if [ -z "$ZSH_ANTARES_RETURN" ]
225 then
226 ZSH_ANTARES_RETURN+="%F{$ZSH_ANTARES_FG_ERRVAL}%B⤷%b%f"
227 fi
228 ZSH_ANTARES_RETURN+=" %F{$ZSH_ANTARES_FG_ERRVAL}✘%B${ZSH_ANTARES_ERR_CODE}%b%f"
229 fi
230 [ -n "$ZSH_ANTARES_RETURN" ] && ZSH_ANTARES_RETURN+="$ZSH_ANTARES_LINEFEED"
231 fi
232
233 ZSH_ANTARES_FILLER=""
234 private fillchar=" "
235
236 private width=$(( COLUMNS - ${ZLE_RPROMPT_INDENT:-1} ))
237
238 private decosize=7
239 private pwdsize=${#${(%):-$ZSH_ANTARES_PATHVAR}}
240 private pwdcut=""
241 private gitsize=${#${(%):-$GIT_BRANCH$ZSH_ANTARES_GIT_TAG}}
242 private gitcut=""
243
244 if (( pwdsize + gitsize + (decosize * 2) > width )); then
245 private half_width=$(( width / 2 ))
246 private pwd_over_half=$(( (pwdsize + decosize) > half_width ))
247 private git_over_half=$(( (gitsize + decosize) > half_width ))
248 if (( pwd_over_half > 0 )) && (( git_over_half > 0 ))
249 then
250 (( pwdcut = half_width - decosize ))
251 (( gitcut = half_width - decosize ))
252 elif (( pwd_over_half > 0 ))
253 then
254 (( pwdcut = width - gitsize - (decosize * 2) ))
255 ZSH_ANTARES_FILLER="\${(l:$(( width - pwdcut - gitsize - (decosize * 2) ))::$fillchar:)}"
256 elif (( git_over_half > 0 ))
257 then
258 (( gitcut = width - pwdsize - (decosize * 2) ))
259 ZSH_ANTARES_FILLER="\${(l:$(( width - pwdsize - gitcut - (decosize * 2) ))::$fillchar:)}"
260 else
261 ZSH_ANTARES_FILLER="\${(l:$(( width - pwdsize - gitsize - (decosize * 2) ))::$fillchar:)}"
262 fi
263 else
264 ZSH_ANTARES_FILLER="\${(l:$(( width - pwdsize - gitsize - (decosize * 2) ))::$fillchar:)}"
265 fi
266
267 if [ -n "$ZSH_ANTARES_EXEC_FLAG" ]
268 then
269 private pwd_fg_color="%(?.${ZSH_ANTARES_FG_PWD_OK}.${ZSH_ANTARES_FG_PWD_ERR})"
270 private pwd_bg_color="%(?.${ZSH_ANTARES_BG_PWD_OK}.${ZSH_ANTARES_BG_PWD_ERR})"
271 else
272 private pwd_fg_color="$ZSH_ANTARES_FG_PWD_OK"
273 private pwd_bg_color="$ZSH_ANTARES_BG_PWD_OK"
274 fi
275 ZSH_ANTARES_PWD="%K{$pwd_bg_color}%F{$pwd_fg_color} %${pwdcut}<...<${ZSH_ANTARES_PATHVAR}%<< %f%k%F{$pwd_bg_color}▓▒░%f"
276
277 ZSH_ANTARES_GIT_BRANCH=""
278 if (( ZSH_ANTARES_GIT_IN_WORKING_TREE ))
279 then
280 if (( ZSH_ANTARES_GIT_HAS_CONFLICTS ))
281 then
282 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_BG_GIT_CONFLICT}░▒▓%f%K{$ZSH_ANTARES_BG_GIT_CONFLICT}%F{$ZSH_ANTARES_FG_GIT_CONFLICT}"
283 elif (( ZSH_ANTARES_GIT_IS_DETACHED_HEAD ))
284 then
285 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_BG_GIT_DETACH}░▒▓%f%K{$ZSH_ANTARES_BG_GIT_DETACH}%F{$ZSH_ANTARES_FG_GIT_DETACH}"
286 if (( ZSH_ANTARES_GIT_HAS_TAGS ))
287 then
288 GIT_BRANCH+="%F{$ZSH_ANTARES_FG_GIT_TAG}${ZSH_ANTARES_GIT_TAG}%f"
289 fi
290 elif (( ZSH_ANTARES_GIT_IS_BARE_REPO ))
291 then
292 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_BG_GIT_BARE}░▒▓%f%K{$ZSH_ANTARES_BG_GIT_BARE}%F{$ZSH_ANTARES_FG_GIT_BARE}"
293 elif (( ZSH_ANTARES_GIT_IS_INIT_REPO ))
294 then
295 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_BG_GIT_INIT}░▒▓%f%K{$ZSH_ANTARES_BG_GIT_INIT}%F{$ZSH_ANTARES_FG_GIT_INIT}"
296 else
297 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_BG_GIT_BRANCH}░▒▓%f%K{$ZSH_ANTARES_BG_GIT_BRANCH}%F{$ZSH_ANTARES_FG_GIT_BRANCH}"
298 fi
299 ZSH_ANTARES_GIT_BRANCH+=" %${gitcut}>...>$GIT_BRANCH%>> %f%k"
300 if [ -n "$ZSH_ANTARES_USE_LIGHT_GIT_MODE" ]
301 then
302 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_FG_DECO}├╼%f"
303 else
304 ZSH_ANTARES_GIT_BRANCH+="%F{$ZSH_ANTARES_FG_DECO}├╮%f"
305 fi
306 fi
307
308 ZSH_ANTARES_JOBS="%(1j.%F{$ZSH_ANTARES_FG_JOBS}${ZSH_ANTARES_STR_JOBS}%j%f .)"
309
310 ZSH_ANTARES_PRIVILEDGES="%F{$ZSH_ANTARES_FG_PRIVILEDGES}%B%(!.${ZSH_ANTARES_STR_ROOT}.${ZSH_ANTARES_STR_USER})%b%f"
311}
312
313antares_update_rprompt()
314{
315 ZSH_ANTARES_GIT_STATUS=""
316
317 [ -n "$ZSH_ANTARES_USE_LIGHT_GIT_MODE" ] && return
318
319 (( ZSH_ANTARES_GIT_IN_WORKING_TREE )) || return
320
321 if (( GIT_CONFLICTS > 0 ))
322 then
323 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_CONFLICTS}${ZSH_ANTARES_STR_GIT_CONFLICTS}${GIT_CONFLICTS}%f"
324 fi
325 if (( GIT_STAGED > 0 ))
326 then
327 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_STAGED}${ZSH_ANTARES_STR_GIT_STAGED}${GIT_STAGED}%f"
328 fi
329 if (( GIT_DELETED > 0 ))
330 then
331 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_DELETED}${ZSH_ANTARES_STR_GIT_DELETED}${GIT_DELETED}%f"
332 fi
333 if (( GIT_CHANGED > 0 ))
334 then
335 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_CHANGED}${ZSH_ANTARES_STR_GIT_CHANGED}${GIT_CHANGED}%f"
336 fi
337 if (( GIT_ADDED > 0 ))
338 then
339 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_ADDED}${ZSH_ANTARES_STR_GIT_ADDED}${GIT_ADDED}%f"
340 fi
341 if (( GIT_UNTRACKED > 0 ))
342 then
343 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_UNTRACKED}${ZSH_ANTARES_STR_GIT_UNTRACKED}${GIT_UNTRACKED}%f"
344 fi
345 if (( GIT_STASHED > 0 ))
346 then
347 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_GIT_STASHED}${ZSH_ANTARES_STR_GIT_STASHED}${GIT_STASHED}%f"
348 fi
349 if (( ! ZSH_ANTARES_GIT_IS_DETACHED_HEAD ))
350 then
351 private ahead_behind=""
352 if (( GIT_AHEAD > 0 ))
353 then
354 ahead_behind+="%F{$ZSH_ANTARES_FG_GIT_AHEAD}${ZSH_ANTARES_STR_GIT_AHEAD}${GIT_AHEAD}%f"
355 fi
356 if (( GIT_BEHIND > 0 ))
357 then
358 ahead_behind+="%F{$ZSH_ANTARES_FG_GIT_BEHIND}${ZSH_ANTARES_STR_GIT_BEHIND}${GIT_BEHIND}%f"
359 fi
360 if [ -n "$ahead_behind" ]
361 then
362 ZSH_ANTARES_GIT_STATUS+=" $ahead_behind"
363 fi
364 fi
365 ZSH_ANTARES_GIT_STATUS+=" %F{$ZSH_ANTARES_FG_DECO}╾─╯%f"
366}
367
368antares_precmd()
369{
370 ZSH_ANTARES_ERR_CODE="$?"
371 antares_update_git_status
372 antares_update_prompt
373 antares_update_rprompt
374 ZSH_ANTARES_EXEC_FLAG=""
375}
376
377antares_preexec()
378{
379 ZSH_ANTARES_EXEC_FLAG="+"
380 ZSH_ANTARES_EXEC_START=$SECONDS
381}
382
383autoload -U add-zsh-hook
384add-zsh-hook precmd antares_precmd
385add-zsh-hook preexec antares_preexec
386
387PROMPT='${ZSH_ANTARES_RETURN}\
388%F{$ZSH_ANTARES_FG_DECO}╭┤%f${ZSH_ANTARES_PWD}${(e)ZSH_ANTARES_FILLER}${ZSH_ANTARES_GIT_BRANCH}
389%F{$ZSH_ANTARES_FG_DECO}╰─╼%f ${ZSH_ANTARES_JOBS}${ZSH_ANTARES_PRIVILEDGES} '
390
391RPROMPT='${ZSH_ANTARES_GIT_STATUS}'