1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-17 15:01:40 +02:00
zsh/Completion/Core/_files
2000-03-23 04:19:26 +00:00

61 lines
1.4 KiB
Text

#autoload
local opts tmp glob pats tags expl tag ret=1 i pat descr minus
local _comp_default_tags
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#-}#?}"
(( $tmp[(I)-g*] )) && glob="${(j: :)${(M)tmp:#-g*}#-g}"
if zstyle -a ":completion:${curcontext}:" file-patterns pats; then
[[ "$type" = */* ]] && glob="$glob *(-/)"
pats=( \ ${(M)^${pats/#:/ ${glob:-\*}:}:#*[^\\]:*} )
else
if [[ "$type" = *g* ]]; then
if [[ "$type" = */* ]]; then
pats=( " ${glob//:/\\:} *(-/):globbed-files" '*:all-files' )
else
pats=( " ${glob//:/\\:}:globbed-files"
'*(-/):directories' '*:all-files' )
fi
elif [[ "$type" = */* ]]; then
pats=( '*(-/):directories' '*:all-files' )
else
pats=( '*:all-files' )
fi
fi
tags=( "${(@)${(@)pats#*[^\\]:}%%:*}" )
_comp_default_tags=( "$tags[@]" )
_tags "$tags[@]"
while _tags; do
for tag in "$tags[@]"; do
if _requested "$tag"; then
i="$pats[(I)*[^\\\\]:${tag}(|:*)]"
pat="${${pats[i]%%:${tag}*}//\\\\:/:}"
if [[ i -gt 0 && "$pat" != \ # ]]; then
if [[ "$pats[i]" = *:${tag}:* ]]; then
descr="${pats[i]#*:${tag}:}"
minus=()
else
descr=file
minus=(-)
fi
_loop "$tag" expl "$descr" \
_path_files -g "$pat" "$opts[@]" "$minus[@]" && ret=0
fi
fi
done
(( ret )) || return 0
done
return 1