X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=5150964c9a81f24dacb603227a16fe2a0608616c;hb=01f5d9f52a15de385bd5105180f90aca334ea30b;hp=48d07664cbfb14eb2681689dbbdc7a20979b2d80;hpb=4dc88ce5e68f7b0d311dfd0e5bbcb9035554d552;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 48d0766..5150964 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 @@ -727,8 +733,8 @@ grml_toggle_abbrev() { } #k# Toggle abbreviation expansion on/off -zle -N grml_toggle_abbrev bindkey '^xA' grml_toggle_abbrev +zle -N grml_toggle_abbrev # add a command line to the shells history without executing it commit-to-history() { @@ -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 :(' @@ -1118,7 +1135,7 @@ if check_com -c screen || check_com -c tmux; then _screen_display_wordlist[${_screen_display_wordlist[(i)$PREFIX]}]="" compadd -a _screen_display_wordlist } - #k# complete word from currently visible GNU screen buffer + #m# k CTRL-x\,\,\,S Complete word from GNU screen buffer bindkey -r "^xS" compdef -k _complete_screen_display complete-word '^xS' fi @@ -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-large': + + - 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 '%% ' + 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,22 +1604,44 @@ 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 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 '' @@ -1550,16 +1652,19 @@ if zrcautoload promptinit && promptinit 2>/dev/null ; then zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%F{red}' fi - prompt grml + # 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 :(' + grml_prompt_fallback fi -setopt prompt_subst - -# 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\\' "$@" @@ -1599,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" @@ -1629,47 +1728,17 @@ 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) -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 +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 -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 @@ -1704,15 +1773,15 @@ fi # do we have GNU ls with color-support? if [[ "$TERM" != dumb ]]; then - #a1# execute \kbd{@a@}:\quad ls with colors + #a1# List files with colors (\kbd{ls -b -CF \ldots}) alias ls='ls -b -CF '${ls_options:+"${ls_options[*]}"} - #a1# execute \kbd{@a@}:\quad list all files, with colors + #a1# List all files, with colors (\kbd{ls -la \ldots}) alias la='ls -la '${ls_options:+"${ls_options[*]}"} - #a1# long colored list, without dotfiles (@a@) + #a1# List files with long colored list, without dotfiles (\kbd{ls -l \ldots}) alias ll='ls -l '${ls_options:+"${ls_options[*]}"} - #a1# long colored list, human readable sizes (@a@) + #a1# List files with long colored list, human readable sizes (\kbd{ls -hAl \ldots}) alias lh='ls -hAl '${ls_options:+"${ls_options[*]}"} - #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...) + #a1# List files with long colored list, append qualifier to filenames (\kbd{ls -lF \ldots})\\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...) alias l='ls -lF '${ls_options:+"${ls_options[*]}"} else alias ls='ls -b -CF' @@ -2071,11 +2140,6 @@ graphic chipset." #a1# Output version of running grml alias grml-version='cat /etc/grml_version' - if check_com -c rebuildfstab ; then - #a1# Rebuild /etc/fstab - alias grml-rebuildfstab='rebuildfstab -v -r -config' - fi - if check_com -c grml-debootstrap ; then debian2hd() { echo "Installing debian to harddisk is possible by using grml-debootstrap." @@ -2127,7 +2191,7 @@ sll() { # PAGER='less -Mr' - If so, the use of $PAGER here needs fixing # with respect to wordsplitting. (ie. ${=PAGER}) if check_com -c $PAGER ; then - #f1# View Debian's changelog of a given package + #f3# View Debian's changelog of a given package dchange() { emulate -L zsh if [[ -r /usr/share/doc/$1/changelog.Debian.gz ]] ; then @@ -2151,7 +2215,7 @@ if check_com -c $PAGER ; then _dchange() { _files -W /usr/share/doc -/ } compdef _dchange dchange - #f1# View Debian's NEWS of a given package + #f3# View Debian's NEWS of a given package dnews() { emulate -L zsh if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then @@ -2168,7 +2232,7 @@ if check_com -c $PAGER ; then _dnews() { _files -W /usr/share/doc -/ } compdef _dnews dnews - #f1# View Debian's copyright of a given package + #f3# View Debian's copyright of a given package dcopyright() { emulate -L zsh if [[ -r /usr/share/doc/$1/copyright ]] ; then @@ -2181,7 +2245,7 @@ if check_com -c $PAGER ; then _dcopyright() { _files -W /usr/share/doc -/ } compdef _dcopyright dcopyright - #f1# View upstream's changelog of a given package + #f3# View upstream's changelog of a given package uchange() { emulate -L zsh if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then @@ -2301,7 +2365,7 @@ alias help-zshglob=H-Glob HELP_LINES_PER_PAGE=20 #v1# set location of help-zle cache file HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh -#f1# helper function for help-zle, actually generates the help text +# helper function for help-zle, actually generates the help text help_zle_parse_keybindings() { emulate -L zsh @@ -2402,7 +2466,7 @@ help_zle_parse_keybindings() typeset -g help_zle_sln typeset -g -a help_zle_lines -#f1# Provides (partially autogenerated) help on keybindings and the zsh line editor +# Provides (partially autogenerated) help on keybindings and the zsh line editor help-zle() { emulate -L zsh @@ -2416,8 +2480,8 @@ help-zle() help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE)) zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}" } -#k# display help for keybindings and ZLE (cycle pages with consecutive use) -zle -N help-zle && bindkey '^xz' help-zle +#k# display help for keybindings and ZLE +zle -N help-zle && bindkey '^xz' help-zle # note: cycle pages with consecutive use of '^xz' # grep for running process, like: 'any vim' any() { @@ -2552,11 +2616,12 @@ alias lsnewdir="ls -rthdl *(/om[1,10]) .*(D/om[1,10])" alias lsolddir="ls -rthdl *(/Om[1,10]) .*(D/Om[1,10])" # some useful aliases -#a2# Remove current empty directory. Execute \kbd{cd ..; rmdir $OLDCWD} +#a2# Remove current empty directory. Execute \kbd{cd ..; rmdir \$OLDCWD} alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD' #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' +#a2# scp with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"' # work around non utf8 capable software in utf environment via $LANG and luit @@ -2625,11 +2690,11 @@ cdt() { } #f5# Create directory under cursor or the selected area -# Press ctrl-xM to create the directory under the cursor or the selected area. -# To select an area press ctrl-@ or ctrl-space and use the cursor. -# Use case: you type "mv abc ~/testa/testb/testc/" and remember that the -# directory does not exist yet -> press ctrl-XM and problem solved inplaceMkDirs() { + # Press ctrl-xM to create the directory under the cursor or the selected area. + # To select an area press ctrl-@ or ctrl-space and use the cursor. + # Use case: you type "mv abc ~/testa/testb/testc/" and remember that the + # directory does not exist yet -> press ctrl-XM and problem solved local PATHTOMKDIR if ((REGION_ACTIVE==1)); then local F=$MARK T=$CURSOR @@ -2656,6 +2721,7 @@ inplaceMkDirs() { zle end-of-line fi } + #k# mkdir -p from string under cursor or marked area zle -N inplaceMkDirs && bindkey '^xM' inplaceMkDirs