mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 13:33:52 +01:00
50 lines
1.2 KiB
Plaintext
50 lines
1.2 KiB
Plaintext
#autoload
|
|
|
|
local opts tmp glob pats expl tag i pat descr minus
|
|
|
|
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//\\%p/ ${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
|
|
|
|
for tag in "${(@)${(@)pats#*[^\\]:}%%:*}"; do
|
|
|
|
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
|
|
fi
|
|
|
|
_wanted "$tag" expl "$descr" \
|
|
_path_files -g "$pat" "$opts[@]" "$minus[@]" && return 0
|
|
|
|
done
|
|
|
|
return 1
|