diff options
-rw-r--r-- | Completion/Core/_tags | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Completion/Core/_tags b/Completion/Core/_tags new file mode 100644 index 000000000..af8dc21dd --- /dev/null +++ b/Completion/Core/_tags @@ -0,0 +1,81 @@ +#autoload + +if (( $# )); then + local cmd="$words[1]" func="$funcstack[2]" defs i tags tag pat style prio + + while getopts 'c:f:' i; do + if [[ "$i" = c ]]; then + cmd="$OPTARG" + else + func="$OPTARG" + fi + done + + shift OPTIND-1 + + defs=( "${(@M)argv:#${(kj:|:)~override_tags[(R)(|+*)]}}" ) + (( $#defs )) && set -- "$defs[@]" + + _offered_tags=( "$_offered_tags[@]" "$@" ) + _last_tags=() + + defs=() + for i; do + if [[ -n ${override_tags[$i]} && ${override_tags[$i]} != (\[|+\[)* ]]; then + if [[ ${override_tags[$i]} = *\[* ]]; then + prio=( "${i}:*=${override_tags[$i]#+}" ) + else + prio=( "${i}:${(@v)^comptags[(I)(|*:)${i}(|:*)]}" ) + (( $#prio )) || prio=( "${i}:${comptags[any]}" ) + prio="${${${prio[(r)(|*:)\*=[^:]#\[*\](|:*)]}##(|*:)\*}%%:*}" + prio=( "${i}:*=${override_tags[$i]#+}${(M)prio%%\[*\]}" ) + fi + else + prio=( "${i}:${(@v)^comptags[(I)(|*:)${i}(|:*)]}" ) + (( $#prio )) || prio=( "${i}:${comptags[any]}" ) + fi + defs=( "$defs[@]" "$prio[@]" ) + done + + tags=() + for i in "$defs[@]"; do + tag="${i%%:*}" + for pat in "${(s.:.)i#*:}"; do + if [[ ( "$pat" = _* && "$func" = ${~pat%%\=*} ) || + "$cmd" = ${~pat%%\=*} ]]; then + prio="${pat#*\=}" + [[ "$prio" = -* ]] && continue 2 + + if [[ "$prio" = *\[*\] ]]; then + style="${(M)prio%%\[*}" + prio="${prio%%\[*}" + else + style='' + fi + [[ ${override_tags[$tag]} = (|+)\[* ]] && + style="${override_tags[$tag]#+}" + + (( prio++ )) + + tags[$prio]="${tags[$prio]}:${tag}${style}" + break + fi + done + done + + prios=( "${(@)tags:#}" ) + + return 0 +fi + +_failed_tags=( "$_failed_tags[@]" "$_last_tags[@]" ) + +(( $#prios )) || return 1 + +tags="${prios[1]}:" +shift 1 prios + +_last_tags=( "${(@s.:.)${${tags#:}%:}}" ) +_tried_tags=( "$_tried_tags[@]" "$_last_tags[@]" ) + +return 0 |