about summary refs log tree commit diff
path: root/Completion/User
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User')
-rw-r--r--Completion/User/_perl_modules59
1 files changed, 37 insertions, 22 deletions
diff --git a/Completion/User/_perl_modules b/Completion/User/_perl_modules
index c909055ba..01c2eefa5 100644
--- a/Completion/User/_perl_modules
+++ b/Completion/User/_perl_modules
@@ -1,6 +1,5 @@
 #compdef pmpath pmvers pmdesc pmload pmexp pmeth pmls pmcat pman pmfunc podgrep podtoc podpath
 #
-#
 # _perl_modules - zsh completion function
 #
 # Adam Spiers <adam@spiers.net>
@@ -8,40 +7,56 @@
 # Calculate all installed Perl modules.  The result is cached
 # for future use.
 #
-# Bugs:
-#   - can't cope with multiple installs of Perl
+# 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).
 
-# Change 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).
-local try_to_use_pminst=0
+local opts
+zparseopts -D -a opts S: q
 
 if [[ ${+_perl_modules} -eq 0 ]]; then
-  if [[ $try_to_use_pminst -ne 0 ]] && which pminst >/dev/null; then
+  if zstyle -t ":completion:${curcontext}:modules" try-to-use-pminst \
+     && which pminst >/dev/null; then
     _perl_modules=( $(pminst) )
   else
     local inc libdir new_pms
-    inc=( $( perl -e 'print "@INC"' ) )
-    typeset -agU _perl_modules	# _perl_modules is global, no duplicates
+    if which perl >/dev/null; 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?
+
+      setopt localoptions extendedglob
+      inc=( /usr/lib/perl5{,/{site_perl/,}<5->.([0-9]##)}(N) 
+            ${(s.:.)PERL5LIB} )
+    fi
+
+    typeset -agU _perl_modules  # _perl_modules is global, no duplicates
     _perl_modules=( )
 
     for libdir in $inc; do
-        # Ignore cwd - could be too expensive e.g. if we're near /
-        if [[ $libdir == '.' ]]; then break; fi
+      # Ignore cwd - could be too expensive e.g. if we're near /
+      if [[ $libdir == '.' ]]; then break; fi
 
-	# Find all modules
-	cd $libdir
-        new_pms=( {[A-Z]*/**/,}*.pm(N) )
-	cd $OLDPWD
+      # Find all modules
+      cd $libdir
+      new_pms=( {[A-Z]*/***/,}*.pm~*blib*(N) )
+      cd $OLDPWD
 
-	# Convert to Perl nomenclature
-	new_pms=( ${new_pms:r:fs#/#::#} )
+      # Convert to Perl nomenclature
+      new_pms=( ${new_pms:r:fs#/#::#} )
 
-        _perl_modules=( $new_pms $_perl_modules )
+      _perl_modules=( $new_pms $_perl_modules )
     done
   fi
 fi
 
-compadd - $_perl_modules
+local expl
+
+_wanted modules expl 'Perl modules' compadd "$opts[@]" - $_perl_modules