#autoload local opts tmp glob pat pats expl tag i def descr end ign ret=1 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}" ign=$opts[(I)-F] if (( ign )); then ign=( $=opts[ign+1] ) if [[ $ign = _comp_ignore ]]; then ign=( $_comp_ignore ) else opts[tmp+1]=_comp_ignore fi else ign= fi if zstyle -a ":completion:${curcontext}:" file-patterns tmp; then [[ "$type" = */* ]] && glob="$glob *(-/)" pats=() for i in ${tmp//\\%p/ ${${glob:-\*}//:/\\:} }; do if [[ $i = *[^\\]:* ]]; then pats=( "$pats[@]" " $i" ) else pats=( "$pats[@]" " ${i}:files" ) fi done 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 for def in "$pats[@]"; do ###"${(@)${(@)pats#*[^\\]:}%%:*}"; do tag="${${def#*[^\\]:}%%:*}" pat="${${def%%:${tag}*}//\\\\:/:}" if [[ "$pat" != \ # ]]; then if [[ "$def" = *:${tag}:* ]]; then descr="${def#*:${tag}:}" else descr=file end=yes fi fi if _wanted "$tag"; then _comp_ignore=() while _next_label "$tag" expl "$descr"; do _comp_ignore=( $_comp_ignored $ign ) if [[ -n "$end" ]]; then _path_files -g "$pat" "$opts[@]" "$expl[@]" && ret=0 else _path_files "$expl[@]" -g "$pat" "$opts[@]" && ret=0 fi done (( ret )) || return 0 fi done return 1