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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#compdef pmpath pmvers pmdesc pmload pmexp pmeth pmls pmcat pman pmfunc podgrep podtoc podpath
#
# _perl_modules - zsh completion function
#
# Adam Spiers <adam@spiers.net>
#
# Calculate all installed Perl modules. The result is cached
# for future use.
#
# Options:
#
# -t[types]: indicate file types; currently the only one is -tP,
# to include .pod files as well as modules.
#
# --perl-hierarchy=...: restrict results to modules under this hierarchy.
# Note that this does not affect the filesystem searching or caching,
# which always collect all results on the premise that anyone using
# completion of Perl modules will use the results in various contexts,
# so this only affects the results compadd'd.
#
# --strip-prefix: when using --perl-hierarchy, strip off that prefix when
# passing to compadd.
#
# All other options passed onto compadd.
#
# Available styles:
#
# * try-to-use-pminst
#
# Set this if you have pminst and want to use it. The zsh code
# actually produces better results because pminst misses modules of
# the form Foo/bar/Baz.pm through its clumsy -d && /^[A-Z]/ && prune
# algorithm (the zsh code does almost the same, but only misses
# modules which don't begin with an uppercase letter).
_perl_modules () {
# Set a sensible default caching policy. This has to be done inside
# this function otherwise we wouldn't know the context for the style.
local update_policy sufpat=".pm" with_pod
local restrict_hierarchy=''
local -i strip_perl_prefix
zstyle -s ":completion:${curcontext}:" cache-policy update_policy
if [[ -z "$update_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy \
_perl_modules_caching_policy
fi
if [[ -n $argv[(r)--perl-hierarchy=*] ]]; then
restrict_hierarchy="${argv[(r)--perl-hierarchy=*]#--perl-hierarchy=}"
restrict_hierarchy="${restrict_hierarchy%::}::"
argv[(r)--perl-hierarchy=*]=()
fi
if [[ -n $argv[(r)--strip-prefix] ]]; then
strip_perl_prefix=1
argv[(r)--strip-prefix]=()
fi
if [[ -n $argv[(r)-tP] ]]; then
argv[(r)-tP]=()
sufpat="(.pm|.pod)"
with_pod=_with_pod
fi
local perl=${words[1]%doc} perl_modules
if whence $perl >/dev/null; then
perl_modules=_${${perl//[^[:alnum:]]/_}#_}_modules$with_pod
elif (( ${+commands[perl]} )); then
perl=perl
perl_modules=_perl_modules$with_pod
else
perl=
perl_modules=_unknown_perl_modules$with_pod
fi
if ( [[ ${(P)+perl_modules} -eq 0 ]] || _cache_invalid $perl_modules ) &&
! _retrieve_cache ${perl_modules#_};
then
if zstyle -t ":completion:${curcontext}:modules" try-to-use-pminst &&
(( ${+commands[pminst]} ));
then
set -A $perl_modules $(pminst)
else
local inc libdir new_pms
if [[ ${+perl} -eq 1 ]]; then
inc=( $( $perl -e 'print "@INC"' ) )
else
# If perl isn't there, one wonders why the user's trying to
# complete Perl modules. Maybe her $path is wrong?
_message "didn't find perl on \$PATH; guessing @INC ..."
inc=( /usr/lib/perl5{,/{site_perl/,}<5->.([0-9]##)}(N)
${(s.:.)PERL5LIB} )
fi
typeset -agU $perl_modules # $perl_modules is global, no duplicates
set -A $perl_modules
for libdir in $inc; do
# Ignore cwd - could be too expensive e.g. if we're near /
if [[ $libdir == '.' ]]; then continue; fi
# Find all modules
if [[ -d $libdir && -x $libdir ]]; then
new_pms=( $libdir/{[A-Z]*/***/,}*${~sufpat}~*blib* )
new_pms=( "${(@)new_pms##$libdir/##}" )
fi
# Convert to Perl nomenclature
new_pms=( ${new_pms:r:fs#/#::#} )
set -A $perl_modules $new_pms ${(P)perl_modules}
done
fi
_store_cache ${perl_modules#_} $perl_modules
fi
# Nothing above here should have filtered the results per-caller, so that
# the cache is always complete. From here on, it's safe to filter.
local -a perl_subset
if [[ -n $restrict_hierarchy ]]; then
perl_subset=( ${(PM)perl_modules:#${restrict_hierarchy}*} )
if (( strip_perl_prefix )); then
perl_subset=( ${perl_subset#$restrict_hierarchy} )
fi
perl_modules=perl_subset
fi
local expl
_wanted modules expl 'Perl module' compadd "$@" -a - $perl_modules
}
_perl_modules_caching_policy () {
local _perllocals
local -a oldp
# rebuild if cache is more than a week old
oldp=( "$1"(mw+1) )
(( $#oldp )) && return 0
_perllocals=( /usr/lib/perl5/**/perllocal.pod )
if (( $#_perllocals )); then
for pod in $_perllocals; do
[[ "$pod" -nt "$1" ]] && return 0
done
fi
return 1
}
_perl_modules "$@"
|