diff --git a/plugins/pipenv/README.md b/plugins/pipenv/README.md index 429b6f186..3c41d0240 100644 --- a/plugins/pipenv/README.md +++ b/plugins/pipenv/README.md @@ -10,7 +10,7 @@ plugins=(... pipenv ...) ## Features -- Adds completion for pipenv +- Adds completion for pipenv ([install the `argcomplete` package to get it working with pipenv >= 2026.5.0](https://pipenv.pypa.io/en/latest/shell.html#shell-completion)) - Auto activates and deactivates pipenv shell - Adds short aliases for common pipenv commands - `pch` is aliased to `pipenv check` diff --git a/plugins/pipenv/pipenv.plugin.zsh b/plugins/pipenv/pipenv.plugin.zsh index 76d66b301..0279b1286 100644 --- a/plugins/pipenv/pipenv.plugin.zsh +++ b/plugins/pipenv/pipenv.plugin.zsh @@ -2,15 +2,37 @@ if (( ! $+commands[pipenv] )); then return fi -# If the completion file doesn't exist yet, we need to autoload it and -# bind it to `pipenv`. Otherwise, compinit will have already done that. -if [[ ! -f "$ZSH_CACHE_DIR/completions/_pipenv" ]]; then - typeset -g -A _comps - autoload -Uz _pipenv - _comps[pipenv]=_pipenv -fi +# Compatibility note: +# pipenv < 2026.5.0 used Click-based shell completion driven by the +# _PIPENV_COMPLETE environment variable. +# +# pipenv >= 2026.5.0 removed this mechanism and switched to argcomplete-based +# completion using register-python-argcomplete instead. -_PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &| +autoload -Uz is-at-least + +_pipenv_version="${$(pipenv --version 2>/dev/null)#pipenv, version }" + +if is-at-least 2026.5.0 "$_pipenv_version" && (( $+commands[register-python-argcomplete] )); then + # argcomplete-based completion + autoload -Uz bashcompinit + bashcompinit + + eval "$(register-python-argcomplete pipenv)" + +else + # legacy Click-based completion via _PIPENV_COMPLETE + + # If the completion file doesn't exist yet, we need to autoload it and + # bind it to `pipenv`. Otherwise, compinit will have already done that. + if [[ ! -f "$ZSH_CACHE_DIR/completions/_pipenv" ]]; then + typeset -g -A _comps + autoload -Uz _pipenv + _comps[pipenv]=_pipenv + fi + + _PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &| +fi if zstyle -T ':omz:plugins:pipenv' auto-shell; then # Automatic pipenv shell activation/deactivation @@ -34,6 +56,7 @@ if zstyle -T ':omz:plugins:pipenv' auto-shell; then fi fi } + autoload -U add-zsh-hook add-zsh-hook chpwd _togglePipenvShell _togglePipenvShell