diff options
Diffstat (limited to 'Completion/Base')
-rw-r--r-- | Completion/Base/Core/_main_complete | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/Completion/Base/Core/_main_complete b/Completion/Base/Core/_main_complete new file mode 100644 index 000000000..f38354815 --- /dev/null +++ b/Completion/Base/Core/_main_complete @@ -0,0 +1,330 @@ +#autoload + +# The main loop of the completion code. This is what is called when +# completion is attempted from the command line. + + +# If you want to complete only set or unset options for the unsetopt +# and setopt builtin, un-comment these lines: +# +# local _options_set _options_unset +# +# _options_set=(${(k)options[(R)on]}) +# _options_unset=(${(k)options[(R)off]}) +# +# This is needed because completion functions may set options locally +# which makes the output of setopt and unsetopt reflect a different +# state than the global one for which you are completing. + +setopt localoptions ${_comp_options[@]} + +exec </dev/null # ZLE closes stdin, which can cause errors + +# Failed returns from this code are not real errors +setopt localtraps noerrexit ; trap - ZERR + +local func funcs ret=1 tmp _compskip format nm call match min max i num\ + _completers _completer _completer_num curtag _comp_force_list \ + _matchers _matcher _c_matcher _matcher_num _comp_tags _comp_mesg \ + mesg str context state line opt_args val_args curcontext="$curcontext" \ + _last_nmatches=-1 _last_menu_style _def_menu_style _menu_style sel \ + _saved_exact="${compstate[exact]}" \ + _saved_lastprompt="${compstate[last_prompt]}" \ + _saved_list="${compstate[list]}" \ + _saved_insert="${compstate[insert]}" \ + _saved_colors="$ZLS_COLORS" + +typeset -U _lastdescr _comp_ignore _comp_colors + +[[ -z "$curcontext" ]] && curcontext=::: + +zstyle -s ":completion:${curcontext}:" insert-tab tmp || tmp=no + +if [[ "$tmp" = *pending(|[[:blank:]]*) || + ( "$tmp" = *pending=(#b)([0-9]##)(|[[:blank:]]*) && + PENDING -ge $match[1] ) ]]; then + compstate[insert]=tab + + return 0 +fi + +if [[ "$compstate[insert]" = tab* ]]; then + { [[ "$tmp" = (|[[:blank:]]*)(yes|true|on|1)(|[[:blank:]]*) ]] && + { [[ "$curcontext" != :* || -z "$compstate[vared]" ]] || + zstyle -t ":completion:vared${curcontext}:" insert-tab } } && return 0 + + compstate[insert]="${compstate[insert]//tab /}" +fi + +# Special completion contexts after `~' and `='. + +if [[ -z "$compstate[quote]" ]]; then + if compset -P 1 '='; then + compstate[context]=equal + elif [[ "$PREFIX" != */* && "$PREFIX[1]" = '~' ]]; then + compset -p 1 + compstate[context]=tilde + fi +fi + +# Initial setup. + +_setup default +_def_menu_style=( "$_last_menu_style[@]" + +# We can't really do that because the current value of $MENUSELECT +# may be the one set by this function. +# There is a similar problem with $ZLS_COLORS in _setup. + +# ${MENUSELECT+select${MENUSELECT:+\=$MENUSELECT}} + + ) +_last_menu_style=() + +if zstyle -s ":completion:${curcontext}:default" list-prompt tmp; then + LISTPROMPT="$tmp" + zmodload -i zsh/complist +fi +if zstyle -s ":completion:${curcontext}:default" select-prompt tmp; then + MENUPROMPT="$tmp" + zmodload -i zsh/complist +fi +if zstyle -s ":completion:${curcontext}:default" select-scroll tmp; then + MENUSCROLL="$tmp" + zmodload -i zsh/complist +fi + +# Get the names of the completers to use in the positional parameters. + +if (( $# )); then + if [[ "$1" = - ]]; then + if [[ $# -lt 3 ]]; then + _completers=() + else + _completers=( "$2" ) + call=yes + fi + else + _completers=( "$@" ) + fi +else + zstyle -a ":completion:${curcontext}:" completer _completers || + _completers=( _complete _ignored ) +fi + +# And now just call the completer functions defined. + +_completer_num=1 + +# Call the pre-functions. + +funcs=( "$compprefuncs[@]" ) +compprefuncs=() +for func in "$funcs[@]"; do + "$func" +done + +for tmp in "$_completers[@]"; do + + if [[ -n "$call" ]]; then + _completer="${tmp}" + elif [[ "$tmp" = *:-* ]]; then + _completer="${${tmp%:*}[2,-1]//_/-}${tmp#*:}" + tmp="${tmp%:*}" + elif [[ $tmp = *:* ]]; then + _completer="${tmp#*:}" + tmp="${tmp%:*}" + else + _completer="${tmp[2,-1]//_/-}" + fi + curcontext="${curcontext/:[^:]#:/:${_completer}:}" + + zstyle -a ":completion:${curcontext}:" matcher-list _matchers || + _matchers=( '' ) + + _matcher_num=1 + _matcher='' + for _c_matcher in "$_matchers[@]"; do + if [[ "$_c_matcher" == +* ]]; then + _matcher="$_matcher $_c_matcher[2,-1]" + else + _matcher="$_c_matcher" + fi + + _comp_mesg= + if [[ -n "$call" ]]; then + if "${(@)argv[3,-1]}"; then + ret=0 + break 2 + fi + elif "$tmp"; then + ret=0 + break 2 + fi + (( _matcher_num++ )) + done + [[ -n "$_comp_mesg" ]] && break + + (( _completer_num++ )) +done + +curcontext="${curcontext/:[^:]#:/::}" +nm=$compstate[nmatches] + +if [[ $compstate[old_list] = keep || nm -gt 1 ]]; then + [[ _last_nmatches -ge 0 && _last_nmatches -ne nm ]] && + _menu_style=( "$_last_menu_style[@]" "$_menu_style[@]" ) + + tmp=$(( compstate[list_lines] + BUFFERLINES + 1 )) + + _menu_style=( "$_menu_style[@]" "$_def_menu_style[@]" ) + + if [[ "$compstate[list]" = *list && tmp -gt LINES && + ( -n "$_menu_style[(r)select=long-list]" || + -n "$_menu_style[(r)(yes|true|on|1)=long-list]" ) ]]; then + compstate[insert]=menu + elif [[ "$compstate[insert]" = "$_saved_insert" ]]; then + if [[ -n "$compstate[insert]" && + -n "$_menu_style[(r)(yes|true|1|on)=long]" && tmp -gt LINES ]]; then + compstate[insert]=menu + else + sel=( "${(@M)_menu_style:#(yes|true|1|on)*}" ) + + if (( $#sel )); then + min=9999999 + for i in "$sel[@]"; do + if [[ "$i" = *\=[0-9]* ]]; then + num="${i#*\=}" + [[ num -lt 0 ]] && num=0 + elif [[ "$i" != *\=* ]]; then + num=0 + else + num=9999999 + fi + [[ num -lt min ]] && min="$num" + + (( min )) || break + done + fi + sel=( "${(@M)_menu_style:#(no|false|0|off)*}" ) + + if (( $#sel )); then + max=9999999 + for i in "$sel[@]"; do + if [[ "$i" = *\=[0-9]* ]]; then + num="${i#*\=}" + [[ num -lt 0 ]] && num=0 + elif [[ "$i" != *\=* ]]; then + num=0 + else + num=9999999 + fi + [[ num -lt max ]] && max="$num" + + (( max )) || break + done + fi + if [[ ( -n "$min" && nm -ge min && ( -z "$max" || nm -lt max ) ) || + ( -n "$_menu_style[(r)auto*]" && + "$compstate[insert]" = automenu ) ]]; then + compstate[insert]=menu + elif [[ -n "$max" && nm -ge max ]]; then + compstate[insert]=unambiguous + elif [[ -n "$_menu_style[(r)auto*]" && + "$compstate[insert]" != automenu ]]; then + compstate[insert]=automenu-unambiguous + fi + fi + fi + + if [[ "$compstate[insert]" = *menu* ]]; then + [[ "$MENUSELECT" = 00 ]] && MENUSELECT=0 + if [[ -n "$_menu_style[(r)no-select*]" ]]; then + unset MENUSELECT + elif [[ -n "$_menu_style[(r)select=long*]" ]]; then + if [[ tmp -gt LINES ]]; then + zmodload -i zsh/complist + MENUSELECT=00 + fi + fi + if [[ "$MENUSELECT" != 00 ]]; then + sel=( "${(@M)_menu_style:#select*}" ) + + if (( $#sel )); then + min=9999999 + for i in "$sel[@]"; do + if [[ "$i" = *\=[0-9]* ]]; then + num="${i#*\=}" + [[ num -lt 0 ]] && num=0 + elif [[ "$i" != *\=* ]]; then + num=0 + else + num=9999999 + fi + [[ num -lt min ]] && min="$num" + + (( min )) || break + done + + zmodload -i zsh/complist + MENUSELECT="$min" + else + unset MENUSELECT + fi + fi + fi +elif [[ nm -le 1 && -n "$_comp_mesg" ]]; then + compstate[insert]='' + compstate[list]='list force' +elif [[ nm -eq 0 && -z "$_comp_mesg" && + $#_lastdescr -ne 0 && $compstate[old_list] != keep ]] && + zstyle -s ":completion:${curcontext}:warnings" format format; then + + compstate[list]='list force' + compstate[insert]='' + + tmp=( "\`${(@)^_lastdescr:#}'" ) + + case $#tmp in + 1) str="$tmp[1]";; + 2) str="$tmp[1] or $tmp[2]";; + *) str="${(j:, :)tmp[1,-2]}, or $tmp[-1]";; + esac + + _setup warnings + zformat -f mesg "$format" "d:$str" "D:${(F)${(@)_lastdescr:#}}" + compadd -x "$mesg" +fi + +[[ "$_comp_force_list" = always || + ( "$_comp_force_list" = ?* && nm -ge _comp_force_list ) ]] && + compstate[list]="${compstate[list]//messages} force" + +if [[ "$compstate[old_list]" = keep ]]; then + ZLS_COLORS="$_saved_colors" +elif (( $#_comp_colors )); then + ZLS_COLORS="${(j.:.)_comp_colors}" +else + unset ZLS_COLORS +fi + +# Now call the post-functions. + +funcs=( "$comppostfuncs[@]" ) +comppostfuncs=() +for func in "$funcs[@]"; do + "$func" +done + +_lastcomp=( "${(@kv)compstate}" ) +_lastcomp[nmatches]=$nm +_lastcomp[completer]="$_completer" +_lastcomp[prefix]="$PREFIX" +_lastcomp[suffix]="$SUFFIX" +_lastcomp[iprefix]="$IPREFIX" +_lastcomp[isuffix]="$ISUFFIX" +_lastcomp[qiprefix]="$QIPREFIX" +_lastcomp[qisuffix]="$QISUFFIX" +_lastcomp[tags]="$_comp_tags" + +return ret |