diff options
author | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2001-04-02 11:35:58 +0000 |
---|---|---|
committer | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2001-04-02 11:35:58 +0000 |
commit | 0997bf870557b99a01eb9e640088ba700d2864f5 (patch) | |
tree | c18672647945f2fd9fe7addf7bc951b805535de4 /Completion | |
parent | 6175a149f9ad777f646b7376675eda759cb263d2 (diff) | |
download | zsh-0997bf870557b99a01eb9e640088ba700d2864f5.tar.gz zsh-0997bf870557b99a01eb9e640088ba700d2864f5.tar.xz zsh-0997bf870557b99a01eb9e640088ba700d2864f5.zip |
moved from Completion/Core/_files
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Unix/Type/_files | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Completion/Unix/Type/_files b/Completion/Unix/Type/_files new file mode 100644 index 000000000..03453bc48 --- /dev/null +++ b/Completion/Unix/Type/_files @@ -0,0 +1,90 @@ +#autoload + +local opts tmp glob pat pats expl tag i def descr end ign ret=1 match tried +local type sdef + +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#-}#?}" +if (( $tmp[(I)-g*] )); then + glob="${${${${(@M)tmp:#-g*}#-g}##[[:blank:]]#}%%[[:blank:]]#}" + [[ "$glob" = *[^\\][[:blank:]]* ]] && + glob="{${glob//(#b)([^\\])[[:blank:]]##/${match[1]},}}" +fi +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 *(-/):directories" '*:all-files ' ) + else + pats=( " ${glob//:/\\:}:globbed-files " + '*(-/):directories ' '*:all-files ' ) + fi + elif [[ "$type" = */* ]]; then + pats=( '*(-/):directories ' '*:all-files ' ) + else + pats=( '*:all-files ' ) + fi +fi + +tried=() +for def in "$pats[@]"; do + eval "def=( ${${def:s/\\:/\\\\\\\\\\\\:}//(#b)([][()|*?^#~<>])/\\${match[1]}} )" + for sdef in "$def[@]"; do + + tag="${${sdef#*[^\\]:}%%:*}" + pat="${${sdef%%:${tag}*}//\\:/:}" + + (( $tried[(I)${(q)pat}] )) && continue + + tried=( "$tried[@]" "$pat" ) + + if [[ "$sdef" = *:${tag}:* ]]; then + descr="${(Q)sdef#*:${tag}:}" + else + descr=file + end=yes + fi + + _tags "$tag" + while _tags; do + _comp_ignore=() + while _next_label "$tag" expl "$descr"; do + _comp_ignore=( $_comp_ignore $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 )) || break + done + [[ "$pat" = '*' ]] && return ret + done + (( ret )) || return 0 +done + +return 1 |