#autoload local tname="$funcstack[2,-1]" if (( $# )); then local cmd="$words[1]" defs i ttags tag pat style prio context opt while getopts 'c:C:' opt; do if [[ "$opt" = c ]]; then cmd="$OPTARG" else context="$OPTARG" fi done shift OPTIND-1 [[ -n "$context" ]] && context="/$context" 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 ttags=() for i in "$defs[@]"; do tag="${i%%:*}" for pat in "${(s.:.)i#*:}"; do if [[ "$cmd$context" = ${~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++ )) ttags[$prio]="${ttags[$prio]}:${tag}${style}" break fi done done prio="_prio_arr$(( _prio_num++ ))" _prio_names[$tname]="$prio" ttags=( "${(@)ttags:#}" ) eval "${prio}=( \"\$ttags[@]\" )" return \!$#ttags fi local prios="$_prio_names[$tname]" _failed_tags=( "$_failed_tags[@]" "$_last_tags" ) (( ${(P)#prios} )) || return 1 _cur_tags[$tname]="${(@)${(@P)prios}[1]}:" _last_tags=( "${(@)${(@s.:.)${(@P)prios}[1]}:#}" ) _tried_tags=( "$_tried_tags[@]" "$_last_tags[@]" ) shift 1 "$prios" return 0