X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=445d7f3215824a94cc8cbefcb49717fbdf8e29d2;hb=cc7541fb2cd2222bece7d9b4144a645b73f31d36;hp=305155e58ca5100035ccd21b2611793f0459b2cf;hpb=6c4346c3c7233655a9448f896ec708e11ce10ae1;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 305155e..445d7f3 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: @ [ ]% @@ -1310,20 +1310,17 @@ function prompt_grml_help () { 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 @@ -1343,9 +1340,104 @@ __EOF0__ } function prompt_grml_setup () { + emulate -L zsh + autoload -Uz vcs_info + autoload -Uz add-zsh-hook + add-zsh-hook precmd prompt_grml_precmd +} + +typeset -gA grml_prompt_pre_default \ + grml_prompt_post_default \ + grml_prompt_token_default + +grml_prompt_pre_default=( + rc '%F{red}' + rc-always '' + change-root '' + user '%B%F{blue}' + at '' + host '' + path '%b' + vcs '' + percent '' + sad-smiley '' +) + +grml_prompt_post_default=( + rc '%f' + rc-always '' + change-root '' + user '%f%b' + at '' + host ' ' + path ' %B' + vcs '' + percent ' ' + sad-smiley '' +) + +grml_prompt_token_default=( + rc '%(?..%? )' + rc-always '%?' + change-root 'debian_chroot' + user '%n' + at '@' + host '%m' + path '%40<..<%~%<<' + vcs '0' + percent '%%' + sad-smiley '%(?..:()' +) + +function grml_prompt_addto () { + emulate -L zsh + local target="$1" + local lr it apre apost new v + local -a items + shift + + [[ $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:${grmltheme}:${lr}:items:$it" pre apre \ + || apre=${grml_prompt_pre_default[$it]} + zstyle -s ":prompt:grml:${grmltheme}:${lr}:$it" post apost \ + || apost=${grml_prompt_post_default[$it]} + zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \ + || new=${grml_prompt_token_default[$it]} + typeset -g "${target}=${(P)target}${apre}" + case $it in + change-root) + if (( ${+parameters[$new]} )); then + typeset -g "${target}=${(P)target}${(P)new}" + fi + ;; + vcs) + v="vcs_info_msg_${new}_" + if (( ! vcscalled )); then + vcs_info + vcscalled=1 + fi + if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then + typeset -g "${target}=${(P)target}${(P)v}" + fi + ;; + *) typeset -g "${target}=${(P)target}${new}" ;; + esac + typeset -g "${target}=${(P)target}${apost}" + done } function prompt_grml_precmd () { + emulate -L zsh + local -i vcscalled=0 + local grmltheme=grml + + grml_prompt_addto PS1 rc change-root user at host path vcs percent + if zstyle -T ":prompt:${grmltheme}:right:setup" use-rprompt; then + grml_prompt_addto RPS1 sad-smiley + fi } # set prompt @@ -1385,13 +1477,18 @@ function info_print () { printf '%s' "${esc_end}" } -# TODO: revise all these NO* variables and especially their documentation -# in zsh-help() below. -is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { - [[ $NOPRECMD -gt 0 ]] && return 0 - # update VCS information - (( ${+functions[vcs_info]} )) && vcs_info +function grml_reset_screen_title () { + # adjust title of xterm + # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html + [[ ${NOTITLE:-} -gt 0 ]] && return 0 + case $TERM in + (xterm*|rxvt*) + set_title ${(%):-"%n@%m: %~"} + ;; + esac +} +function grml_vcs_to_screen_title () { if [[ $TERM == screen* ]] ; then if [[ -n ${vcs_info_msg_1_} ]] ; then ESC_print ${vcs_info_msg_1_} @@ -1399,6 +1496,17 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { ESC_print "zsh" fi fi +} + +zrcautoload add-zsh-hook || add-zsh-hook () { :; } +if [[ $NOPRECMD -gt 0 ]]; then + add-zsh-hook precmd grml_reset_screen_title + 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 @@ -1409,14 +1517,6 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () { RPROMPT="%(?..:() " fi fi - # adjust title of xterm - # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html - [[ ${NOTITLE:-} -gt 0 ]] && return 0 - case $TERM in - (xterm*|rxvt*) - set_title ${(%):-"%n@%m: %~"} - ;; - esac } # preexec() => a function running before every command