#autoload local opts tmp glob pats tags expl tag ret=1 i pat descr minus local _comp_default_tags zparseopts -a opts \ '/=tmp' 'f=tmp' 'g+:-=tmp' q n 1 2 P: S: r: R: W: X+: M+: F: J+: V+: type="${(@j::M)${(@)tmp#-}#?}" (( $tmp[(I)-g*] )) && glob="${(j: :)${(M)tmp:#-g*}#-g}" if zstyle -a ":completion:${curcontext}:" file-patterns pats; then [[ "$type" = */* ]] && glob="$glob *(-/)" pats=( \ ${(M)^${pats/#:/ ${glob:-\*}:}:#*[^\\]:*} ) else if [[ "$type" = *g* ]]; then if [[ "$type" = */* ]]; then pats=( " ${glob//:/\\:} *(-/):globbed-files" '*:all-files' ) else pats=( " ${glob//:/\\:}:globbed-files" '*(-/):directories' '*:all-files' ) fi elif [[ "$type" = */* ]]; then pats=( '*(-/):directories' '*:all-files' ) else pats=( '*:all-files' ) fi fi tags=( "${(@)${(@)pats#*[^\\]:}%%:*}" ) _comp_default_tags=( "$tags[@]" ) _tags "$tags[@]" while _tags; do for tag in "$tags[@]"; do if _requested "$tag"; then i="$pats[(I)*[^\\\\]:${tag}(|:*)]" pat="${${pats[i]%%:${tag}*}//\\\\:/:}" if [[ i -gt 0 && "$pat" != \ # ]]; then if [[ "$pats[i]" = *:${tag}:* ]]; then descr="${pats[i]#*:${tag}:}" minus=() else descr=file minus=(-) fi _loop "$tag" expl "$descr" \ _path_files -g "$pat" "$opts[@]" "$minus[@]" && ret=0 fi fi done (( ret )) || return 0 done return 1