zbell built into the prompt
[zsh.git] / .zsh / functions / prompt_ganneff_setup
1 # -*- mode:sh -*-
2
3 # This prompt is based on work of other people.
4 #
5 # The prompt itself is based on various others:
6 # - The "design" is taken from Phil!'s ZSH prompt, as found on
7 # http://aperiodic.net/phil/prompt/
8 #
9 # - The tech using zstyle is inspired by the prompt as used by
10 # the grml-live system <http://grml.org>, see
11 # http://git.grml.org/?p=grml-etc-core.git;a=summary for details
12 # on theirs.
13 # A good number of their support functions are also taken, though
14 # they got renamed from grml_* to ganneff_* to have a single namespace
15 # here.
16 #
17 # - The winch function as seen in the prompt theme "bart", delivered
18 # with zsh
19
20 prompt_ganneff_help () {
21 cat <<__EOF0__
22 prompt ganneff
23
24 This is the prompt as used by (who would have guessed) Ganneff. By
25 default it is a two-line prompt. You can find its latest version at
26 http://git.ganneff.de/cgi-bin/gitweb.cgi?p=zsh.git;a=summary
27
28 The prompt itself is based on various others:
29 - The "design" is taken from Phil!'s ZSH prompt, as found on
30 http://aperiodic.net/phil/prompt/
31
32 - The technic using zstyle is inspired by the prompt as used by
33 the grml-live system <http://grml.org>, see
34 http://git.grml.org/?p=grml-etc-core.git;a=summary for details
35 on theirs.
36
37 The prompt integrates with zsh's prompt themes system and uses the
38 zstyle system for its configuration. It is configurable as much as
39 seems to make sense. In particular, these aspects are customisable:
40
41 - The items used in the prompt and their order (e.g. you can
42 remove \`user' from the list of activated items, which will
43 cause the user name to be omitted from the prompt string).
44
45 - The attributes used with the items are customisable via strings
46 used before and after the actual item.
47
48 - An itemset for "small terminals" can be provided. That is, if the
49 length of the upper line exceeds the terminal width, various
50 items get removed from the prompt to (hopefully) make it still
51 look good. Obviously this only works down to a limit.
52
53 The available items are: at, battery, change-root, date, history,
54 host, jobs, newline, path, percent, rc, rc-always, shell-level,
55 time, user, vcs, ulcorner, llcorner, urcorner, lrcorner, line, pts,
56 privileges, openparentheses, closeparentheses, openbracket,
57 closebracket, openbraces, closebraces, openanglebracket,
58 closeanglebracket, colon, pipe, space, flexline
59
60 Most of those should be self-explanatory, some may need more:
61 line - Draws a single line character
62 XYcorner - Draws a corner. The chars to replace XY are
63 X=u for upper, l for lower
64 Y=l for left, r for right
65 flexline - Same as line, but flexible length to fill remaining space
66 Only works in a two-line prompt in the upper line, that
67 is, a newline MUST appear in the setup!
68
69 Should they not fit your need, there is an easy way to have the
70 prompt include basically anything you want. Just define your own
71 items. For that you simply define them inside the
72 ':prompt:ganneff:extra:' namespace.
73
74 Example: To have the prompt include the value of the variable
75 \$FOOBAR, in red and have the variable updated by the function
76 jj_foobar, use the following:
77
78 zstyle ':prompt:ganneff:extra:foobar' pre '${PR_RED}'
79 zstyle ':prompt:ganneff:extra:foobar' post '${PR_NO_COLOR}'
80 zstyle ':prompt:ganneff:extra:foobar' token '$FOOBAR'
81 zstyle ':prompt:ganneff:extra:foobar' precmd jj_foobar
82
83 Now you can add the token \`foobar' to the list of items and voila,
84 your own stuff appears.
85
86 Note that the function part only works in zsh 4.3.5 or later (I've
87 been to lazy to replace add-zsh-hook with something for the older
88 versions).
89
90
91 The configuration of the predefined items can also be changed using
92 zsh's \`zstyle' mechanism. The context, that is used while looking
93 up styles is:
94
95 ':prompt:ganneff:<left-or-right>:<full-or-small>:<subcontext>'
96
97 Here <left-or-right> is either \`left' or \`right', signifying
98 whether the style should affect the left or the right prompt.
99
100 <full-or-small> is either \`full' or \`small' and only valid in the
101 item selection, signifying wether the item list should affect the
102 full length or the "small terminal" prompt. As "small terminal"
103 prompt does not display the right side prompt, <full-or-small> has
104 no effect on the right side prompt.
105
106 <subcontext> is either \`setup' or 'items:<item>', where \`<item>'
107 is one of the available items.
108
109 The styles/settings available under ':prompt:ganneff:':
110
111 - vcs_info (boolean): If \`true' (the default), use \`vcs_info'.
112
113 - set_vcs_info_defaults (boolean): If \`true' (the default),
114 various vcs_info settings will be done. If unset or \`false'
115 it is assumed that the user has already done this.
116
117 The default setup is:
118 zstyle ':vcs_info:*' max-exports 1
119 zstyle ':vcs_info:*' use-prompt-escapes
120 zstyle ':vcs_info:*' use_simple
121 zstyle ':vcs_info:*' stagedstr "!"
122 zstyle ':vcs_info:*' unstagedstr "?"
123 zstyle ':vcs_info:*' check-for-changes true
124 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat \
125 "\${PR_YELLOW}%b%{\${PR_RED}%}:\${PR_YELLOW}%r\${PR_NO_COLOR}"
126 zstyle ':vcs_info:*' formats \
127 "(\${PR_YELLOW}%s\${PR_NO_COLOR})-[\${PR_GREEN}%b\${PR_NO_COLOR}]%m%u%c "
128 zstyle ':vcs_info:*' actionformats \
129 "(\${PR_YELLOW}%s\${PR_NO_COLOR})-[\${PR_GREEN}%b\${PR_NO_COLOR}-\${PR_RED}(%a)\${PR_NO_COLOR}]%m%u%c "
130
131 - colors (boolean): If \`true' (the default), use colors. b/w
132 otherwise.
133
134 - nicelines (boolean): If \`true' (the default), use special
135 magic to draw nice lines and corners. Might not work on every
136 terminal. If false, draws using plain ascii characters.
137 Linux console also seems to identify itself as if it could,
138 but then doesn't do drawing right (not in our way at least).
139
140 - battery (string): If \`none' then no battery function at all.
141 If either \`ibam' or \`acpi' then use those tools to gather
142 the current battery level.
143
144 - use-rprompt (boolean): If \`true' (the default), print the
145 right side prompt.
146
147 - items (list): The list of items used in the prompt. If \`vcs' is
148 present in the list, the theme's code invokes \`vcs_info'
149 accordingly. Default (left): rc change-root user at host path vcs
150 percent; Default (right): sad-smiley
151
152 Note that both, nicelines and colors are forced to false in case the
153 TERM variable is set to dumb.
154
155 Available styles in 'items:<item>' are: pre, post, token and precmd.
156 Pre and Post are strings that are inserted before (pre) and after
157 (post) the item in question. Token is the token itself that gets
158 inserted into PS1. Thus, the following would cause the
159 user name to be printed in red instead of the default blue:
160
161 zstyle ':prompt:ganneff:*:items:user' pre '\${PR_RED}'
162
163 and
164
165 zstyle ':prompt:ganneff:*:items:date' token '%D{%Y-%m-%d [d:%j/w:%V]}'
166
167 will output a very different date token compared with the default
168 definition of '%D{%Y-%m-%d}'.
169
170 Note, that in the above example the \`post' style may remain at its
171 default value, because its default value is '\${PR_NO_COLOR}', which
172 turns the foreground text attribute off (which is exactly, what is
173 still required with the new \`pre' value).
174
175 Possible values for the colors: \${PR_XXX} and \${PR_BOLD_XXX} with
176 XXX replaced with one of: RED GREEN YELLOW BLUE MAGENTA CYAN WHITE BLACK.
177 \${PR_NO_COLOR} resets color.
178 Using the \${PR_XXX} values instead of zsh's internal \%F{xxx} allows
179 the usage of the colors style to turn of prompt colors easily.
180
181 Last note: You really want to have "setopt promptsubst", otherwise you
182 won't like this prompt.
183 __EOF0__
184 }
185
186 prompt_ganneff_setup () {
187 emulate -L zsh
188 setopt nolocaltraps
189
190 # We forcefully overwrite colors and nicelines setting for a dumb
191 # terminal.
192 if [[ "$TERM" == "dumb" ]]; then
193 zstyle ':prompt:ganneff' colors false
194 zstyle ':prompt:ganneff' nicelines false
195 fi
196
197 # See if we can and should use extended characters to look nicer.
198 if zstyle -t ':prompt:ganneff' nicelines; then
199 typeset -A altchar
200 set -A altchar ${(s..)terminfo[acsc]}
201 # Some stuff to help us draw nice lines
202 PR_SET_CHARSET="%{$terminfo[enacs]%}"
203 PR_SHIFT_IN="%{$terminfo[smacs]%}"
204 PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
205 PR_HBAR=${altchar[q]:--}
206 PR_ULCORNER=${altchar[l]:--}
207 PR_LLCORNER=${altchar[m]:--}
208 PR_LRCORNER=${altchar[j]:--}
209 PR_URCORNER=${altchar[k]:--}
210 else
211 PR_SET_CHARSET=""
212 PR_SHIFT_IN=""
213 PR_SHIFT_OUT=""
214 PR_HBAR="-"
215 PR_ULCORNER=""
216 PR_LLCORNER=""
217 PR_LRCORNER=""
218 PR_URCORNER=""
219 fi
220
221 if zstyle -t ':prompt:ganneff' colors; then
222 if [[ -n "${BLUE}" ]] && [[ -n "${YELLOW}" ]]; then
223 # Two defined, so we assume someone already defined themself
224 # the colors. We just use them and not setup our own.
225 for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE BLACK GREY; do
226 eval PR_$color='%{${(P)color}%}'
227 eval PR_BOLD_$color='%{$terminfo[bold]${(LP)color}%}'
228 done
229 PR_NO_COLOR="%{${reset_color}%}"
230 else
231 # Seems like colors are not defined, so set them up
232 # This duplicates docolors from 01_Terminfo.zsh, but is here to have
233 # prompt_ganneff_setup not require anything else from my dotfiles
234 if autoload -Uz colors && colors 2>/dev/null ; then
235 for COLOR in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE BLACK GREY; do
236 eval PR_$COLOR='%{$fg_no_bold[${(L)COLOR}]%}'
237 eval PR_BOLD_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
238 done
239 eval PR_NO_COLOR='%{$reset_color%}'
240 else
241 PR_BLUE=$'%{\e[1;34m%}'
242 PR_RED=$'%{\e[1;31m%}'
243 PR_GREEN=$'%{\e[1;32m%}'
244 PR_CYAN=$'%{\e[1;36m%}'
245 PR_WHITE=$'%{\e[1;37m%}'
246 PR_MAGENTA=$'%{\e[1;35m%}'
247 PR_YELLOW=$'%{\e[1;33m%}'
248 PR_NO_COLOR=$'%{\e[0m%}'
249 fi
250 fi
251 else
252 PR_BLUE=''
253 PR_RED=''
254 PR_GREEN=''
255 PR_CYAN=''
256 PR_WHITE=''
257 PR_MAGENTA=''
258 PR_YELLOW=''
259 PR_NO_COLOR="%{${reset_color}%}"
260 fi
261
262 # Easy things first.
263 # The secondary prompt, printed when the shell needs more
264 # information to complete a command. %_ displays any shell constructs
265 # or quotation marks which are currently being processed.
266 if zstyle -t ':prompt:ganneff' nicelines; then
267 PS2='${PR_CYAN}${PR_SHIFT_IN}${PR_HBAR}${PR_BLUE}${PR_HBAR}${PR_SHIFT_OUT}\
268 (${PR_GREEN}%_${PR_BLUE})\
269 ${PR_SHIFT_IN}${PR_HBAR}${PR_CYAN}${PR_HBAR}${PR_SHIFT_OUT}${PR_NO_COLOR} '
270 else
271 PS2='-(%_)- '
272 fi
273 # selection prompt used within a select loop.
274 PS3='?# '
275 # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
276 # Not changed if the option xtrace is on, assuming that a trace prompt is then
277 # already defined.
278 if [[ ${options[xtrace]} == off ]]; then
279 PS4='+%N:%i:%_> '
280 fi
281
282 if zstyle -t ':prompt:ganneff' vcs_info && \
283 is439 && autoload -Uz vcs_info && vcs_info; then
284 if zstyle -t ':prompt:ganneff' set_vcs_info_defaults; then
285 # gather version control information for inclusion in a prompt
286 # we will only be using one variable, so let the code know now.
287 zstyle ':vcs_info:*' max-exports 1
288 zstyle ':vcs_info:*' use-prompt-escapes
289 zstyle ':vcs_info:*' use_simple
290 zstyle ':vcs_info:*' stagedstr "!"
291 zstyle ':vcs_info:*' unstagedstr "?"
292 zstyle ':vcs_info:*' check-for-changes true
293
294 # change vcs_info formats for the prompt
295 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "${PR_YELLOW}%b%{${PR_RED}%}:${PR_YELLOW}%r${PR_NO_COLOR}"
296 zstyle ':vcs_info:*' formats "(${PR_YELLOW}%s${PR_NO_COLOR})-[${PR_GREEN}%b${PR_NO_COLOR}]%m%u%c "
297 zstyle ':vcs_info:*' actionformats "(${PR_YELLOW}%s${PR_NO_COLOR})-[${PR_GREEN}%b${PR_NO_COLOR}-${PR_RED}(%a)${PR_NO_COLOR}]%m%u%c "
298 fi
299 fi
300
301 # These maps define default tokens and pre-/post-decoration for items to be
302 # used within the themes. All defaults may be customised in a context sensitive
303 # matter by using zsh's `zstyle' mechanism.
304 typeset -gA ganneff_prompt_pre_default \
305 ganneff_prompt_post_default \
306 ganneff_prompt_token_default
307
308 ganneff_prompt_pre_default=(
309 at ''
310 battery ' '
311 change-root ''
312 date '${PR_BLUE}'
313 history '${PR_GREEN}'
314 host '${PR_RED}'
315 jobs '${PR_CYAN}'
316 newline ''
317 path '${PR_MAGENTA}'
318 percent ''
319 rc '${PR_RED}'
320 rc-always ''
321 shell-level '${PR_RED}'
322 time '${PR_BLUE}'
323 user '${PR_BLUE}'
324 vcs ''
325 ulcorner '${PR_SHIFT_IN}'
326 llcorner '${PR_SHIFT_IN}'
327 urcorner '${PR_SHIFT_IN}'
328 lrcorner '${PR_SHIFT_IN}'
329 line '${PR_SHIFT_IN}'
330 pts ''
331 privileges ''
332 openparentheses ''
333 closeparentheses ''
334 openbracket ''
335 closebracket ''
336 openbraces ''
337 closebraces ''
338 openanglebracket ''
339 closeanglebracket ''
340 pipe ''
341 space ''
342 colon ''
343 flexline '${PR_SHIFT_IN}'
344 )
345
346
347 ganneff_prompt_post_default=(
348 at ''
349 battery ''
350 change-root ''
351 date '${PR_NO_COLOR}'
352 history '${PR_NO_COLOR}'
353 host '${PR_NO_COLOR}'
354 jobs '${PR_NO_COLOR}'
355 newline ''
356 path '${PR_NO_COLOR}'
357 percent ''
358 rc '${PR_NO_COLOR}'
359 rc-always ''
360 shell-level '${PR_NO_COLOR}'
361 time '${PR_NO_COLOR}'
362 user '${PR_NO_COLOR}'
363 vcs ''
364 ulcorner '${PR_SHIFT_OUT}'
365 llcorner '${PR_SHIFT_OUT}'
366 urcorner '${PR_SHIFT_OUT}'
367 lrcorner '${PR_SHIFT_OUT}'
368 line '${PR_SHIFT_OUT}'
369 pts ''
370 privileges ''
371 openparentheses ''
372 closeparentheses ''
373 openbracket ''
374 closebracket ''
375 openbraces ''
376 closebraces ''
377 openanglebracket ''
378 closeanglebracket ''
379 pipe ''
380 space ''
381 colon ''
382 flexline '${PR_SHIFT_OUT}'
383 )
384
385 ganneff_prompt_token_default=(
386 at '@'
387 battery 'PERCENT'
388 change-root 'debian_chroot'
389 date '%D{%Y-%m-%d}'
390 history '{#%!}'
391 host '%m'
392 jobs '[%j running job(s)] '
393 newline $'\n'
394 path '%40<..<%~%<<'
395 percent '%# '
396 rc '%(?..%? )'
397 rc-always '%?'
398 shell-level '%(2L.%L.)'
399 time '%D{%H:%M:%S}'
400 user '%n'
401 vcs '0'
402 ulcorner '${PR_ULCORNER}'
403 llcorner '${PR_LLCORNER}'
404 urcorner '${PR_URCORNER}'
405 lrcorner '${PR_LRCORNER}'
406 line '${PR_HBAR}'
407 pts '%y'
408 privileges '%#'
409 openparentheses '('
410 closeparentheses ')'
411 openbracket '['
412 closebracket ']'
413 openbraces '{'
414 closebraces '}'
415 openanglebracket '<'
416 closeanglebracket '>'
417 pipe '|'
418 space ' '
419 colon ':'
420 flexline 'PR_FLEXLINE'
421 )
422
423 PR_FLEXLINE=""
424 add-zsh-hook precmd prompt_ganneff_precmd
425 # Call the winch function once to ensure the length gets calculated
426 # correctly
427 prompt_ganneff_winch
428 local pr_battery
429 zstyle -s ':prompt:ganneff' battery pr_battery
430 if [[ $pr_battery != "none" ]]; then
431 add-zsh-hook precmd prompt_ganneff_battery
432 prompt_ganneff_battery
433 fi
434
435 functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_ganneff_winch}
436 prompt_ganneff_winch"
437
438 # Should we "ring the bell" when a command finishes?
439 zstyle -s ':prompt:ganneff' longbell _prompt_ganneff_belltime || \
440 _prompt_ganneff_belltime=600
441 if [[ ${_prompt_ganneff_belltime} -gt 0 ]]; then
442 # New shell, initialize the timestamp once
443 _prompt_ganneff_timestamp=${EPOCHSECONDS}
444 typeset -ga _prompt_ganneff_ignore
445 zstyle -a ':prompt:ganneff' bell_ignore _prompt_ganneff_ignore || \
446 _prompt_ganneff_ignore=( '$EDITOR' '$PAGER' sleep man ssh )
447 # In case the commands to ignore include variables (say $EDITOR), we want to
448 # store them once as variable - and once the variable expanded.
449 for (( i = 1; i <= ${#_prompt_ganneff_ignore}; i++ )) do
450 if (( ${${_prompt_ganneff_ignore[$i]}[(i)$]} <= ${#_prompt_ganneff_ignore[$i]} )); then
451 _prompt_ganneff_ignore+=(${(e)${_prompt_ganneff_ignore[$i]}})
452 fi
453 done
454 add-zsh-hook preexec prompt_ganneff_preexec
455 fi
456 }
457
458 # right before we begin to execute something, store the time it started at
459 prompt_ganneff_preexec() {
460 _prompt_ganneff_timestamp=${EPOCHSECONDS}
461 _prompt_ganneff_lastcmd=${2}
462 }
463
464 prompt_ganneff_precmd () {
465 emulate -L zsh
466 setopt nolocaltraps
467
468 zstyle -t ':prompt:ganneff' vcs_info && vcs_info
469 local -a left_items right_items drop_words
470
471 left_items=(ulcorner line openparantheses user at host colon pts closeparantheses line history
472 line shell-level line flexline openparentheses path closeparentheses line urcorner newline
473 llcorner line rc openparentheses time closeparentheses line vcs line change-root pipe space)
474 PR_PS1=""; nomore=0
475 ganneff_prompt_addto PS1 full "${left_items[@]}"
476 if zstyle -T ":prompt:ganneff:right:setup" use-rprompt; then
477 right_items=(pipe line openparentheses date closeparentheses line lrcorner)
478 ganneff_prompt_addto RPS1 full "${right_items[@]}"
479 fi
480
481 # Now a kind-of-hack to reduce the prompt when we run out of space.
482 promptsize=${#PR_PS1}
483 if [[ ${promptsize} -lt ${TERMWIDTH} ]]; then
484 # the q here should be ${PR_HBAR}, but for some reason zsh didn't like me,
485 # so meh
486 if zstyle -t ':prompt:ganneff' nicelines && \
487 [[ "$TERM" != dumb ]] && [[ "$TERM" != "linux" ]]; then
488 PR_FLEXLINE="${(l.(($TERMWIDTH - $promptsize ))..q.)}"
489 else
490 PR_FLEXLINE="${(l.(($TERMWIDTH - $promptsize ))..-.)}"
491 fi
492 else
493 # Small size prompt is needed
494 left_items=(ulcorner line openparentheses user at host closeparentheses line openparentheses
495 path closeparentheses newline
496 llcorner line rc openparentheses time closeparentheses line vcs line pipe space)
497 ganneff_prompt_addto PS1 small "${left_items[@]}"
498 # And with a small prompt, we don't show the right size at all.
499 RPS1=""
500 fi
501
502 # Should we "ring the bell" when a command finishes?
503 if (( _prompt_ganneff_timestamp )); then
504 ran_long=$(( ${EPOCHSECONDS} - ${_prompt_ganneff_timestamp} >= ${_prompt_ganneff_belltime} ))
505 if (( ran_long )); then
506 has_ignored_cmd=0
507 drop_words=(builtin command nocorrect noglob)
508 for cmd in ${(s:;:)_prompt_ganneff_lastcmd//|/;}; do
509 words=(${(z)cmd})
510 util=${words[1]}
511 if (( ${drop_words[(i)$util]} <= ${#drop_words} )); then
512 util=${words[2]}
513 fi
514 if (( ${_prompt_ganneff_ignore[(i)$util]} <= ${#_prompt_ganneff_ignore} )); then
515 has_ignored_cmd=1
516 break
517 fi
518 done
519 if (( ! ${has_ignored_cmd} )); then
520 print -n "\a"
521 fi
522 fi
523 fi
524 }
525
526 prompt_ganneff_length () {
527 (( TERMWIDTH = ${COLUMNS} - 1 ))
528 }
529
530 prompt_ganneff_winch () {
531 emulate -L zsh
532 setopt nolocaltraps noksharrays unset
533
534 # Delete ourself from TRAPWINCH if not using our precmd insert.
535 [[ $precmd_functions = *prompt_ganneff_precmd* ]] && prompt_ganneff_length ||
536 functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_ganneff_winch}"
537 }
538
539 ganneff_typeset_and_wrap () {
540 emulate -L zsh
541 local target="$1"
542 local new="$2"
543 local left="$3"
544 local right="$4"
545
546 if (( ${+parameters[$new]} )); then
547 typeset -g "${target}=${(P)target}${left}${(P)new}${right}"
548 fi
549 }
550
551 ganneff_prompt_addto () {
552 emulate -L zsh
553 local target="$1"
554 local size="$2"
555 local lr it apre apost new v prefunc
556 local -a items
557 shift
558 shift
559
560 [[ $target == PS1 ]] && lr=left || lr=right
561 zstyle -a ":prompt:ganneff:${lr}:${size}:setup" items items || items=( "$@" )
562 typeset -g "${target}="
563 for it in "${items[@]}"; do
564 zstyle -s ":prompt:ganneff:${lr}:items:$it" pre apre \
565 || zstyle -s ":prompt:ganneff:extra:$it" pre apre \
566 || apre=${ganneff_prompt_pre_default[$it]}
567 zstyle -s ":prompt:ganneff:${lr}:items:$it" post apost \
568 || zstyle -s ":prompt:ganneff:extra:$it" post apost \
569 || apost=${ganneff_prompt_post_default[$it]}
570 zstyle -s ":prompt:ganneff:${lr}:items:$it" token new \
571 || zstyle -s ":prompt:ganneff:extra:$it" token new \
572 || new=${ganneff_prompt_token_default[$it]}
573
574 # Now check if there is the wish for a precmd function and if so,
575 # run it
576 zstyle -s ":prompt:ganneff:extra:$it" precmd prefunc
577 if [[ -n "${prefunc}" ]]; then
578 ${prefunc} || true
579 fi
580
581 typeset -g "${target}=${(P)target}${apre}"
582 # Store the expanded value in PR_PS1, as we use that for length calculations
583 [[ $it == "newline" ]] && nomore=1
584 if [[ $nomore -eq 0 ]] && [[ $it != "flexline" ]] && PR_PS1+=${(e%)new}
585 case $it in
586 battery)
587 ganneff_typeset_and_wrap $target $new '' ''
588 ;;
589 change-root)
590 ganneff_typeset_and_wrap $target $new '(' ')'
591 ;;
592 flexline)
593 typeset -g "${target}=${(P)target}\${${new}}"
594 ;;
595 ganneff-chroot)
596 if [[ -n ${(P)new} ]]; then
597 typeset -g "${target}=${(P)target}(CHROOT)"
598 fi
599 ;;
600 vcs)
601 v="vcs_info_msg_${new}_"
602 if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then
603 typeset -g "${target}=${(P)target}${(P)v}"
604 fi
605 ;;
606 *) typeset -g "${target}=${(P)target}${new}" ;;
607 esac
608 typeset -g "${target}=${(P)target}${apost}"
609 done
610 }
611
612 prompt_ganneff_battery() {
613 zstyle -s ':prompt:ganneff' battery pr_battery
614 case $pr_battery in
615 ibam)
616 local ACPIDATA=$(ibam --percentbattery 2>/dev/null || echo "")
617 PERCENT=${${ACPIDATA[(f)1]}[(w)-2]}
618 ;;
619 acpi)
620 PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]#Battery <->: [^0-9]##, (<->)%*/${match[1]}}"
621 ;;
622 *)
623 PERCENT=""
624 ;;
625 esac
626
627 if [[ -z "$PERCENT" ]] ; then
628 PERCENT="No battery or $pr_battery not present "
629 else
630 if [[ "$PERCENT" -lt 20 ]] ; then
631 PERCENT="warning: ${PERCENT}%%"
632 else
633 PERCENT="${PERCENT}%%"
634 fi
635 fi
636 }
637
638 is439(){
639 [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \
640 || $ZSH_VERSION == <5->* ]] && return 0
641 return 1
642 }
643
644 prompt_ganneff_setup "$@"