diff options
-rw-r--r-- | Completion/Base/Completer/_complete | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Completion/Base/Completer/_complete b/Completion/Base/Completer/_complete new file mode 100644 index 000000000..28bb008ca --- /dev/null +++ b/Completion/Base/Completer/_complete @@ -0,0 +1,144 @@ +#autoload + +# Generate all possible completions. Note that this is not intended as +# a normal completion function, but as one possible value for the +# completer style. + +local comp name oldcontext ret=1 service +typeset -T curcontext="$curcontext" ccarray + +oldcontext="$curcontext" + +# If we have a user-supplied context name, use only that. + +if [[ -n "$compcontext" ]]; then + + if [[ "${(t)compcontext}" = *array* ]]; then + local expl + + _wanted values expl value compadd -a - compcontext + + elif [[ "${(t)compcontext}" = *assoc* ]]; then + local expl tmp i + + tmp=() + for i in "${(@k)compcontext[(R)*[^[:blank:]]]}"; do + tmp=( "$tmp[@]" "${i}:${compcontext[$i]}" ) + done + tmp=( "$tmp[@]" "${(k@)compcontext[(R)[[:blank:]]#]}" ) + + _describe -t values value tmp + + elif [[ "$compcontext" = *:*:* ]]; then + local tag="${${compcontext%%:*}:-values}" + local descr="${${${compcontext#${tag}:}%%:*}:-value}" + local action="${compcontext#${tag}:${descr}:}" expl ws ret=1 + + case "$action" in + \ #) + _message "$descr";; + + \(\(*\)\)) + eval ws\=\( "${action[3,-3]}" \) + + _describe -t "$tag" "$descr" ws;; + + \(*\)) + eval ws\=\( "${action[2,-2]}" \) + + _wanted "$tag" expl "$descr" compadd -a - ws;; + + \{*\}) + _tags "$tag" + while _tags; do + while _next_label "$tag" expl "$descr"; do + eval "$action[2,-2]" && ret=0 + done + (( ret )) || break + done;; + + \ *) + eval ws\=\( "$action" \) + + _tags "$tag" + while _tags; do + while _next_label "$tag" expl "$descr"; do + "$ws[@]" + done + (( ret )) || break + done;; + + *) + eval ws\=\( "$action" \) + + _tags "$tag" + while _tags; do + while _next_label "$tag" expl "$descr"; do + "$ws[1]" "$expl[@]" "${(@)ws[2,-1]}" + done + (( ret )) || break + done;; + + esac + + else + ccarray[3]="$compcontext" + + comp="$_comps[$compcontext]" + [[ -z "$comp" ]] || "$comp" + fi + + return +fi + +# An entry for `-first-' is the replacement for `compctl -T' + +comp="$_comps[-first-]" +if [[ ! -z "$comp" ]]; then + service="${_services[-first-]:--first-}" + ccarray[3]=-first- + "$comp" && ret=0 + if [[ "$_compskip" = all ]]; then + _compskip= + return ret + fi +fi + +# If we are inside `vared' and we don't have a $compcontext, we treat +# this like a parameter assignment. Which it is. + +[[ -n $compstate[vared] ]] && compstate[context]=vared + +# For arguments and command names we use the `_normal' function. + +ret=1 +if [[ "$compstate[context]" = command ]]; then + curcontext="$oldcontext" + _normal -s && ret=0 +else + # Let's see if we have a special completion definition for the other + # possible contexts. + + local cname="-${compstate[context]:s/_/-/}-" + + ccarray[3]="$cname" + + comp="$_comps[$cname]" + service="${_services[$cname]:-$cname}" + + # If not, we use default completion, if any. + + if [[ -z "$comp" ]]; then + if [[ "$_compskip" = *default* ]]; then + _compskip= + return 1 + fi + comp="$_comps[-default-]" + fi + [[ -z "$comp" ]] || + service="${_services[-default-]:--default-}" && "$comp" && ret=0 +fi + +_compskip= + +return ret |