#autoload # This completer function is intended to be used as the first completer # function and allows one to say more explicitly when and how the word # from the line should be expanded than expand-or-complete. # This function will allow other completer functions to be called if # the expansions done produce no result or do not change the original # word from the line. setopt localoptions nullglob [[ _matcher_num -gt 1 ]] && return 1 local exp word="$PREFIX$SUFFIX" sort expr expl subd suf=" " local curcontext="${curcontext/:[^:]#:/:expand:}" # First, see if we should insert all *completions*. if zstyle -s ":completion:${curcontext}:" completions expr && [[ "${(e):-\$[$expr]}" -eq 1 ]]; then compstate[insert]=all return 1 fi # In exp we will collect the expansion. exp=("$word") # First try substitution. That weird thing spanning multiple lines # changes quoted spaces, tabs, and newlines into spaces. zstyle -s ":completion:${curcontext}:" substitute expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] && exp=( "${(e)exp//\\[ ]/ }" ) # If the array is empty, store the original string again. (( $#exp )) || exp=("$word") subd=("$exp[@]") # Now try globbing. zstyle -s ":completion:${curcontext}:" glob expr && [[ "${(e):-\$[$expr]}" -eq 1 ]] && exp=( ${~exp} ) # If we don't have any expansions or only one and that is the same # as the original string, we let other completers run. (( $#exp )) || exp=("$subd[@]") [[ $#exp -eq 1 && "$exp[1]" = "$word"(|\(N\)) ]] && return 1 # With subst-globs-only we bail out if there were no glob expansions, # regardless of any substitutions zstyle -s ":completion:${curcontext}:" subst-globs-only expr && [[ "${(e):-\$[$expr]}" -eq 1 && "$subd" = "$exp"(|\(N\)) ]] && return 1 # Now add as matches whatever the user requested. zstyle -s ":completion:${curcontext}:" sort sort [[ "$sort" = (yes|true|1|on) ]] && exp=( "${(@o)exp}" ) # If there is only one expansion, add a suitable suffix (($#exp == 1)) && suf='' && [[ -d $exp ]] && suf='/' if [[ -z "$compstate[insert]" ]] ;then _description all-expansions expl 'all expansions' "o:$word" compadd "$expl[@]" -UQ -qS "$suf" - "$exp" else _tags all-expansions expansions original _requested all-expansions expl 'all expansions' "o:$word" && compadd "$expl[@]" -UQ -qS "$suf" - "$exp" if [[ $#exp -gt 1 ]] && _requested expansions; then if [[ "$sort" = menu ]]; then _description expansions expl expansions "o:$word" else _description -V expansions expl expansions "o:$word" fi compadd "$expl[@]" -UQ - "$exp[@]" fi _requested original expl original && compadd "$expl[@]" -UQ - "$word" compstate[insert]=menu fi return 0