about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
authorOliver Kiddle <opk@users.sourceforge.net>2003-07-07 10:03:50 +0000
committerOliver Kiddle <opk@users.sourceforge.net>2003-07-07 10:03:50 +0000
commit9a6c7cfabff06e6ffe2c5a145fc55e9035527d51 (patch)
tree6511fccc0259f9ccbd8db12ec058c20a77746b2a /Completion
parent1cb11615aa337d98022a48c1c3c8c5c33b0b57c2 (diff)
downloadzsh-9a6c7cfabff06e6ffe2c5a145fc55e9035527d51.tar.gz
zsh-9a6c7cfabff06e6ffe2c5a145fc55e9035527d51.tar.xz
zsh-9a6c7cfabff06e6ffe2c5a145fc55e9035527d51.zip
18811: needed to quote % in substitution as it was otherwise taken as an anchor
Diffstat (limited to 'Completion')
-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..8a4dfb5b6
--- /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
+tmp=$opts[(I)-F]
+if (( tmp )); then
+  ign=( $=opts[tmp+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:gs/\\:/\\\\\\\\\\\\:}//(#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