From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9301 invoked from network); 12 Mar 2000 13:28:08 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 12 Mar 2000 13:28:08 -0000 Received: (qmail 748 invoked by alias); 12 Mar 2000 13:28:02 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 10087 Received: (qmail 741 invoked from network); 12 Mar 2000 13:28:01 -0000 Date: Sun, 12 Mar 2000 13:28:00 +0000 From: Adam Spiers To: zsh workers mailing list Subject: PATCH: completion for perl Message-ID: <20000312132800.A4937@thelonious.new.ox.ac.uk> Reply-To: Adam Spiers Mail-Followup-To: zsh workers mailing list Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0.1i X-Home-Page: http://www.new.ox.ac.uk/~adam/ X-OS: Linux 2.2.12 i686 Here's completion code for perl, and a few clean-ups to _perl_modules. If anyone would be kind enough to tarball their latest working copy, I'll be able to submit some more stuff (I guess I should also be submitting a .yo patch for this new style, for example), but I'm currently a bit helpless without CVS :-( Whilst struggling with the mess which is _perl_config_vars below, it struck me how an equivalent of compset -P which matched the /whole/ of PREFIX rather than just the beginning would have come in handy. Is this worthwhile, Sven, or is my whole approach coming from the wrong angle? Also, as you can see from the compstate[quoting] line below, I tried to get completion working for $ perl -V:' and $ perl -V:" so that it would insert a single space after each configuration variable completed while within quotes, rather than a quoted single space, but I didn't fully understand how compset -q works, and couldn't stop it from eating up the opening quote. Help! :-) Adam Index: Completion/User/_perl_modules =================================================================== --- Completion/User/_perl_modules Tue Nov 16 16:58:15 1999 +++ Completion/User/_perl_modules Sun Mar 12 11:59:32 2000 @@ -7,16 +7,22 @@ # 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). -# 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 @@ -43,4 +49,4 @@ local expl -_wanted modules expl 'Perl modules' && compadd "$expl[@]" - $_perl_modules +_wanted modules expl 'Perl modules' && compadd "$expl[@]" "$opts[@]" - $_perl_modules Index: Completion/User/_perl =================================================================== --- /dev/null Tue May 5 21:32:27 1998 +++ Completion/User/_perl Sun Mar 12 13:13:49 2000 @@ -0,0 +1,65 @@ +#compdef perl +# +# zsh completion code for the Perl interpreter +# Adam Spiers +# + +_perl () { + _arguments -s \ + '-0-:input record separator in octal (\0, if no argument): ' \ + '-a[autosplit mode with -n or -p (splits $_ into @F)]' \ + "-c[check syntax only (runs BEGIN and END blocks)]" \ + '-d[run scripts under debugger]' \ + '-d\:-[run under control of a debugging/tracing module]:debugging/tracing module:_perl_modules' \ + '-D-:set debugging flags (argument is a bit mask or flags): ' \ + "-e+:one line of script. Several -e's allowed. Omit [programfile]." \ + "-F-:split() pattern for autosplit (-a). The //'s are optional.: " \ + '-h[list help summary]' \ + '-i-[edit <> files in place (make backup if extension supplied)]:backup file extension: ' \ + '-I-[specify @INC/#include directory (may be used more than once)]:include path:_files -/' \ + '-l-[enable line ending processing, specifies line terminator]:output record separator in octal: ' \ + {-m,-M}"-[module.. executes \`use/no module...' before executing your script.]:module:_perl_m_opt" \ + "-n[assume 'while (<>) { ... }' loop around your script]" \ + "-p[assume loop like -n but print line also like sed]" \ + "-P[run script through C preprocessor before compilation]" \ + "-s[enable some switch parsing for switches after script name]" \ + "-S[look for the script using PATH environment variable]" \ + "-T[turn on tainting checks]" \ + "-u[dump core after parsing script]" \ + "-U[allow unsafe operations]" \ + "-v[print version number, patchlevel plus VERY IMPORTANT perl info]" \ + "-V-[print perl configuration information]:configuration keys:_perl_config_vars" \ + '-w[TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.]' \ + '-x-[strip off text before #!perl line and perhaps cd to directory]:directory to cd to:_files -/' \ + ':Perl script:_files -g \*.pl' +} + +_perl_m_opt () { + compset -P '-' + + if compset -P '*='; then + _message 'module arguments, comma separated' + else + _perl_modules -S= -q + fi +} + +_perl_config_vars () { + if (( ! $+_perl_config_vars )); then + # perl | perl ... nasty, but is there another way? + _perl_config_vars=( $(perl -V | + perl -ne 'push @m, (/(\w+)(?==)/g);' \ + -e 'END {print join "\n", @m}' ) ) + fi + + local add_colon='-P:' + compset -P '*:' && add_colon='' + + local delimiter='\ ' + (( compstate[quoting] )) && delimiter=' ' + + compset -P '* ' && compset -q + compadd "$expl[@]" $add_colon -S$delimiter -q - $_perl_config_vars +} + +_perl "$@"