mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-20 14:04:03 +01:00
91 lines
2.1 KiB
Plaintext
91 lines
2.1 KiB
Plaintext
#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
|