about summary refs log tree commit diff
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.tar.xz
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