summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-02 11:35:58 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-04-02 11:35:58 +0000
commit0997bf870557b99a01eb9e640088ba700d2864f5 (patch)
treec18672647945f2fd9fe7addf7bc951b805535de4
parent6175a149f9ad777f646b7376675eda759cb263d2 (diff)
downloadzsh-0997bf870557b99a01eb9e640088ba700d2864f5.tar.gz
zsh-0997bf870557b99a01eb9e640088ba700d2864f5.zip
moved from Completion/Core/_files
-rw-r--r--Completion/Unix/Type/_files90
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