X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=5168e8dc4bdbc63ea749c665e8900a644de9d588;hb=4e72b7f8b875e50c552855e0564a101151c635fb;hp=ad40c2e4100776ea5132428f8c39d72fe00666ba;hpb=605fb0e77f8abf5d95c6f77f7c9d442296efa403;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index ad40c2e..5168e8d 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -144,6 +144,12 @@ is433(){ return 1 } +is437(){ + [[ $ZSH_VERSION == 4.3.<7->* || $ZSH_VERSION == 4.<4->* \ + || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + is439(){ [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \ || $ZSH_VERSION == <5->* ]] && return 0 @@ -979,6 +985,17 @@ for rh in run-help{,-git,-svk,-svn}; do zrcautoload $rh done; unset rh +# command not found handling + +(( ${COMMAND_NOT_FOUND} == 1 )) && +function command_not_found_handler() { + emulate -L zsh + if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then + ${GRML_ZSH_CNF_HANDLER} $1 + fi + return 1 +} + # completion system if zrcautoload compinit ; then compinit || print 'Notice: no compinit available :(' @@ -1194,6 +1211,47 @@ chpwd_functions=( ${chpwd_functions} chpwd_profiles ) fi # is433 +# Prompt setup for grml: + +# set colors for use in prompts (modern zshs allow for the use of %F{red}foo%f +# in prompts to get a red "foo" embedded, but it's good to keep these for +# backwards compatibility). +if zrcautoload colors && colors 2>/dev/null ; then + BLUE="%{${fg[blue]}%}" + RED="%{${fg_bold[red]}%}" + GREEN="%{${fg[green]}%}" + CYAN="%{${fg[cyan]}%}" + MAGENTA="%{${fg[magenta]}%}" + YELLOW="%{${fg[yellow]}%}" + WHITE="%{${fg[white]}%}" + NO_COLOR="%{${reset_color}%}" +else + BLUE=$'%{\e[1;34m%}' + RED=$'%{\e[1;31m%}' + GREEN=$'%{\e[1;32m%}' + CYAN=$'%{\e[1;36m%}' + WHITE=$'%{\e[1;37m%}' + MAGENTA=$'%{\e[1;35m%}' + YELLOW=$'%{\e[1;33m%}' + NO_COLOR=$'%{\e[0m%}' +fi + +# First, the easy ones: PS2..4: + +# secondary prompt, printed when the shell needs more information to complete a +# command. +PS2='\`%_> ' +# selection prompt used within a select loop. +PS3='?# ' +# the execution trace prompt (setopt xtrace). default: '+%N:%i>' +PS4='+%N:%i:%_> ' + +# Some additional features to use with our prompt: +# +# - battery status +# - debian_chroot +# - vcs_info setup and version specific fixes + # display battery status on right side of prompt via running 'BATTERY=1 zsh' if [[ $BATTERY -gt 0 ]] ; then if ! check_com -c acpi ; then @@ -1215,25 +1273,10 @@ if [[ $BATTERY -gt 0 ]] ; then fi fi } -# set colors for use in prompts -if zrcautoload colors && colors 2>/dev/null ; then - BLUE="%{${fg[blue]}%}" - RED="%{${fg_bold[red]}%}" - GREEN="%{${fg[green]}%}" - CYAN="%{${fg[cyan]}%}" - MAGENTA="%{${fg[magenta]}%}" - YELLOW="%{${fg[yellow]}%}" - WHITE="%{${fg[white]}%}" - NO_COLOR="%{${reset_color}%}" -else - BLUE=$'%{\e[1;34m%}' - RED=$'%{\e[1;31m%}' - GREEN=$'%{\e[1;32m%}' - CYAN=$'%{\e[1;36m%}' - WHITE=$'%{\e[1;37m%}' - MAGENTA=$'%{\e[1;35m%}' - YELLOW=$'%{\e[1;33m%}' - NO_COLOR=$'%{\e[0m%}' + +# set variable debian_chroot if running in a chroot with /etc/debian_chroot +if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then + debian_chroot=$(' are: pre, post. These are strings that are inserted before (pre) and after (post) the item in question. Thus, the @@ -1339,6 +1385,37 @@ function prompt_grml_help () { __EOF0__ } +function prompt_grml-chroot_help () { + cat <<__EOF0__ + prompt grml-chroot + + This is a variation of the grml prompt, see: prompt -h grml + + The main difference is the default value of the \`items' style. The rest + behaves exactly the same. Here are the defaults for \`grml-chroot': + + - left: grml-chroot user at host path percent + - right: (empty list) +__EOF0__ +} + +function prompt_grml-large_help () { + cat <<__EOF0__ + prompt grml-large + + This is a variation of the grml prompt, see: prompt -h grml + + The main difference is the default value of the \`items' style. In + particular, this theme uses _two_ lines instead of one with the plain + \`grml' theme. The rest behaves exactly the same. Here are the defaults + for \`grml-chroot': + + - left: rc jobs history shell-level change-root time date newline user + at host path vcs percent + - right: sad-smiley +__EOF0__ +} + function grml_prompt_setup () { emulate -L zsh autoload -Uz vcs_info @@ -1358,71 +1435,74 @@ function prompt_grml-large_setup () { grml_prompt_setup grml-large } +# These maps define default tokens and pre-/post-decoration for items to be +# used within the themes. All defaults may be customised in a context sensitive +# matter by using zsh's `zstyle' mechanism. 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 '' + battery ' ' + change-root '' + date '%F{blue}' + grml-chroot '%F{red}' + history '%F{green}' host '' - path '%b' - vcs '' + jobs '%F{cyan}' + newline '' + path '%B' percent '' + rc '%F{red}' + rc-always '' sad-smiley '' - battery ' ' - newline '' - jobs '%F{cyan}' - history '%F{green}' - date '%F{blue}' - time '%F{blue}' shell-level '%F{red}' - grml-chroot '%F{red}' + time '%F{blue}' + user '%B%F{blue}' + vcs '' ) grml_prompt_post_default=( - rc '%f' - rc-always '' - change-root '' - user '%f%b' at '' + battery '' + change-root '' + date '%f' + grml-chroot '%f ' + history '%f' host '' - path '%B' - vcs '' + jobs '%f' + newline '' + path '%b' percent '' + rc '%f' + rc-always '' sad-smiley '' - battery '' - newline '' - jobs '%f' - history '%f' - date '%f' - time '%f' shell-level '%f' - grml-chroot '%f ' + time '%f' + user '%f%b' + vcs '' ) grml_prompt_token_default=( - rc '%(?..%? )' - rc-always '%?' - change-root 'debian_chroot' - user '%n' at '@' + battery 'PERCENT' + change-root 'debian_chroot' + date '%D{%Y-%m-%d}' + grml-chroot 'GRML_CHROOT' + history '{history#%!} ' host '%m ' + jobs '[%j running job(s)] ' + newline $'\n' path '%40<..<%~%<< ' - vcs '0' percent '%% ' + rc '%(?..%? )' + rc-always '%?' 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' + time '%D{%H:%M:%S} ' + user '%n' + vcs '0' ) function grml_typeset_and_wrap () { @@ -1524,17 +1604,37 @@ function prompt_grml_precmd_worker () { fi } -# set prompt -if zrcautoload promptinit && promptinit 2>/dev/null ; then - promptinit # people should be able to use their favourite prompt +grml_prompt_fallback() { + setopt prompt_subst + precmd() { + (( ${+functions[vcs_info]} )) && vcs_info + } + + p0="${RED}%(?..%? )${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 +} +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 grml-chroot grml-large ) # Also, keep the array sorted... prompt_themes=( "${(@on)prompt_themes}" ) +else + print 'Notice: no promptinit available :(' + grml_prompt_fallback +fi +if is437; then + # The prompt themes use modern features of zsh, that require at least + # version 4.3.7 of the shell. Use the fallback otherwise. if [[ $BATTERY -gt 0 ]]; then zstyle ':prompt:grml:right:setup' items sad-smiley battery add-zsh-hook precmd battery @@ -1561,26 +1661,10 @@ if zrcautoload promptinit && promptinit 2>/dev/null ; then prompt grml fi else - print 'Notice: no promptinit available :(' - - # 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 + grml_prompt_fallback fi -# make sure to use right prompt only when not running a command -is41 && setopt transient_rprompt - +# Terminal-title wizardry function ESC_print () { info_print $'\ek' $'\e\\' "$@" @@ -1620,29 +1704,23 @@ function grml_vcs_to_screen_title () { 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 - -# preexec() => a function running before every command -is4 && [[ $NOPRECMD -eq 0 ]] && \ -preexec () { - [[ $NOPRECMD -gt 0 ]] && return 0 -# set hostname if not running on host with name 'grml' +function grml_maintain_name () { + # set hostname if not running on host with name 'grml' if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then NAME="@$HOSTNAME" fi -# get the name of the program currently running and hostname of local machine -# set screen window title if running in a screen +} + +function grml_cmd_to_screen_title () { + # get the name of the program currently running and hostname of local + # machine set screen window title if running in a screen if [[ "$TERM" == screen* ]] ; then - # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname - local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname + local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" ESC_print ${CMD} fi -# adjust title of xterm - [[ ${NOTITLE} -gt 0 ]] && return 0 +} + +function grml_control_xterm_title () { case $TERM in (xterm*|rxvt*) set_title "${(%):-"%n@%m:"}" "$1" @@ -1650,18 +1728,15 @@ preexec () { esac } -EXITCODE="%(?..%?%1v )" -# secondary prompt, printed when the shell needs more information to complete a -# command. -PS2='\`%_> ' -# selection prompt used within a select loop. -PS3='?# ' -# the execution trace prompt (setopt xtrace). default: '+%N:%i>' -PS4='+%N:%i:%_> ' - -# set variable debian_chroot if running in a chroot with /etc/debian_chroot -if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then - debian_chroot=$(cat /etc/debian_chroot) +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 + add-zsh-hook preexec grml_maintain_name + add-zsh-hook preexec grml_cmd_to_screen_title + if [[ $NOTITLE -eq 0 ]]; then + add-zsh-hook preexec grml_control_xterm_title + fi fi # 'hash' some often used directories