From 96ea5e32b442ff2406f1d7268cccdd73baf313ea Mon Sep 17 00:00:00 2001 From: dana Date: Tue, 31 Jul 2018 20:46:09 -0500 Subject: 43207: Improve _bind_addresses, _php Minor change from the patch as posted to the ML: _php now calls _bind_addresses with -K, since it can't actually listen on a link-local address. --- Completion/Unix/Command/_php | 234 +++++++++++++++++++++++++++++++------------ 1 file changed, 170 insertions(+), 64 deletions(-) (limited to 'Completion/Unix/Command/_php') diff --git a/Completion/Unix/Command/_php b/Completion/Unix/Command/_php index d03f3395e..c4c4ab3e2 100644 --- a/Completion/Unix/Command/_php +++ b/Completion/Unix/Command/_php @@ -1,71 +1,177 @@ -#compdef php +#compdef php -P php[0-9.-] -# PHP 5.0.4 (cli) -# PHP 4.3.11 (cli) +# Notes: +# - We make no distinction between internal and user functions +# - We don't complete CGI options, which are rarely used interactively +# - Exclusivity on some of the miscellaneous options isn't very accurate +# - @todo Arguments to an -f script aren't completed accurately -- we need to +# massage words/CURRENT so that the -f arg becomes words[1], but if we just +# leave it at that the output will break if the script has any options of its +# own. We would want to complete script options only following `--`, as in +# `php -f /bin/foo -- -` -local curcontext="$curcontext" line state expl -typeset -A opt_args +# Complete PHP class names +(( $+functions[_php_classes] )) || +_php_classes() { + local cmd + local -a tmp -local -a args -local exclusions php_suffix + cmd='foreach ( get_declared_classes() as $c ) { echo "$c\n"; }' + tmp=( ${(f)"$( _call_program classes $words[1] -r ${(q)cmd} )"} ) -zstyle -s ":completion:${curcontext}:" suffixes php_suffix '|' || php_suffix='php|phar' -local php_files=":PHP file:_files -g '*.($php_suffix)(-.)'" + _wanted -x classes expl 'PHP class' compadd -a "$@" - tmp +} + +# Complete PHP extensions/module names; use --zend for Zend extensions only +(( $+functions[_php_extensions] )) || +_php_extensions() { + local idx + local -a expl zend tmp + + zparseopts -a zend -D -E -- -zend + + # `php -m` lists all extensions under two sections called '[PHP Modules]' and + # '[Zend Modules]'. An extension can (but won't necessarily) exist under both + # of these at the same time + tmp=( ${(f)"$( _call_program extensions $words[1] -m )"} ) + idx=${tmp[(i)\[Zend Modules\]]} + + # Get only Zend extensions (for --rz) + if (( $#zend )); then + tmp=( ${(@)tmp[(idx+1),-1]} ) + # Get PHP extensions (for everything else) + else + tmp=( ${(@)tmp[2,(idx-1)]} ) + fi + + _wanted -x extensions expl 'PHP extension' compadd -a "$@" - tmp +} + +# Complete PHP function names +(( $+functions[_php_functions] )) || +_php_functions() { + local cmd + local -a expl tmp + + cmd=' + foreach ( get_defined_functions() as $a ) { + foreach ( $a as $f ) { + echo "$f\n"; + } + } + ' + tmp=( ${(f)"$( _call_program functions $words[1] -r ${(q)cmd} )"} ) + + _wanted -x functions expl 'PHP function' compadd -a "$@" - tmp +} + +_php() { + local curcontext=$curcontext php_suffix php_files ret=1 + local -a context expl line state state_descr args + local -A opt_args + + zstyle -s ":completion:${curcontext}:" suffixes php_suffix '|' || + php_suffix='php|php5|phar' + + php_files=":PHP file:_files -g '*.($php_suffix)(#q-.)'" -if _pick_variant php5=PHP\ 5 php4 --version; then - exclusions="-B --process-begin -R --process-code -F --process-file -E --process-end" args=( - '(-B --process-begin -f --file -r --run 1)'{-B,--process-begin}'[run specified PHP code before processing input lines]:PHP code:' - '(-R --process-code -F --process-file -f --file -r --run 1)'{-R,--process-code}'[run specified PHP code for every input line]:PHP code:' - '(-F --process-file -R --process-code -f --file -r --run 1)'{-F,--process-file}'[parse and execute specified file for every input line]'$php_files - '(-E --process-end -f --file -r --run 1)'{-E,--process-end}'[run specified PHP code after processing all input lines]:PHP code:' - '(-H --hide-args)'{-H,--hide-args}'[hide any passed arguments from external tools]' + + mc # Misc. options + '(-a --interactive)'{-a,--interactive}'[run interactively]' + '*'{-d+,--define=}'[define INI directive]: :->directive' + '(-e --profile-info)'{-e,--profile-info}'[generate extended information for debugger/profiler]' + '(-H --hide-args)'{-H,--hide-args}'[hide script name and arguments from external tools]' + '(fi im pb pf rf rn sc sv *)--ini[display configured INI paths]' + # Note: PHP does not automatically prepend extension_dir to extension file + # names (the way it does when parsing the INI file) at the command line + '*'{-z+,--zend-extension=}'[load specified Zend extension]:Zend extension:_files -g "*.so(|.*)(#q-.)"' + + + '(fi)' # File arguments + "(im pb pf rf sv)"{-f+,--file=}'[parse and/or execute specified file]'$php_files + '(-)1'$php_files + + + '(hv)' # Help/version options; kept separate by convention + '(- 1 *)'{-h,--help}'[display help information]' + '(- 1 *)'{-v,--version}'[display version information]' + '!(- 1 *)'{-\?,-\\\?,--usage} + + + '(im)' # Info/module options (exclusive with everything but -c/-n) + '(fi mc pb pf rf rn sc sv *)'{-i,--info}'[display configuration information (phpinfo())]' + '(fi mc pb pf rf rn sc sv *)'{-m,--modules}'[display installed extensions]' + + + '(in)' # php.ini set/disable options (unrelated to --ini!) + {-c+,--php-ini=}'[specify php.ini or containing directory]:INI file or directory:_files -g "*.ini(-.)"' + {-n,--no-php-ini}'[ignore php.ini]' + + + '(pb)' # Input-processing begin/end options + '(-B --process-begin fi im rf rn sc sv)'{-B+,--process-begin=}'[run specified PHP code before processing input lines]:PHP code:' + '(-E --process-end fi im rf rn sc sv)'{-E+,--process-end=}'[run specified PHP code after processing input lines]:PHP code:' + + + '(pf)' # Input-processing options + '(fi im rf rn sc sv)'{-R+,--process-code=}'[run specified PHP code for every input line]:PHP code:' + '(fi im rf rn sc sv)'{-F+,--process-file=}'[parse and execute specified file for every input line]'$php_files + + + '(rf)' # Reflection options + '(fi im rn pb pf sc sv *)'{--rc=,--rclass=}'[display information about specified class]: :_php_classes' + '(fi im rn pb pf sc sv *)'{--re=,--rextension=}'[display information about specified extension]: :_php_extensions' + '(fi im rn pb pf sc sv *)'{--rf=,--rfunction=}'[display information about specified function]: :_php_functions' + '(fi im rn pb pf sc sv *)'{--ri=,--rextinfo=}'[display configuration information about specified extension]: :_php_extensions' + '(fi im rn pb pf sc sv *)'{--rz=,--rzendextension=}'[display information about specified Zend extension]: :_php_extensions --zend' + + + '(rn)' # Run-script options + "(fi im pb pf rf sc sv)"{-r+,--run=}'[run specified PHP code]:PHP code:' + + + '(sc)' # Source-checking/formatting options + '(im pb pf rf rn sv *)'{-l,--syntax-check}'[check syntax only (lint)]' + '(im pb pf rf rn sv *)'{-s,--syntax-highlight}'[display HTML syntax-highlighted source]' + '!(im pb pf rf rn sv *)--syntax-highlighting' + '(im pb pf rf rn sv *)'{-w,--strip}'[display source stripped of comments and whitespace]' + + + sv # Built-in Web server options + '(-S --server fi im pb pf rf rn sc *)'{-S+,--server=}'[start Web server on specified address/port]: :->server' + '(-t --docroot fi im pb pf rf rn sc *)'{-t+,--docroot=}'[specify Web-server document root]:document root:_directories' + + + ar # Script-argument operands + '(-)*:: :->argument' ) -fi - -args+=( - '(-a --interactive)'{-a,--interactive}'[run interactively]' - '(-c --php-ini -n --no-php-ini)'{-c,--php-ini}'[look for php.ini file in the specified directory]:INI file or directory:_files -g "*.ini(-.)"' - '(-c --php-ini -n --no-php-ini)'{-n,--no-php-ini}'[no php.ini file will be used]' - '(-d --define)'{-d,--define}'[define INI entry]:configuration directive:->directive' - '(-e --profile-info)'{-e,--profile-info}'[generate extended information for debugger/profiler]' - "(-f --file -r --run $exclusions 1)"{-f,--file}'[parse specified file]'$php_files - '(- 1 *)'{-h,--help}'[display help information]' - '(- 1 *)'{-i,--info}'[PHP information]' - '(- *)'{-l,--syntax-check}'[syntax check only (lint)]' - '(- 1 *)'{-m,--modules}'[show compiled in modules]' - "(-r --run -f --file $exclusions -l --syntax-check -s --syntax-highlight -w --strip 1)"{-r,--run}'[run the specified PHP code without using script tags ]:PHP code:' - '(- 1 *)'{-s,--syntax-highlight}'[display colour syntax highlighted source]' - '(- 1 *)'{-v,--version}'[display version information]' - '(- *)'{-w,--strip}'[display source with stripped comments and whitespace]' - '(-z --zend-extension)'{-z,--zend-extension}'[load specified Zend extension]:extension file:->extension' - '(-)1'$php_files - '(-)*::script argument: _normal' -) - -_arguments -C -s -S "$args[@]" && return 0 - -case $state in - directive) - local -a directives suf - local code='foreach (ini_get_all() as $k => $v) { echo "$k\n"; }' - directives=( $(_call_program directives $words[1] -r ${(q)code} 2>/dev/null) ) - if compset -P 1 '*='; then - _default && return 0 - else - compset -S '=*' || suf=( -qS '=' ) - _wanted directives expl 'configuration directive' compadd "$suf[@]" -a directives && return 0 - fi - ;; - extension) - local -a paths - if [[ -r /etc/ld.so.conf ]]; then - paths=( ${(f)"$(