mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-30 17:50:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			101 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #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.
 | |
| #
 | |
| # 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 () {
 | |
|   local opts
 | |
|   zparseopts -D -a opts S: q
 | |
|   
 | |
|   # 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
 | |
|   zstyle -s ":completion:${curcontext}:" cache-policy update_policy
 | |
|   if [[ -z "$update_policy" ]]; then
 | |
|     zstyle ":completion:${curcontext}:" cache-policy \
 | |
|       _perl_modules_caching_policy
 | |
|   fi
 | |
|   
 | |
|   if ( [[ ${+_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
 | |
|       _perl_modules=( $(pminst) )
 | |
|     else
 | |
|       local inc libdir new_pms
 | |
|       if (( ${+commands[perl]} )); 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 ..."
 | |
|   
 | |
|         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
 | |
|   
 | |
|         # Find all modules
 | |
|         if [[ -d $libdir && -x $libdir ]]; then
 | |
|         cd $libdir
 | |
|         new_pms=( {[A-Z]*/***/,}*.pm~*blib*(N) )
 | |
|         cd $OLDPWD
 | |
|         fi
 | |
|   
 | |
|         # Convert to Perl nomenclature
 | |
|         new_pms=( ${new_pms:r:fs#/#::#} )
 | |
|   
 | |
|         _perl_modules=( $new_pms $_perl_modules )
 | |
|       done
 | |
|     fi
 | |
|   
 | |
|     _store_cache perl_modules _perl_modules
 | |
|   fi
 | |
|   
 | |
|   local expl
 | |
|   
 | |
|   _wanted modules expl 'Perl modules' compadd "$opts[@]" -a _perl_modules
 | |
| }
 | |
| 
 | |
| _perl_modules_caching_policy () {
 | |
|   local _perllocals
 | |
| 
 | |
|   # rebuild if cache is more than a week old
 | |
|   oldp=( "$1"(Nmw+1) )
 | |
|   (( $#oldp )) && return 0
 | |
| 
 | |
|   _perllocals=( /usr/lib/perl5/**/perllocal.pod(N) )
 | |
| 
 | |
|   if (( $#_perllocals )); then
 | |
|     for pod in $_perllocals; do
 | |
|       [[ "$pod" -nt "$1" ]] && return 0
 | |
|     done
 | |
|   fi
 | |
| 
 | |
|   return 1
 | |
| }
 | |
| 
 | |
| _perl_modules "$@"
 |