1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-02 06:40:55 +01:00
zsh/Completion/Core/_files

75 lines
1.7 KiB
Text

#autoload
local opts tmp glob pat pats expl tag i def descr end ign ret=1
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}"
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" '*:all-files' )
else
pats=( " ${glob//:/\\:}:globbed-files"
'*(-/):directories' '*:all-files' )
fi
elif [[ "$type" = */* ]]; then
pats=( '*(-/):directories' '*:all-files' )
else
pats=( '*:all-files' )
fi
fi
for def in "$pats[@]"; do ###"${(@)${(@)pats#*[^\\]:}%%:*}"; do
tag="${${def#*[^\\]:}%%:*}"
pat="${${def%%:${tag}*}//\\\\:/:}"
if [[ "$pat" != \ # ]]; then
if [[ "$def" = *:${tag}:* ]]; then
descr="${def#*:${tag}:}"
else
descr=file
end=yes
fi
fi
if _wanted "$tag"; then
_comp_ignore=()
while _next_label "$tag" expl "$descr"; do
_comp_ignore=( $_comp_ignored $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 )) || return 0
fi
done
return 1