X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=ad40c2e4100776ea5132428f8c39d72fe00666ba;hb=605fb0e77f8abf5d95c6f77f7c9d442296efa403;hp=75d3e99b47821ee23fef6242df55d322a601eedd;hpb=feb4d463d9c93b7780e5b28dc833a601f93db222;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 75d3e99..ad40c2e 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -1288,8 +1288,8 @@ function prompt_grml_help () { cat <<__EOF0__ prompt grml - This is the prompt as used by the grml-live system . - It is a rather simple one-line prompt, that by default looks like this: + This is the prompt as used by the grml-live system . It is + a rather simple one-line prompt, that by default looks something like this: @ [ ]% @@ -1305,25 +1305,22 @@ function prompt_grml_help () { used before and after the actual item. The available items are: rc, rc-always, change-root, user, at, host, path, - vcs, percent, sad-smiley. + vcs, percent, sad-smiley, battery. The actual configuration is done via zsh's \`zstyle' mechanism. The context, that is used while looking up styles is: - ':prompt:grml:' + ':prompt:grml::' - Here is either 'items:' or 'setup'. The available - styles in the \`setup' context are: use-rprompt, items. For example, - default \`items' style could be configured like this: - - zstyle ':prompt:grml:setup' items user at host path \\ - vcs percent + Here is either \`left' or \`right', signifying whether the + style should affect the left or the right prompt. is either + \`setup' or 'items:', where \`' is one of the available items. The styles: - use-rprompt (boolean): If \`true' (the default), print a sad smiley - in $RPROMPT if the last command a returned non-successful error - code. + in $RPROMPT if the last command a returned non-successful error code. + (This in only valid if is "right"; ignored otherwise) - items (list): The list of items used in the prompt. If \`vcs' is present in the list, the theme's code invokes \`vcs_info' @@ -1334,7 +1331,7 @@ function prompt_grml_help () { following would cause the user name to be printed in red instead of the default blue: - zstyle ':prompt:grml:items:user' pre '%F{red}' + zstyle ':prompt:grml:*:items:user' pre '%F{red}' Note, that the \`post' style may remain at its default value, because its default value is '%f', which turns the foreground text attribute off (which @@ -1342,11 +1339,23 @@ function prompt_grml_help () { __EOF0__ } -function prompt_grml_setup () { +function grml_prompt_setup () { emulate -L zsh autoload -Uz vcs_info autoload -Uz add-zsh-hook - add-zsh-hook precmd prompt_grml_precmd + add-zsh-hook precmd prompt_$1_precmd +} + +function prompt_grml_setup () { + grml_prompt_setup grml +} + +function prompt_grml-chroot_setup () { + grml_prompt_setup grml-chroot +} + +function prompt_grml-large_setup () { + grml_prompt_setup grml-large } typeset -gA grml_prompt_pre_default \ @@ -1364,6 +1373,14 @@ grml_prompt_pre_default=( vcs '' percent '' sad-smiley '' + battery ' ' + newline '' + jobs '%F{cyan}' + history '%F{green}' + date '%F{blue}' + time '%F{blue}' + shell-level '%F{red}' + grml-chroot '%F{red}' ) grml_prompt_post_default=( @@ -1372,11 +1389,19 @@ grml_prompt_post_default=( change-root '' user '%f%b' at '' - host ' ' - path ' %B' + host '' + path '%B' vcs '' - percent ' ' + percent '' sad-smiley '' + battery '' + newline '' + jobs '%f' + history '%f' + date '%f' + time '%f' + shell-level '%f' + grml-chroot '%f ' ) grml_prompt_token_default=( @@ -1385,49 +1410,117 @@ grml_prompt_token_default=( change-root 'debian_chroot' user '%n' at '@' - host '%m' - path '%40<..<%~%<<' + host '%m ' + path '%40<..<%~%<< ' vcs '0' - percent '%%' + percent '%% ' sad-smiley '%(?..:()' + battery 'PERCENT' + newline $'\n' + jobs '[%j running job(s)] ' + history '{history#%!} ' + date '%D{%Y-%m-%d}' + time '%D{%H:%M:%S} ' + shell-level '%(3L.+ .)' + grml-chroot 'GRML_CHROOT' ) -function prompt_grml_precmd () { +function grml_typeset_and_wrap () { emulate -L zsh - setopt extendedglob - local it apre apost new v + local target="$1" + local new="$2" + local left="$3" + local right="$4" + + if (( ${+parameters[$new]} )); then + typeset -g "${target}=${(P)target}${left}${(P)new}${right}" + fi +} + +function grml_prompt_addto () { + emulate -L zsh + local target="$1" + local lr it apre apost new v local -a items + shift - zstyle -a ':prompt:grml:setup' items items \ - || items=( rc change-root user at host path vcs percent ) - PS1='' + [[ $target == PS1 ]] && lr=left || lr=right + zstyle -a ":prompt:${grmltheme}:${lr}:setup" items items || items=( "$@" ) + typeset -g "${target}=" for it in "${items[@]}"; do - zstyle -s ":prompt:grml:items:$it" pre apre \ + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" pre apre \ || apre=${grml_prompt_pre_default[$it]} - zstyle -s ":prompt:grml:items:$it" post apost \ + zstyle -s ":prompt:grml:${grmltheme}:${lr}:$it" post apost \ || apost=${grml_prompt_post_default[$it]} - zstyle -s ":prompt:grml:items:$it" token new \ + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \ || new=${grml_prompt_token_default[$it]} - PS1="${PS1}${apre}" + typeset -g "${target}=${(P)target}${apre}" case $it in + battery) + grml_typeset_and_wrap $target $new '' '' + ;; change-root) - (( ${+parameters[$new]} )) && PS1="${PS1}(${(P)new})" + grml_typeset_and_wrap $target $new '(' ')' + ;; + grml-chroot) + if [[ -n ${(P)new} ]]; then + typeset -g "${target}=${(P)target}(CHROOT)" + fi ;; vcs) v="vcs_info_msg_${new}_" - vcs_info + if (( ! vcscalled )); then + vcs_info + vcscalled=1 + fi if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then - PS1="${PS1}${(P)v}" + typeset -g "${target}=${(P)target}${(P)v}" fi ;; - *) PS1="${PS1}${new}" ;; + *) typeset -g "${target}=${(P)target}${new}" ;; esac - PS1="${PS1}${apost}" + typeset -g "${target}=${(P)target}${apost}" done - if zstyle -t ':prompt:grml:setup' use-rprompt; then - zstyle -s ":prompt:grml:items:sad-smiley" token new \ - || new=${grml_prompt_token_default[sad-smiley]} - RPS1="$new" +} + +function prompt_grml_precmd () { + emulate -L zsh + local grmltheme=grml + local -a left_items right_items + left_items=(rc change-root user at host path vcs percent) + right_items=(sad-smiley) + + prompt_grml_precmd_worker +} + +function prompt_grml-chroot_precmd () { + emulate -L zsh + local grmltheme=grml-chroot + local -a left_items right_items + left_items=(grml-chroot user at host path percent) + right_items=() + + prompt_grml_precmd_worker +} + +function prompt_grml-large_precmd () { + emulate -L zsh + local grmltheme=grml-large + local -a left_items right_items + left_items=(rc jobs history shell-level change-root time date newline + user at host path vcs percent) + right_items=(sad-smiley) + + prompt_grml_precmd_worker +} + +function prompt_grml_precmd_worker () { + emulate -L zsh + local -i vcscalled=0 + + grml_prompt_addto PS1 "${left_items[@]}" + if zstyle -T ":prompt:${grmltheme}:right:setup" use-rprompt; then + grml_prompt_addto RPS1 "${right_items[@]}" fi } @@ -1438,14 +1531,52 @@ if zrcautoload promptinit && promptinit 2>/dev/null ; then # Since we define the required functions in here and not in files in # $fpath, we need to stick the theme's name into `$prompt_themes' # ourselves, since promptinit does not pick them up otherwise. - prompt_themes+=( grml ) + prompt_themes+=( grml grml-chroot grml-large ) # Also, keep the array sorted... prompt_themes=( "${(@on)prompt_themes}" ) + + if [[ $BATTERY -gt 0 ]]; then + zstyle ':prompt:grml:right:setup' items sad-smiley battery + add-zsh-hook precmd battery + fi + if [[ "$TERM" == dumb ]] ; then + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre '' + zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' ' + for i in rc user path jobs history date time shell-level; do + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre '' + zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post '' + done + unset i + zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false + elif (( EUID == 0 )); then + zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%F{red}' + fi + + # Finally enable one of the prompts. + if [[ -n $GRML_CHROOT ]]; then + prompt grml-chroot + elif [[ $GRMLPROMPT -gt 0 ]]; then + prompt grml-large + else + prompt grml + fi else print 'Notice: no promptinit available :(' -fi -setopt prompt_subst + # Support a fallback, in case promptsys isn't available. + setopt prompt_subst + + precmd() { (( ${+functions[vcs_info]} )) && vcs_info; } + + p0="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}" + p1="${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "'${vcs_info_msg_0_}'"%# " + if (( EUID == 0 )); then + PROMPT="${BLUE}${p0}${RED}${p1}" + else + PROMPT="${RED}${p0}${BLUE}${p1}" + fi + unset p0 p1 +fi # make sure to use right prompt only when not running a command is41 && setopt transient_rprompt @@ -1495,21 +1626,6 @@ if [[ $NOPRECMD -gt 0 ]]; then add-zsh-hook precmd grml_vcs_to_screen_title fi -# TODO: revise all these NO* variables and especially their documentation -# in zsh-help() below. -is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { - # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT - if [[ ${DONTSETRPROMPT:-} -eq 0 ]] ; then - if [[ $BATTERY -gt 0 ]] ; then - # update battery (dropped into $PERCENT) information - battery - RPROMPT="%(?..:() ${PERCENT}" - else - RPROMPT="%(?..:() " - fi - fi -} - # preexec() => a function running before every command is4 && [[ $NOPRECMD -eq 0 ]] && \ preexec () { @@ -1548,33 +1664,6 @@ if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then debian_chroot=$(cat /etc/debian_chroot) fi -# don't use colors on dumb terminals (like emacs): -if [[ "$TERM" == dumb ]] ; then - PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< " -else - # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended - # prompt set variable identifying the chroot you work in (used in the - # prompt below) - if [[ $GRMLPROMPT -gt 0 ]] ; then - PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D -${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< " - else - # This assembles the primary prompt string - if (( EUID != 0 )); then - PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< " - else - PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOR}@%m %40<...<%B%~%b%<< " - fi - fi -fi - -PROMPT="${PROMPT}"'${vcs_info_msg_0_}'"%# " - -# if we are inside a grml-chroot set a specific prompt theme -if [[ -n "$GRML_CHROOT" ]] ; then - PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# " -fi - # 'hash' some often used directories #d# start hash -d deb=/var/cache/apt/archives