From 9a6c7cfabff06e6ffe2c5a145fc55e9035527d51 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Mon, 7 Jul 2003 10:03:50 +0000 Subject: 18811: needed to quote % in substitution as it was otherwise taken as an anchor --- ChangeLog | 5 +++ Completion/Unix/Type/_files | 90 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 Completion/Unix/Type/_files diff --git a/ChangeLog b/ChangeLog index 0ed507cbf..79c1ddf44 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-07-04 Oliver Kiddle + + * 18811: Completion/Unix/Type/_files: needed to quote % in + substitution as users/6154 caused it to be interpreted as an anchor + 2003-07-02 Oliver Kiddle * 18520, 13691 (Mario Lang), 13701 (Sven): 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 -- cgit 1.4.1