#autoload local opts opt type=file glob group gopts dopts aopts tmp _file_pat_checked=yes local hasign ign opts=() group=() gopts=() dopts=(-/) aopts=(-f) ign=() while getopts "P:S:qr:R:W:F:J:V:X:f/g:M:12n" opt; do case "$opt" in /) type="${type}dir" ;; g) type="${type}glob"; gopts=(-g "$OPTARG") ;; [qn12]) opts=("$opts[@]" "-$opt" ) ;; [JV]) group=( "-$opt" "$OPTARG") ;; F) opts=("$opts[@]" "-$opt" "$OPTARG"); hasign=yes ;; [^f]) opts=("$opts[@]" "-$opt" "$OPTARG") ;; esac done if [[ "$group[2]" = files ]]; then opts=("$opts[@]" "$group[@]") group=() fi if zstyle -s ":completion:${curcontext}:all-files" file-patterns tmp && [[ -n "$tmp" ]]; then aopts=(-g "$tmp") fi if zstyle -s ":completion:${curcontext}:directories" file-patterns tmp && [[ -n "$tmp" ]]; then dopts=(-g "$tmp") if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then type=glob elif [[ "$type" != *(dir|glob)* ]]; then type="${type}dir" fi fi if zstyle -s ":completion:${curcontext}:globbed-files" file-patterns tmp && [[ -n "$tmp" ]]; then gopts=(-g "$tmp") if [[ "$type" != (*dir*glob*|*glob*dir*) ]]; then if [[ "$type" = *(dir|glob)* ]]; then type=glob else type=globall fi fi fi case "$type" in *dir*glob*|*glob*dir*) _tags globbed-files all-files ;; *all*glob*|*glob*all*) _tags globbed-files all-files ;; *glob*) _tags globbed-files directories all-files ;; *dir*) _tags directories all-files ;; *) _tags all-files ;; esac while _tags; do if _requested all-files; then if (( $#group )); then group[2]=all-files _setup all-files [[ -z "$hasign" ]] && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore && ign=(-F _comp_ignore) fi _path_files "$opts[@]" "$ign[@]" "$aopts[@]" return elif _requested directories; then if _requested globbed-files; then if (( $#group )); then group[2]=globbed-files _setup globbed-files [[ -z "$hasign" ]] && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore && ign=(-F _comp_ignore) fi _path_files "$opts[@]" "$ign[@]" "$dopts[@]" "$gopts[@]" && return 0 else if (( $#group )); then group[2]=directories _setup directories [[ -z "$hasign" ]] && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore && ign=(-F _comp_ignore) fi _path_files "$opts[@]" "$ign[@]" "$dopts[@]" && return 0 fi elif _requested globbed-files; then if (( $#group )); then group[2]=globbed-files _setup globbed-files [[ -z "$hasign" ]] && zstyle -a ":completion:${curcontext}:all-files" ignored-patterns _comp_ignore && ign=(-F _comp_ignore) fi if [[ "$type" = (*dir*glob*|*glob*dir*) ]]; then _path_files "$opts[@]" "$ign[@]" "$dopts[@]" "$gopts[@]" && return 0 else _path_files "$opts[@]" "$ign[@]" "$gopts[@]" && return 0 fi fi done return 1