#compdef perlbrew # # A zsh completion script for perlbrew (https://metacpan.org/dist/App-perlbrew/) # local curcontext="$curcontext" state state_descr line ret=1 local -a args_common args_install typeset -A opt_args # others local variables typeset -g perlbrew_subcommands ## ## get the list of perl available versions ## (( $+functions[_perlbrew_caching_policy] )) || _perlbrew_caching_policy() { # rebuild if cached data are more than one week old local -a newer=( "$1"(Nmw-1) ) return $#newer } (( $+functions[_perl_available] )) || _perl_available() { local -a available_versions local update_policy zstyle -s ":completion:${curcontext}:" cache-policy update_policy if [[ -z "$update_policy" ]]; then zstyle ":completion:${curcontext}:" cache-policy _perlbrew_caching_policy fi if _cache_invalid perlbrew-available-versions || ! _retrieve_cache perlbrew-available-versions; then # this can be slow available_versions=( ${${${${(f)"$(_call_program perl_releases perlbrew available)"}/\# (cp|p)erl/}/(#s)i /}// /} \ perl-stable \ perl-blead ) _store_cache perlbrew-available-versions available_versions fi _values 'available version' ${(n)available_versions} } ## ## get the list of local perl installations ## (( $+functions[_perl_installations] )) || _perl_installations() { local text local -a installed alias_link case "$1" in (-with-lib) installed=( ${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /} ) text="perl installation" ;; (-only-lib) installed=( ${(M)${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /}:#*@*} ) text="perl installation" ;; (-without-lib) installed=( ${${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /}:#*@*} ) text="perl installation" ;; (-alias) if [[ -n "$PERLBREW_ROOT" ]]; then if [[ -d "$PERLBREW_ROOT/perls" ]]; then alias_link=( $PERLBREW_ROOT/perls/*(@) ) fi fi installed=( ${(q)${alias_link:t}[@]} ) text="alias" ;; esac if [[ ${#installed[@]} -eq 0 ]]; then _message 'no local perl installation found' else case "$2" in (-comma-separated) _values -s , "$text" $installed ;; (*) _values "$text" $installed ;; esac fi } ## ## completion for the alias subcommand ## (( $+functions[_perlbrew_alias] )) || _perlbrew_alias() { local line state ret=1 _arguments -C \ -f'[force]' \ "1: :->actions" \ "*::arg:->args" && ret 0 case "$state" in (actions) local -a alias_actions alias_actions=( "create:create an alias for the installation named " "rename:rename the alias to a new name" "delete:delete the given alias" ) _describe -t commands 'alias action' alias_actions && ret=0 ;; (args) case $line[1] in (create) _arguments \ '1:perl installation: _perl_installations -without-lib' \ '2: : _message "alias name"' && ret=0 ;; (rename) _arguments \ '1:perl installation: _perl_installations -alias' \ '2: : _message "new name"' && ret=0 ;; (delete) _arguments \ ':perl installation: _perl_installations -alias' && ret=0 ;; esac ;; esac } ## ## completion for the lib subcommand ## (( $+functions[_perlbrew_lib] )) || _perlbrew_lib() { local line state ret=1 _arguments -C \ "1: :->actions" \ "*::arg:->args" && ret=0 case "$state" in (actions) local -a lib_actions lib_actions=( "list:list existing local libs" "create:create a local lib" "delete:delete a local lib" ) _describe -t commands 'lib action' lib_actions && ret=0 ;; (args) case $line[1] in (list) _nothing && ret=0 ;; (create) _message 'lib name' && ret=0 ;; (delete) _arguments \ ':perl installation: _perl_installations -only-lib' && ret=0 ;; esac ;; esac } ## ## main completion script ## args_common=( '(-q --quiet)'{-q,--quiet}'[be quiet on informative output message]' \ '(-v --verbose)'{-v,--verbose}'[tell me more about it]' \ ':perlbrew command:->subcommands' \ '*::: := ->option-or-argument' ) args_install=( '(-f --force)'{-f,--force}'[force installation]' \ -j"[number of building jobs run in parallel]::number" \ '(-n --notest)'{-n,--notest}'[skip testing]' \ --switch"[automatically switch to this perl version once installed]" \ --as"[install the given version of perl by a name]:alias name" \ --noman"[skip installation of manpages]" \ --thread"[build perl with usethreads enabled]" \ --multi"[build perl with usemultiplicity enabled]" \ --64int"[build perl with use64bitint enabled]" \ --64all"[build perl with use64bitall enabled]" \ --ld"[build perl with uselongdouble enabled]" \ --debug"[build perl with DEBUGGING enabled]" \ --clang"[build perl using the clang compiler]" \ --no-patchperl"[skip calling patchperl]" \ {-D,-U,-A}"[switches passed to perl Configure script]:value:" \ --destdir"[install perl as per 'make install DESTDIR=\$path']: :_files -/" \ --sitecustomize"[specify a file to be installed as sitecustomize.pl]: :_files" \ --mirror"[specify a CPAN-mirror url]:URL:_urls" ) _arguments -C $args_common && ret=0 case $state in (subcommands) perlbrew_subcommands=( "init:initialize perlbrew environment" "info:show useful information about the perlbrew installation" "install:install perl" "uninstall:uninstall the given installation" "available:list perls available to install" "lib:manage local::lib directories" "alias:give perl installations a new name" "upgrade-perl:upgrade the current perl" "list:list perl installations" "use:use the specified perl in current shell" "off:turn off perlbrew in current shell" "switch:permanently use the specified perl as default" "switch-off:permanently turn off perlbrew (revert to system perl)" "exec:exec programs with specified perl environments" "clone-modules:re-installs all CPAN modules from one installation to another" "self-install:install perlbrew itself under PERLBREW_ROOT/bin" "self-upgrade:upgrade perlbrew itself" "install-patchperl:install patchperl" "install-cpanm:install cpanm, a friendly companion" "install-cpm:install cpm, a faster but still friendly companion" "install-multiple:install multiple versions and flavors of perl" "download:download the specified perl distribution tarball" "clean:purge tarballs and build directories" "version:display version" "help:read more detailed instructions" ) _describe -t commands 'perlbrew command' perlbrew_subcommands && ret=0 ;; (option-or-argument) curcontext=${curcontext%:*}-$line[1]: case $line[1] in (info) _message 'perl module name' && ret=0 ;; (install) _arguments \ $args_install \ '1:perl release: _perl_available' && ret=0 ;; (install-multiple) _arguments \ $args_install \ '*'--both"[perl flavor]: :(thread multi ld 64int 64all debug clang )" \ --common-variations"[equivalent to '--both thread --both ld --both 64int']" \ --all-variations"[generates all the possible flavor combinations]" \ --append"[appends the given string to the generated names]:string" \ '*:perl release: _perl_available' && ret=0 ;; (uninstall) _arguments \ ":perl installation: _perl_installations -without-lib" && ret=0 ;; (use|switch) _arguments \ ':perl installation: _perl_installations -with-lib' && ret=0 ;; (available) _arguments \ '--all[list of all perls ever released, including development and RC versions]' \ '*: :' && ret=0 ;; (alias) _perlbrew_alias && ret=0 ;; (exec) _arguments -C \ --with'[specify one or more perl installations to use]: : _perl_installations -without-lib -comma-separated' \ --min'[minimum perl version]:version number (n.nnnnn):' \ --max'[maximum perl version]:version number (n.nnnnn):' \ --halt-on-error'[stop on first nonzero exit status]' \ "1:command:" \ "*:args:" && ret=0 ;; (env) # NOTE: Low level command _arguments \ ':perl installation: _perl_installations -with-lib' && ret=0 ;; (symlink-executables) # NOTE: Low level command _arguments \ ':perl installation: _perl_installations -with-lib' && ret=0 ;; (lib) _perlbrew_lib && ret=0 ;; (download) _arguments \ ':perl release: _perl_available' && ret=0 ;; (clone-modules) _arguments \ '--notest[skip all module tests]' \ ':perl installation: _perl_installations -with-lib' \ ':perl installation: _perl_installations -with-lib' && ret=0 ;; (init|list|off|switch-off|install-cpanm|install-patchperl|self-upgrade|\ self-install|clean|version|upgrade-perl|list-modules) _nothing && ret=0 ;; (*) _default && ret=0 ;; esac ;; esac return ret