diff --git a/pure.zsh b/pure.zsh index 12ed97c..2e29028 100644 --- a/pure.zsh +++ b/pure.zsh @@ -199,19 +199,21 @@ prompt_pure_precmd() { # Check if we should display the virtual env (psvar[20]). psvar[20]= - # Check if a Conda environment is active and display its name. - if [[ -n $CONDA_DEFAULT_ENV ]]; then - psvar[20]="${CONDA_DEFAULT_ENV//[$'\t\r\n']}" - fi - # When VIRTUAL_ENV_DISABLE_PROMPT is empty, it was unset by the user and - # Pure should take back control. - if [[ -n $VIRTUAL_ENV ]] && [[ -z $VIRTUAL_ENV_DISABLE_PROMPT || $VIRTUAL_ENV_DISABLE_PROMPT = 20 ]]; then - if [[ -n $VIRTUAL_ENV_PROMPT ]]; then - psvar[20]="${VIRTUAL_ENV_PROMPT}" - else - psvar[20]="${VIRTUAL_ENV:t}" + if zstyle -T ":prompt:pure:environment:virtualenv" show; then + # Check if a Conda environment is active and display its name. + if [[ -n $CONDA_DEFAULT_ENV ]]; then + psvar[20]="${CONDA_DEFAULT_ENV//[$'\t\r\n']}" + fi + # When VIRTUAL_ENV_DISABLE_PROMPT is empty, it was unset by the user and + # Pure should take back control. + if [[ -n $VIRTUAL_ENV ]] && [[ -z $VIRTUAL_ENV_DISABLE_PROMPT || $VIRTUAL_ENV_DISABLE_PROMPT = 20 ]]; then + if [[ -n $VIRTUAL_ENV_PROMPT ]]; then + psvar[20]="${VIRTUAL_ENV_PROMPT}" + else + psvar[20]="${VIRTUAL_ENV:t}" + fi + export VIRTUAL_ENV_DISABLE_PROMPT=20 fi - export VIRTUAL_ENV_DISABLE_PROMPT=20 fi # Nix package manager integration. If used from within 'nix shell' - shell name is shown like so: diff --git a/readme.md b/readme.md index 61d2af2..9827303 100644 --- a/readme.md +++ b/readme.md @@ -113,6 +113,10 @@ You can change the symbol shown before the Node.js version (default `⬢`) with: `zstyle :prompt:pure:environment:nix-shell show no` +Virtualenv integration shows the current Python virtualenv or Conda environment name. It is enabled by default, you can disable it with: + +`zstyle :prompt:pure:environment:virtualenv show no` + Git integration is enabled by default, you can disable it with: `zstyle :prompt:pure:git show no` diff --git a/tests/virtualenv.zsh b/tests/virtualenv.zsh new file mode 100644 index 0000000..c8ca421 --- /dev/null +++ b/tests/virtualenv.zsh @@ -0,0 +1,92 @@ +#!/usr/bin/env zsh + +source "${0:A:h}/test-helper.zsh" + +main() { + # prompt_pure_precmd references many env vars that may be unset. + set +u + + zmodload zsh/datetime + zmodload zsh/zutil + + prompt_pure_set_title() { + : + } + + prompt_pure_set_colors() { + : + } + + prompt_pure_check_cmd_exec_time() { + : + } + + prompt_pure_async_tasks() { + : + } + + typeset -gA prompt_pure_vcs_info=(pwd '' top '') + typeset -gA prompt_pure_state=(prompt '❯') + + # Conda env should be shown by default. + CONDA_DEFAULT_ENV=myenv + prompt_pure_precmd + assert_equal "myenv" "$psvar[20]" "conda env should be shown by default" + + # Conda env should be hidden when virtualenv style is off. + zstyle ':prompt:pure:environment:virtualenv' show no + prompt_pure_precmd + assert_empty "$psvar[20]" "conda env should be hidden when virtualenv show is no" + + # Virtualenv should be hidden when virtualenv style is off. + unset CONDA_DEFAULT_ENV + VIRTUAL_ENV=/path/to/venvs/myvenv + VIRTUAL_ENV_DISABLE_PROMPT=20 + prompt_pure_precmd + assert_empty "$psvar[20]" "virtualenv should be hidden when virtualenv show is no" + + # VIRTUAL_ENV_DISABLE_PROMPT should not be set by precmd when virtualenv show is off. + unset VIRTUAL_ENV_DISABLE_PROMPT + prompt_pure_precmd + assert_empty "${VIRTUAL_ENV_DISABLE_PROMPT-}" "VIRTUAL_ENV_DISABLE_PROMPT should not be set when virtualenv show is no" + + # Re-enable and verify virtualenv is shown. + zstyle -d ':prompt:pure:environment:virtualenv' show + prompt_pure_precmd + assert_equal "myvenv" "$psvar[20]" "virtualenv should be shown when style is re-enabled" + + # Virtualenv with VIRTUAL_ENV_DISABLE_PROMPT unset (user handed control back). + unset VIRTUAL_ENV_DISABLE_PROMPT + prompt_pure_precmd + assert_equal "myvenv" "$psvar[20]" "virtualenv should be shown when VIRTUAL_ENV_DISABLE_PROMPT is unset" + + # Conda env should be overridden by virtualenv when both are active. + CONDA_DEFAULT_ENV=condaenv + prompt_pure_precmd + assert_equal "myvenv" "$psvar[20]" "virtualenv should take precedence over conda" + + # VIRTUAL_ENV_PROMPT should be preferred over VIRTUAL_ENV basename. + VIRTUAL_ENV_PROMPT="custom-prompt" + prompt_pure_precmd + assert_equal "custom-prompt" "$psvar[20]" "VIRTUAL_ENV_PROMPT should be preferred" + + # Third-party VIRTUAL_ENV_DISABLE_PROMPT should be respected (Pure should not override). + unset CONDA_DEFAULT_ENV VIRTUAL_ENV_PROMPT + VIRTUAL_ENV_DISABLE_PROMPT=1 + prompt_pure_precmd + assert_empty "$psvar[20]" "third-party VIRTUAL_ENV_DISABLE_PROMPT should be respected" + + # Nix-shell should still work when virtualenv style is off. + unset VIRTUAL_ENV VIRTUAL_ENV_DISABLE_PROMPT + zstyle ':prompt:pure:environment:virtualenv' show no + IN_NIX_SHELL=pure + name=my-nix-shell + prompt_pure_precmd + assert_equal "my-nix-shell" "$psvar[20]" "nix-shell should be independent of virtualenv style" + unset IN_NIX_SHELL name + zstyle -d ':prompt:pure:environment:virtualenv' show + + print -- "virtualenv tests passed" +} + +main "$@"