#compdef conda mamba micromamba #description:conda package manager # # ZSH Completion for conda (http://conda.pydata.org/) # # Author: Valentin Haenel (https://github.com/esc/) # Licence: WTFPL (http://sam.zoy.org/wtfpl/) # Version: 0.11-dev # Homepage: https://github.com/conda-incubator/conda-zsh-completion # Demo: https://asciinema.org/a/16516 # # This completion depends on Python for a json parser, sorry. Unfortunately # there is no such thing in zsh (yet). # # To use this completion, install it somewhere on your hard drive: # # $ git clone https://github.com/esc/conda-zsh-completion # # And then add it to your $fpath in ~/.zshrc before you call compinit: # # fpath+=/path/to/where/you/installed/conda-zsh-completion # compinit # # If you're using oh-my-zsh or Prezto, they will call compinit for you, so # just add it to your $fpath before calling the OMZ or Prezto initialization # functions. For example: # # git clone https://github.com/esc/conda-zsh-completion ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/conda-zsh-completion # # And add lines in `.zshrc` # plugins=(… conda-zsh-completion) # autoload -U compinit && compinit # # If you use oh-my-zsh, you might have to move the "autoload" line to after you sourced # oh-my-zsh.sh. # # To activate the completion cache for packages, add the following to your # '.zshrc': # # zstyle ':completion::complete:*' use-cache 1 # # To display subcommand completion in groups, please add the following to your # '.zshrc': # # zstyle ":conda_zsh_completion:*" use-groups true # # To display unnamed environments and prefixes of environments, add the following # to your '.zshrc': # # zstyle ":conda_zsh_completion:*" show-unnamed true # # To display environments autocompletion sorted in creation order add the following # to your '.zshrc': # # zstyle ":conda_zsh_completion:*" sort-envs-by-time true # # The completion will display both global environments (envs located in conda_dir/envs and base env) # and local environments (located in ~/.conda/envs). # If enables sort-envs-by-time, it will display local environments first. # To display global environments first, add the following to your '.zshrc': # # zstyle ":conda_zsh_completion:*" show-global-envs-first true # # If not enables sort-envs-by-time, then all environments will be sorted by alphabetical order, # and this option is useless. # # To forcefully clean the completion cache, look in '~/.zcompcache' and remove # file starting with 'conda_'. And/or do 'rm ~/.zcompdump*'. # # When developing, you can use the following to reload the completion after # having modified it: # # $ unfunction _conda && autoload -U _conda # # Please report any issues at: # https://github.com/esc/conda-zsh-completion/issues # # CHANGELOG # --------- # # * v0.10 # # * Search environments in custom environments paths, thanks to Thomas G. (coldfix). # * Naive mamba support, thanks to olegtarasov # * Remove path prefix from environments in default location, thanks to 3mb3dw0rk5 # * Sort environments to be completed by creation time, thanks to m-novikov # * Check for environment directory before accessing, thanks to huyz-git # # * v0.9 # # * Improved the completion speed for completing environments, thanks to # Niels Mündler. # * Various minor improvements and documentation upgrades # # * v0.8 # # * Updated installation instructions and added a license file, thanks to # Andrew Janke # # * v0.7 # # * Fix alignment during menu-completion # # * v0.6 # # * conda activate and conda deactivate can now be completed, thanks to # Taylor Kang Beck # # * v0.5 # # * conda-env can now be completed # * conda-build can now be completed # # * v0.4 # # * conda info can complete available packages # * conda install and create have rudimentary package version completion # * remove caching for local package list, it's fast enough # * conda remove and update are aware of -n or similar and complete only # packages in the given environment # * list of packages excludes those installed with pip # # * v0.3 # # * overhaul of the completion for config # # * complete only existing keys # * complete only existing values # * differentiate between list and boolean config # * reader and writer options mutually exclusive # * complete multiple keys for --get # # * -n,--name and -p,--prefix are now mutually exclusive # # * v0.2 # # * completion cache for packages # * complete all channels defined in .condarc # # * v0.1 # # * inital release # # TODO # ---- # # * Subcommand grouping is still alpha. # * Example of activating cache only for conda completion # * Make cache policy configurable # * Completion for version numbers is rudimentary: # only 'install' can complete them and only for a single '=' sign # * Configuration for external commands: only build and env supported # * Properly handle package specs on the command line # * Don't continue to complete options once -- is given # * None of the commands are aware of channels local state line context local -A opt_args __conda_envs(){ local -a envs unnamed sort globalfirst localenvs globalenvs local -a ls_opts=("-1") local -a describe_opts local localenvspath # only parse environments.txt (including unnamed envs) if asked by the user zstyle -s ":conda_zsh_completion:*" show-unnamed unnamed zstyle -s ":conda_zsh_completion:*" sort-envs-by-time sort zstyle -s ":conda_zsh_completion:*" show-global-envs-first globalfirst if test -n "$sort"; then ls_opts+=("-t") describe_opts+=("-V") fi # global envs (if exists) and base env. globalenvs=($([[ -d "${${CONDA_EXE}%bin/conda}/envs" ]] && ls $ls_opts ${${CONDA_EXE}%bin/conda}/envs)) globalenvs+=("base") # local envs (if exists). if [[ -n "$CONDA_ENVS_PATH" ]]; then localenvspath="$CONDA_ENVS_PATH" elif [[ -n "$CONDA_ENVS_DIRS" ]]; then localenvspath="$CONDA_ENVS_DIRS" else localenvspath="${HOME:?}/.conda/envs" fi localenvs=($([[ -d "$localenvspath" ]] && ls $ls_opts "$localenvspath")) if test -n "$globalfirst"; then envs=($globalenvs $localenvs) else envs=($localenvs $globalenvs) fi # unmaned envs (if show-unammed). if test -n "$unnamed"; then envs+=($( (test -n "$unnamed" && cat ${HOME:?}/.conda/environments.txt) | cut -f1 -d' ' | sed -e "s|^$localenvspath/||")) fi _describe $describe_opts -t envs 'conda environments' envs } __conda_packages_installed(){ local -a installed_packages option environment additional_message # check for command line overrides [[ -n "$1" ]] && option="$1" [[ -n "$2" ]] && environment="$2" installed_packages=($( conda list --no-pip $option $environment | sed 1,2d | cut -f1 -d' ' )) [[ -n $option ]] && [[ -n $environment ]] && additional_message=" in environment: '$environment'" _describe -t installed_packages "installed packages$additional_message" installed_packages } __conda_package_available(){ zstyle ":completion:${curcontext}:" cache-policy __conda_caching_policy local -a available_packages if _cache_invalid conda_available_packages || ! _retrieve_cache conda_available_packages ; then available_packages=($(conda search --use-index-cache --json | python -c " import json, sys parsed = json.load(sys.stdin) for k in parsed.keys(): print(k) ")) _store_cache conda_available_packages available_packages fi print -l $available_packages } __describe_conda_package_available(){ local -a available_packages available_packages=($( __conda_package_available)) _describe -t available_packages 'available packages' available_packages } __conda_existing_config_keys(){ local -a config_keys config_keys=($(conda config --json --get | python -c " import json, sys keys = json.load(sys.stdin)['get'].keys() for k in keys: print(k) ")) print -l $config_keys } __conda_describe_existing_config_keys(){ local -a config_keys config_keys=($( __conda_existing_config_keys )) if [ "${#config_keys}" == 0 ] ; then _message "no keys found!" else _describe -t config_keys 'existing configuration keys' config_keys fi } __conda_describe_existing_list_config_keys(){ local -a config_keys existing_list_config_keys config_keys=($( __conda_existing_config_keys )) existing_list_config_keys=() for k in $config_keys; do if (( ${__conda_list_config_keys[(I)$k]} )) ; then existing_list_config_keys+=$k fi done if [ "${#existing_list_config_keys}" == 0 ] ; then _message "no keys found!" else _describe -t existing_list_config_keys 'existing list configuration keys' existing_list_config_keys fi } __conda_existing_config_values(){ local -a config_values search_term search_term="$1" config_values=($(conda config --json --get "$search_term" 2> /dev/null | python -c " import json, sys try: values = json.load(sys.stdin)['get']['$search_term'] for v in values: print(v) except KeyError: pass except ValueError: pass ")) print -l $config_values } __conda_describe_existing_config_values(){ local -a config_values search_term search_term="$1" config_values=($( __conda_existing_config_values $search_term )) if [ "${#config_values}" == 0 ] ; then _message "no values found for '$search_term'!" else _describe -t config_values 'configuration values' config_values fi } __conda_describe_boolean_config_values(){ local -a config_values config_values=(True False) _describe -t config_values 'boolean configuration values' config_values } __conda_channels(){ local -a channels channels=($( __conda_existing_config_values "channels" )) channels+=(system) _describe -t channels 'conda channels' channels } local -a __conda_boolean_config_keys __conda_list_config_keys __conda_config_keys __conda_boolean_config_keys=( 'add_binstar_token' 'always_yes' 'allow_softlinks' 'changeps1' 'use_pip' 'offline' 'binstar_upload' 'binstar_personal' 'show_channel_urls' 'allow_other_channels' 'ssl_verify' ) __conda_list_config_keys=( 'channels' 'disallow' 'create_default_packages' 'track_features' 'envs_dirs' ) __conda_config_keys=($__conda_boolean_config_keys $__conda_list_config_keys) __conda_describe_boolean_config_keys(){ _describe -t __conda_boolean_config_keys 'boolean keys' __conda_boolean_config_keys } __conda_describe_list_config_keys(){ _describe -t __conda_list_config_keys 'list keys' __conda_list_config_keys } __conda_describe_config_keys(){ _describe -t __conda_config_keys 'conda configuration keys' __conda_config_keys } #__conda_package_specs=('<' '>' '<=' '>=' '==' '!=') __conda_package_specs=('=') __conda_describe_package_specs(){ _describe -t __conda_package_specs 'conda package specs' __conda_package_specs } __conda_describe_package_version(){ local -a current_package versions current_package="$1" versions=($( conda search --json --use-index-cache $current_package | python -c " import json,sys try: versions = set((e['version'] for e in json.load(sys.stdin)['$current_package'])) for v in versions: print(v) except KeyError: pass ")) _describe -t versions "$current_package version" versions } __conda_commands(){ local -a package maint environment help config special tmp package=( search:'Search for packages and display their information.' install:'Install a list of packages into a specified conda environment.' ) maint=( update:'Update conda packages.' clean:'Remove unused packages and caches.' ) environment=( info:'Display information about current conda install.' create:'Create a new conda environment from a list of specified packages.' list:'List linked packages in a conda environment.' remove:'Remove a list of packages from a specified conda environment.' uninstall:'Alias for conda remove' activate:'Activate an environment; alias for source activate' deactivate:'Deactivate an environment; alias for source deactivate' ) help=( help:'Displays a list of available conda commands and their help strings.' ) config=( config:'Modify configuration values in .condarc.' ) special=( run:'Launches an application installed with Conda.' init:'Initialize conda into a regular environment. (EXPERIMENTAL)' package:'Low-level conda package utility. (EXPERIMENTAL)' bundle:'Create or extract a "bundle package" (EXPERIMENTAL)' ) external=( env:'Manage environments.' build:'tool for building conda packages' ) # This takes care of alignment if the user wanted the subcommand completion # to be split into groups. zstyle -s ":conda_zsh_completion:*" use-groups tmp if [[ -n $tmp ]] ; then _describe -t package_commands "package commands" package _describe -t maint_commands "maint commands" maint _describe -t environment_commands "environment commands" environment _describe -t help_commands "help commands" help _describe -t config_commands "config commands" config _describe -t special_commands "special commands" special _describe -t external_commands "external commands" external else _describe "conda commands" package -- maint -- environment -- help -- config -- special -- external fi } __conda_caching_policy() { local -a oldp oldp=( "$1"(Nmh+12) ) # 12 hour (( $#oldp )) } local -a opts help_opts json_opts env_opts channel_opts install_opts opts=( '(-h --help)'{-h,--help}'[show this help message and exit]' '(-V --version)'{-V,--version}'[show program''s version number and exit]' ) help_opts=( '(-h --help)'{-h,--help}'[show this help message and exit]' \ ) json_opts=( '--json[report all output as json.]' \ ) env_opts=( '(-n --name -p --prefix)'{-n,--name}'[name of environment]:environment:__conda_envs' \ '(-n --name -p --prefix)'{-p,--prefix}'[full path to environment prefix]:path:_path_files' \ ) channel_opts=( '(-c --channel)'{-c,--channel}'[additional channel to search for packages]:channel:__conda_channels'\ '--override-channels [do not search default or .condarc channels]' \ '--use-index-cache[use cache of channel index files]' \ '--use-local[use locally built packages]' \ ) install_opts=( '(-y --yes)'{-y,--yes}'[do not ask for confirmation]' \ '--dry-run[only display what would have been done]' \ '(-f --force)'{-f,--force}'[force install]' \ '--file[read package versions from file]:file:_path_files' \ '--no-deps[do not install dependencies]' \ '(-m --mkdir)'{-m,--mkdir}'[create prefix directory if necessary]' \ '--offline[offline mode, don''t connect to internet]' \ '--no-pin[ignore pinned file]' \ '(-q --quiet)'{-q,--quiet}'[do not display progress bar]'\ '--copy[Install all packages using copies instead of hard- or soft-linking]' \ '--alt-hint[Use an alternate algorithm to generate an unsatisfiable hint]' \ ) _arguments -C $opts \ ': :->command' \ '*:: :->subcmd' # the magic function, complete either a package or a package and it's version __magic(){ local -a last_item available_packages current_package last_item=$line[$CURRENT] available_packages=($( __conda_package_available )) if compset -P "*=" ; then current_package="$IPREFIX[1,-2]" __conda_describe_package_version $current_package else __describe_conda_package_available if [[ -n $last_item ]] && (( ${available_packages[(I)$last_item]} )); then compset -P '*' __conda_describe_package_specs fi fi } case $state in (command) __conda_commands ;; (subcmd) case ${line[1]} in (info) _arguments -C $help_opts \ '--json[report all output as json.]' \ '(-a --all)'{-a,--all}'[show all information, (environments, license, and system information]' \ '(-e --envs)'{-e,--envs}'[list all known conda environments]' \ '(-l --license)'{-l,--license}'[display information about local conda licenses list]' \ '(-s --system)'{-s,--system}'[list environment variables]' \ '--root[display root environment path]' \ '*:packages:__describe_conda_package_available' \ ;; (help) _arguments -C $help_opts \ '*:commands:__conda_commands' \ ;; (list) _arguments -C $help_opts \ $env_opts \ $json_opts \ '(-c --canonical)'{-c,--canonical}'[output canonical names of packages only]' \ '(-e --export)'{-e,--export}'[output requirement string only]' \ '(-r --revisions)'{-r,--revision}'[list the revision history and exit]' \ '--no-pip[Do not include pip-only installed packages]' \ '*:regex:' \ ;; (search) _arguments -C $help_opts \ $env_opts \ $json_opts \ $channel_opts \ '(-c --canonical)'{-c,--canonical}'[output canonical names of packages only]' \ '--unknown[use index metadata from the local package cache]' \ '(-o --outdated)'{-o,--outdated}'[only display installed but outdated packages]' \ '(-v --verbose)'{-v,--verbose}'[Show available packages as blocks of data]' \ '--platform[Search the given platform.]' \ '--spec[Treat regex argument as a package specification]' \ '*:regex:' \ ;; (create) _arguments -C $help_opts \ $env_opts \ $install_opts \ $json_opts \ $channel_opts \ '--unknown[use index metadata from the local package cache]' \ '--clone[path to (or name of) existing local environment]' \ '--no-default-packages[ignore create_default_packages in condarc file]' \ '*:packages:__magic' \ ;; (install) _arguments -C $help_opts \ $env_opts \ $install_opts \ $json_opts \ $channel_opts \ '--revision[revert to the specified revision]:revision' \ '*:packages:__magic' \ ;; (update) local -a environment options specifier options=('-n' '--name' '-p' '--prefix') for i in $options ; do (( ${line[(I)$i]} )) && specifier=$i done [[ -n $specifier ]] && environment="$line[${line[(i)$specifier]}+1]" _arguments -C $help_opts \ $env_opts \ $install_opts \ $json_opts \ $channel_opts \ '--unknown[use index metadata from the local package cache]' \ '--all[Update all installed packages in the environment]' \ '*:packages:{__conda_packages_installed $specifier $environment}' \ ;; (remove|uninstall) local -a environment options specifier options=('-n' '--name' '-p' '--prefix') for i in $options ; do (( ${line[(I)$i]} )) && specifier=$i done [[ -n $specifier ]] && environment="$line[${line[(i)$specifier]}+1]" _arguments -C $help_opts \ $env_opts \ $json_opts \ $channel_opts \ '(-y --yes)'{-y,--yes}'[do not ask for confirmation]' \ '--dry-run[only display what would have been done]' \ '(-a --all)'{-a,--all}'[remove all packages, i.e. the entire environment]' \ '--features[remove features (instead of packages)]' \ '--no-pin[ignore pinned file]' \ '(-q --quiet)'{-q,--quiet}'[do not display progress bar]'\ '--offline[offline mode, don''t connect to internet]' \ '*:packages:{__conda_packages_installed $specifier $environment}' \ ;; (config) # this allows completing multiple keys when --get is given local -a last_item get_opts last_item=$line[$CURRENT-1] if (( ${line[(I)--get]} )) && (( ${__conda_config_keys[(I)$last_item]} )) ; then get_opts=('*:keys:__conda_describe_existing_config_keys') else get_opts='' fi _arguments -C $help_opts \ $json_opts \ '--system[write to the system .condarc file]' \ '--file[write to the given file.]:file:_path_files' \ '( --add --set --remove --remove-key)--get[get the configuration value]:key:__conda_describe_existing_config_keys' \ '(--get --set --remove --remove-key)--add[add one configuration value to a list key]:list key:__conda_describe_list_config_keys:value:' \ '(--get --add --remove --remove-key)--set[set a boolean key]:boolean key:__conda_describe_boolean_config_keys:value:__conda_describe_boolean_config_values' \ '(--get --add --set --remove-key)--remove[remove a configuration value from a list key]:list key:__conda_describe_existing_list_config_keys:value:{__conda_describe_existing_config_values '$last_item'}' \ '(--get --add --set --remove )--remove-key[remove a configuration key (and all its values)]:key:__conda_describe_existing_config_keys' \ '(-f --force)'{-f,--force}'[write to the config file using the yaml parser]' \ $get_opts ;; (init) _arguments -C $help_opts \ ;; (clean) _arguments -C $help_opts \ $json_opts \ '(-y --yes)'{-y,--yes}'[do not ask for confirmation]' \ '--dry-run[only display what would have been done]' \ '(-i --index-cache)'{-i,--index-cache}'[remove index cache]' \ '(-l --lock)'{-l,--lock}'[remove all conda lock files]' \ '(-t --tarballs)'{-t,--tarballs}'[remove cached package tarballs]' \ '(-p --packages)'{-p,--packages}'[remove unused cached packages]' \ '(-s --source-cache)'{-s,--source-cache}'[remove files from the source cache of conda build]' \ ;; (package) _arguments -C $help_opts \ $env_opts \ '(-w --which)'{-w,--which}'[given some path print which conda package the file came from]:path:_path_files' \ '(-L --ls-files)'{-L,--ls-files}'[list all files belonging to specified package]' \ '(-r --reset)'{-r,--reset}'[remove all untracked files and exit]' \ '(-u --untracked)'{-u,--untracked}'[display all untracked files and exit]' \ '--pkg-name[package name of the created package]:pkg_name:' \ '--pkg-version[package version of the created package]:pkg_version:' \ '--pkg-build[package build number of the created package]:pkg_build:' \ ;; (bundle) _arguments -C $help_opts \ $env_opts \ $json_opts \ '(-c --create)'{-c,--create}'[create bundle]' \ '(-x --extract)'{-x,--extract}'[extact bundle located at path]:path:_path_files' \ '--metadump[dump metadata of bundle at path]:path:_path_files' \ '(-q --quiet)'{-q,--quiet}'[do not display progress bar]'\ '--bundle-name[name of bundle]:NAME:' \ '--data-path[path to data to be included in bundle]:path:_path_files' \ '--extra-meta[path to json file with additional meta-data no]:path:_path_files' \ '--no-env[no environment]' \ ;; (build) _arguments -C $help_opts \ '(-c --check)'{-c,--check}'[only check (validate) the recipe]' \ '--no-binstar-upload[do not ask to upload the package to binstar]' \ '--output[output the conda package filename which would have been created and exit]' \ '(-s --source)'{-s,--source}'[only obtain the source (but don''t build)]' \ '(-t --test)'{-t,--test}'[test package (assumes package is already build)]' \ '--no-test[do not test the package]' \ '(-b --build-only)'{-b,--build-only}'[only run the build, without any post processing or testing]' \ '(-p --post)'{-p,--post}'[run the post-build logic]' \ '(-V --version)'{-V,--version}'[show program''s version number and exit]' \ '(-q --quiet)'{-q,--quiet}'[do not display progress bar]' \ '--python[Set the Python version used by conda build]' \ '--perl[Set the Perl version used by conda build]' \ '--numpy[Set the NumPy version used by conda build]' \ '*:recipe_path:_path_files' \ ;; (env) _arguments -C $opts \ ': :->command' \ '*:: :->subcmd' case $state in (command) local -a env env=( create:'Create an environment based on an environment file' export:'Export a given environment' list:'List the Conda environments' remove:'Remove an environment' update:'Update the current environment based on environment file' ) _describe -t env_commands "help commands" env ;; (subcmd) case ${line[1]} in (create) _arguments -C $help_opts \ $json_opts \ '(-n --name)'{-n,--name}'[name of environment]:environment:__conda_envs' \ '(-f --file)'{-f,--file}'[environment definition]:file:_path_files' \ '(-q --quiet)'{-q,--quiet}'[]' \ ;; (export) _arguments -C $help_opts \ '(-n --name)'{-n,--name}'[name of environment]:environment:__conda_envs' \ '(-f --file)'{-f,--file}'[]:file:_path_files' \ ;; (list) _arguments -C $help_opts \ $json_opts \ ;; (remove) _arguments -C $help_opts \ $json_opts \ $env_opts \ '(-q --quiet)'{-q,--quiet}'[do not display progress bar]'\ '(-y --yes)'{-y,--yes}'[do not ask for confirmation]' \ '--dry-run[only display what would have been done]' \ ;; (update) _arguments -C $help_opts \ $json_opts \ '(-n --name)'{-n,--name}'[name of environment]:environment:__conda_envs' \ '(-f --file)'{-f,--file}'[environment definition]:file:_path_files' \ '(-q --quiet)'{-q,--quiet}'[]' \ ;; esac ;; esac ;; (activate) _arguments -C $help_opts \ '--stack[activate this environment on top of the previous environment]' \ '*:environment:__conda_envs' ;; (deactivate) _arguments -C $help_opts \ ;; esac ;; esac