From 0119a57e9c3724a6ff72247d278163dc3e507328 Mon Sep 17 00:00:00 2001 From: Aurélien Olivier Date: Wed, 10 Jan 2024 21:28:51 +0100 Subject: github #108: add perlbrew completion --- Completion/Unix/Command/_perlbrew | 315 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 Completion/Unix/Command/_perlbrew (limited to 'Completion/Unix') diff --git a/Completion/Unix/Command/_perlbrew b/Completion/Unix/Command/_perlbrew new file mode 100644 index 000000000..8bf9ba7cc --- /dev/null +++ b/Completion/Unix/Command/_perlbrew @@ -0,0 +1,315 @@ +#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 -- cgit 1.4.1