blob: 03453bc4849c364e67725c1e122344c729d3a2fe (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
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
|