X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=89beb3678e22138c8f1dc1b5f7f6d601ddca8843;hb=6eed6ec8a51ca1e9f2f3f826fdfb44d51a64ebf9;hp=c38176afc64cb6ff96afeedee8cea2b2e28c0480;hpb=fbb9d8dd636b098ba25558cfef0886ed10181028;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index c38176a..89beb36 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -414,6 +414,148 @@ bindkey '^Xi' insert-unicode-char # bindkey '\eq' push-line-or-edit # }}} +# a generic accept-line wrapper {{{ + +# This widget can prevent unwanted autocorrections from command-name +# to _command-name, rehash automatically on enter and call any number +# of builtin and user-defined widgets in different contexts. +# +# For a broader description, see: +# +# +# The code is imported from the file 'zsh/functions/accept-line' from +# , which +# distributed under the same terms as zsh itself. + +# A newly added command will may not be found or will cause false +# correction attempts, if you got auto-correction set. By setting the +# following style, we force accept-line() to rehash, if it cannot +# find the first word on the command line in the $command[] hash. +zstyle ':acceptline:*' rehash true + +function Accept-Line() { + setopt localoptions noksharrays + local -a subs + local -xi aldone + local sub + + zstyle -a ":acceptline:${alcontext}" actions subs + + (( ${#subs} < 1 )) && return 0 + + (( aldone = 0 )) + for sub in ${subs} ; do + [[ ${sub} == 'accept-line' ]] && sub='.accept-line' + zle ${sub} + + (( aldone > 0 )) && break + done +} + +function Accept-Line-getdefault() { + local default_action + + zstyle -s ":acceptline:${alcontext}" default_action default_action + case ${default_action} in + ((accept-line|)) + printf ".accept-line" + ;; + (*) + printf ${default_action} + ;; + esac +} + +function accept-line() { + setopt localoptions noksharrays + local -a cmdline + local -x alcontext + local buf com fname format msg default_action + + alcontext='default' + buf="${BUFFER}" + cmdline=(${(z)BUFFER}) + com="${cmdline[1]}" + fname="_${com}" + + zstyle -t ":acceptline:${alcontext}" rehash \ + && [[ -z ${commands[$com]} ]] \ + && rehash + + if [[ -n ${reswords[(r)$com]} ]] \ + || [[ -n ${aliases[$com]} ]] \ + || [[ -n ${functions[$com]} ]] \ + || [[ -n ${builtins[$com]} ]] \ + || [[ -n ${commands[$com]} ]] ; then + + # there is something sensible to execute, just do it. + alcontext='normal' + zle Accept-Line + + default_action=$(Accept-Line-getdefault) + zstyle -T ":acceptline:${alcontext}" call_default \ + && zle ${default_action} + return + fi + + if [[ -o correct ]] \ + || [[ -o correctall ]] \ + && [[ -n ${functions[$fname]} ]] ; then + + # nothing there to execute but there is a function called + # _command_name; a completion widget. Makes no sense to + # call it on the commandline, but the correct{,all} options + # will ask for it nevertheless, so warn the user. + if [[ ${LASTWIDGET} == 'accept-line' ]] ; then + # Okay, we warned the user before, he called us again, + # so have it his way. + alcontext='force' + zle Accept-Line + + default_action=$(Accept-Line-getdefault) + zstyle -T ":acceptline:${alcontext}" call_default \ + && zle ${default_action} + return + fi + + # prepare warning message for the user, configurable via zstyle. + zstyle -s ":acceptline:${alcontext}" compwarnfmt msg + + if [[ -z ${msg} ]] ; then + msg="%c will not execute and completion %f exists." + fi + + zformat -f msg "${msg}" "c:${com}" "f:${fname}" + + zle -M -- "${msg}" + return + elif [[ -n ${buf//[$' \t\n']##/} ]] ; then + # If we are here, the commandline contains something that is not + # executable, which is neither subject to _command_name correction + # and is not empty. might be a variable assignment + alcontext='misc' + zle Accept-Line + + default_action=$(Accept-Line-getdefault) + zstyle -T ":acceptline:${alcontext}" call_default \ + && zle ${default_action} + return + fi + + # If we got this far, the commandline only contains whitespace, or is empty. + alcontext='empty' + zle Accept-Line + + default_action=$(Accept-Line-getdefault) + zstyle -T ":acceptline:${alcontext}" call_default \ + && zle ${default_action} +} + +zle -N accept-line +zle -N Accept-Line + +# }}} + # power completion - abbreviation expansion {{{ # power completion / abbreviation expansion / buffer expansion # see http://zshwiki.org/home/examples/zleiab for details @@ -1219,149 +1361,178 @@ isgrmlcd && limit core 0 # important for a live-cd-system limit -s # }}} -# {{{ completion stuff +# {{{ completion system # called later (via is4 && grmlcomp) # notice: use 'zstyle' for getting current settings # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output -# TODO: make grmlcomp() readable. :-) grmlcomp() { -## completion system -## no initial indention in grmlcomp(), the lines are long enough already. -zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer -zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' # don't complete backup files as executables -zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string -zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' # -zstyle ':completion:*:correct:*' original true # -zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!) -zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion -zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -' with menu -zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer -zstyle ':completion:*:history-words' list false # -zstyle ':completion:*:history-words' menu yes # activate menu -zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries -zstyle ':completion:*:history-words' stop yes # -zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase -zstyle ':completion:*:matches' group 'yes' # separate matches into groups -zstyle ':completion:*' group-name '' -if [[ -z "$NOMENU" ]] ; then - zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu -else - setopt no_auto_menu # don't use any menus at all -fi -zstyle ':completion:*:messages' format '%d' # -zstyle ':completion:*:options' auto-description '%d' # -zstyle ':completion:*:options' description 'yes' # describe options in full -zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes -zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts -zstyle ':completion:*' verbose true # provide verbose completion information - -# recent (as of Dec 2007) zsh versions are able to provide descriptions -# for commands (read: 1st word in the line) that it will list for the user -# to choose from. The following disables that, because it's not exactly fast. -zstyle ':completion:*:-command-:*:' verbose false - -zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings -zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile -zstyle ':completion:correct:' prompt 'correct to: %e' # -zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have: - -# complete manual by their section -zstyle ':completion:*:manuals' separate-sections true -zstyle ':completion:*:manuals.*' insert-sections true -zstyle ':completion:*:man:*' menu yes select - -## correction -# run rehash on completion so new installed program are found automatically: -_force_rehash() { - (( CURRENT == 1 )) && rehash - return 1 # Because we didn't really complete anything -} -# some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it -if [[ -n "$NOCOR" ]] ; then - zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored - setopt nocorrect # do not try to correct the spelling if possible -else -# zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _ignored _correct _approximate _files - setopt correct # try to correct the spelling if possible - zstyle -e ':completion:*' completer ' - if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then - _last_try="$HISTNO$BUFFER$CURSOR" - reply=(_complete _match _ignored _prefix _files) - else - if [[ $words[1] == (rm|mv) ]] ; then - reply=(_complete _files) + # TODO: This could use some additional information + + # allow one error for every three characters typed in approximate completer + zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' + + # don't complete backup files as executables + zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' + + # start menu completion only if it could find no unambiguous initial string + zstyle ':completion:*:correct:*' insert-unambiguous true + zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' + zstyle ':completion:*:correct:*' original true + + # activate color-completion + zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} + + # format on completion + zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' + + # complete 'cd -' with menu + zstyle ':completion:*:*:cd:*:directory-stack' menu yes select + + # insert all expansions for expand completer + zstyle ':completion:*:expand:*' tag-order all-expansions + zstyle ':completion:*:history-words' list false + + # activate menu + zstyle ':completion:*:history-words' menu yes + + # ignore duplicate entries + zstyle ':completion:*:history-words' remove-all-dups yes + zstyle ':completion:*:history-words' stop yes + + # match uppercase from lowercase + zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' + + # separate matches into groups + zstyle ':completion:*:matches' group 'yes' + zstyle ':completion:*' group-name '' + + if [[ -z "$NOMENU" ]] ; then + # if there are more than 5 options allow selecting from a menu + zstyle ':completion:*' menu select=5 + else + # don't use any menus at all + setopt no_auto_menu + fi + + zstyle ':completion:*:messages' format '%d' + zstyle ':completion:*:options' auto-description '%d' + + # describe options in full + zstyle ':completion:*:options' description 'yes' + + # on processes completion complete all user processes + zstyle ':completion:*:processes' command 'ps -au$USER' + + # offer indexes before parameters in subscripts + zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters + + # provide verbose completion information + zstyle ':completion:*' verbose true + + # recent (as of Dec 2007) zsh versions are able to provide descriptions + # for commands (read: 1st word in the line) that it will list for the user + # to choose from. The following disables that, because it's not exactly fast. + zstyle ':completion:*:-command-:*:' verbose false + + # set format for warnings + zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' + + # define files to ignore for zcompile + zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' + zstyle ':completion:correct:' prompt 'correct to: %e' + + # Ignore completion functions for commands you don't have: + zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' + + # complete manual by their section + zstyle ':completion:*:manuals' separate-sections true + zstyle ':completion:*:manuals.*' insert-sections true + zstyle ':completion:*:man:*' menu yes select + + # run rehash on completion so new installed program are found automatically: + _force_rehash() { + (( CURRENT == 1 )) && rehash + return 1 + } + + ## correction + # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it + if [[ -n "$NOCOR" ]] ; then + zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored + setopt nocorrect + else + # try to be smart about when to use what completer... + setopt correct + zstyle -e ':completion:*' completer ' + if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then + _last_try="$HISTNO$BUFFER$CURSOR" + reply=(_complete _match _ignored _prefix _files) else - reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files) - fi - fi' -fi -# zstyle ':completion:*' completer _complete _correct _approximate -# zstyle ':completion:*' expand prefix suffix - -# automatic rehash? Credits go to Frank Terbeck -# my_accept() { -# local buf -# [[ -z ${BUFFER} ]] && zle accept-line && return -# buf=( ${(z)BUFFER} ) -# [[ -z ${commands[${buf[1]}]} ]] && rehash -# zle accept-line -# } -# zle -N my_accept -# bindkey "^M" my_accept + if [[ $words[1] == (rm|mv) ]] ; then + reply=(_complete _files) + else + reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files) + fi + fi' + fi -# command for process lists, the local web server details and host completion -zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' + # zstyle ':completion:*' completer _complete _correct _approximate + # zstyle ':completion:*' expand prefix suffix -# caching -[[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \ - zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/ + # command for process lists, the local web server details and host completion + zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' -# host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */ -if is42 ; then - [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=() - [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(