【问题标题】:virtualenv name not show in zsh promptvirtualenv 名称未显示在 zsh 提示符中
【发布时间】:2016-12-20 02:27:45
【问题描述】:

最近,我尝试了我的 zsh,在我尝试 virtualevn 和 virtualenvwrapper 之前,一切看起来都不错。当我激活一个 virtualenv(例如测试)时,在普通 bash 上,我会看到 virtualenv 名称如下:

(test)abc@abc:

但是当我切换到 zsh 时,我看不到 virtualenv 名称。尽管如此,我还是在 oh my zsh 的插件中添加了 virtualenv 和 virtualenvwrapper。我还检查了我的 virtualenv 的激活文件,它包含:

f [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then        
    _OLD_VIRTUAL_PS1="$PS1"
    if [ "x" != x ] ; then
        PS1="$PS1"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
    fi
        export PS1
fi

是因为比较 ["x" != x] 返回 true 吗?

更新: 我试图在激活文件中回显 $PS1,得到了这个:

(test) %{$fg[magenta]%}%n%{$reset_color%}%{$fg[cyan]%}@%{$reset_color%}%{$fg[yellow]%}%m%{$reset_color%}%{$fg[red]%}:%{$reset_color%}%{$fg[cyan]%}%0~%{$reset_color%}%{$fg[red]%}|%{$reset_color%}%{$fg[cyan]%}⇒%{$reset_color%}

似乎 $PS1 是正确的,但是当我在终端中回显 $PS1 时,(测试)消失了。似乎 $PS1 被其他东西覆盖了!

【问题讨论】:

  • [ "x" != x ] 总是返回 false;它将文字 x 与自身进行比较。
  • 那么,为什么 basename 没有放在 $PS1 前面?
  • 提示是否以()开头?请注意,您不需要 \ -转义 " 字符。在\"$VIRTUAL_ENV\"(虽然它不应该受到伤害)。
  • 为什么它在 bash 上运行良好,但在 zsh 下却失败了?这两者之间的 sh 语法有什么不同吗?
  • 使用您向我们展示的代码,我不认为会有什么不同。您能否将其缩减为 MCVE (Minimal, Complete, and Verifiable Example) 并包含确切的症状?

标签: bash zsh oh-my-zsh


【解决方案1】:

找到问题了,是主题问题。我在上述案例中使用的主题是 pygmalion,它不允许你更改 $PS1。

更改为robbyrussell主题后,我可以在终端更改$PS1,但仍然看不到virtualenv名称。调试了一会,发现oh my zsh的virtualenv插件默认禁用了提示:

# disables prompt mangling in virtual_env/bin/activate
export VIRTUAL_ENV_DISABLE_PROMPT=1

所以只需将 virtualenv 插件中的行注释掉,问题就解决了。

【讨论】:

  • 它不起作用,我已将其注释掉,并添加到插件中,但仍然不起作用。 :(
  • 我找不到 VIRTUAL_ENV_DISABLE_PROMPT。即使在主题 robbyrussel 下设置 VIRTUAL_ENV_DISABLE_PROMPT=0 它也不起作用。
  • 嘿,这很奇怪。但是你想试试@Greg 的建议吗?
【解决方案2】:

最好的解决方案是将以下内容添加到 ~/.zshrc 文件的末尾:

export VIRTUAL_ENV_DISABLE_PROMPT=

这将覆盖 virtualenv.plugin.zsh 中的值 - 无需更改该文件。

【讨论】:

  • 我不得不使用export VIRTUAL_ENV_DISABLE_PROMPT=0
  • 更具体地说,我必须把它放在source ${ZSH}/oh-my-zsh.sh 行之后。也按照其他答案中的建议将其设置为任何值(0 或1)对我不起作用。我正在使用 Urxvt 和 powerlevel9k。
【解决方案3】:

在~/.zshrc 中执行此操作:

plugins=(virtualenv)

POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status virtualenv)

注意事项:

1 -- 在您拥有的其他插件之外添加该插件。

2 -- 我正在使用 POWERLEVEL9K 主题。也许你的主题

【讨论】:

  • 这是一个非常简洁的答案,适合我的情况,因为我也使用相同的主题。环境将显示在屏幕右侧。
  • 你好,即使我只使用 virtualenv 插件也不起作用。
  • POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time virtualenv) 给了我我想要的东西。谢谢威廉。
  • @ArunDas 评论帮助我不删除屏幕上的现有数据。
  • 我正在使用trapd00r 主题,但这种方法对我不起作用。
【解决方案4】:

根据本指南here

  • 首先在文件.zshrc中的plugin下添加virtualenv依赖 如果这对您不起作用,则表示您选择的主题(oh-my-zsh 主题之一)在 bash 提示符中不包含 virtualenv 名称,因此请尝试第二步。

  • 转到文件 ~/.oh-my-zsh/themes/YOUR_THEME_NAME.zsh-theme 并将其添加到基本提示中 %{$fg[green]%}$(virtualenv_prompt_info)%{$reset_color%}%

注意:virtualenv_prompt_info 是在~/.oh-my-zsh/plugins/virtualenv/virtualenv.plugin.zsh 中声明的函数的名称。如果您的插件文件具有不同的函数名称,请相应地更改它。

或者您可以在~/.zshrc 文件中声明自己的函数,如guide 所示

【讨论】:

  • 就我而言,主题 robbyrussell 不起作用。所以我添加了这个(和其他人一起)PROMPT+=' $(virtualenv_prompt_info)' 现在可以正常工作了
【解决方案5】:

如果你使用 conda 来启动你的虚拟环境,环境变量会有所不同。要找出包含您的 virtaulenv 名称的环境的名称,请键入 printenv 并查看输出。对我来说是CONDA_PROMPT_MODIFIER

知道变量名后打开 .zshrc 并添加这个函数

function virtualenv_info { [ $CONDA_PROMPT_MODIFIER ] && echo `basename $CONDA_PROMPT_MODIFIER` }

在下面添加这一行

PROMPT="%{$fg[green]%}$(virtualenv_info)%{$reset_color%}%${PROMPT}"

关闭编辑器并输入source .zshrc

【讨论】:

    【解决方案6】:

    我通过此链接使其工作:https://askubuntu.com/a/387098

    我在下面复制答案。

    提示如何改变在虚拟环境目录内的脚本bin/activate 中定义。此文件由virtualenv 从模板创建。不幸的是,模板提供的唯一快速修改方法是在前面加上(env name) 或--prompt 设置的任何内容。

    要按你想要的方式修改提示,我建议绕过bin/activate中的提示设置,并在你的主题文件中修改PROMPT的定义。

    首先将以下内容添加到您的.zsh-theme(或.zshrc)

    export VIRTUAL_ENV_DISABLE_PROMPT=yes
    
    function virtenv_indicator {
        if [[ -z $VIRTUAL_ENV ]] then
            psvar[1]=''
        else
            psvar[1]=${VIRTUAL_ENV##*/}
        fi
    }
    
    add-zsh-hook precmd virtenv_indicator
    

    并在PROMPT的定义的第二行前面添加%(1V.(%1v).)。然后它应该看起来像这样:

    PROMPT='
    %(1V.(%1v).)%{$fg_bold[grey]%}[%{$reset_color%}%{$fg_bold[${host_color}]%}%n@%m%{$reset_color%}%{$fg_bold[grey]%}]%{$reset_color%} %{$fg_bold[blue]%}%10c%{$reset_color%} $(git_prompt_info) $(git_remote_status)
    %{$fg_bold[cyan]%}❯%{$reset_color%} '
    

    如果你想要一些颜色,你可以添加 %(1V.%{$fs_bold[yellow]%}(%1v)%{$reset_color%}.) 例如。

    解释:

    virtenv_indicator 将在每次创建提示之前调用。它检查$VIRTUAL_ENV 是否已设置且不为空。如果是这样,它将$psvar 数组的第一个元素设置为$VIRTUAL_ENV,并删除之前和包括最后一个/ 的所有元素(如basename $VIRTUAL_ENV,但更便宜)

    在PROMPT %(1V.(%1v).) 的定义中检查$psvar 的第一个元素是否已设置且不为空(%(1V.true-text.false-text))并添加此元素的内容以及一些括号((%1v))

    export VIRTUAL_ENV_DISABLE_PROMPT=yes 禁用 bin/activate 脚本的任何提示设置。

    【讨论】:

      【解决方案7】:

      我为默认(又名robbyrussell)主题显示 Python virtualenv 名称的设置如下。

      在.zshrc 文件中

      1. virtualenv 添加到plugins

      2. 添加自定义函数:

        function virtualenv_info { 
            [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
        }
        

      导航到您的主题

      1. 我的主题是zsh的默认主题:
        $ vim ~/.oh-my-zsh/themes/robbyrussell.zsh-theme
        
      2. 在现有的PROMPT 命令之后添加此命令:
        PROMPT+='%{$fg[green]%}$(virtualenv_info)%{$reset_color%}%'
        

      终于

      $ source ~/.zshrc
      

      PS:您可以在PROMPT+之前或之后添加您的姓名或几个空格。

      希望有帮助!

      【讨论】:

      • 您创建的函数是virtualenv_info,但在提示符中却是virtualenv_prompt_info,这是有意的吗?
      • @Davos 不,这是一个错字。检查更新的答案。
      • 唯一对我有用的答案。我正在使用trapd00r 主题。 +1
      • 哇,谢谢。这非常有帮助并解决了我的问题。我稍作修改,只是将~/.oh-my-zsh/themes/robbyrussell.zsh-theme 中的PROMPT+= 修改为简单的PROMPT+='%{$fg[green]%}$(virtualenv_info)%{$reset_color%}%{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'(我喜欢virtualenv 位于提示符的最左侧)
      【解决方案8】:

      如果您使用 Homebrew 安装 Anaconda:

      brew tap homebrew/cask-versions 
      brew cask install anaconda 
      

      你正在使用 POWERLEVEL9K 主题

      git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
      

      您需要做的就是将此行添加到 .zshrc 的末尾:

      POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time anaconda)
      

      不需要 virtualenv 插件。

      已编辑:

      如果你已经为 bash 安装了 conda 并且你得到:

      zsh: command not found: conda
      

      运行这个:

      ~/anaconda3/bin/conda init zsh
      

      【讨论】:

        【解决方案9】:

        我正在使用 oh-my-zsh pygmalion 他们,这对我有用:

        • 在~/.zshrc 中添加virtualenv 插件

        • 打开~/.oh-my-zsh/themes/pygmalion.zsh-theme,修改prompt_pygmalion_precmd函数为:

           prompt_pygmalion_precmd(){
             setopt localoptions extendedglob
          
             local gitinfo=$(git_prompt_info)
             local gitinfo_nocolor=${gitinfo//\%\{[^\}]##\}}
             local exp_nocolor="$(print -P \"$base_prompt_nocolor$gitinfo_nocolor$post_prompt_nocolor\")"
             local prompt_length=${#exp_nocolor}
             local python_venv=$(virtualenv_prompt_info)
          
             PROMPT="${python_venv}${base_prompt}${gitinfo}${post_prompt}"
           }
          

        基本上只需将$(virtualenv_prompt_info) 添加到您的PROMPT 到您喜欢的任何位置,这里我将它添加到我的提示的开头。

        【讨论】:

          【解决方案10】:

          如果您使用 zsh 和 pyenv,请将其放入 ~/.zshrc

          eval "$(pyenv init -)"
          eval "$(pyenv virtualenv-init -)"
          #export PS1='($(pyenv version-name)) '$PS1
          
          export PYENV_VIRTUALENV_DISABLE_PROMPT=1
          export BASE_PROMPT=$PS1
          function updatePrompt {
              if [[ "$(pyenv version-name)" != "system" ]]; then
                  # the next line should be double quote; single quote would not work for me
                  export PS1="($(pyenv version-name)) "$BASE_PROMPT
              else
                  export PS1=$BASE_PROMPT
              fi
          }
          export PROMPT_COMMAND='updatePrompt'
          precmd() { eval '$PROMPT_COMMAND' } # this line is necessary for zsh
          

          【讨论】:

            【解决方案11】:

            我也在使用带有 pygmalion 主题的 Oh My Zsh。我必须编辑 pygmalion 脚本以在提示名称之前添加虚拟环境名称。

            • 打开~/.oh-my-zsh/themes/pygmalion.zsh-theme,修改prompt_pygmalion_precmd函数如下:
            prompt_pygmalion_precmd(){
              setopt localoptions extendedglob
            
              local gitinfo=$(git_prompt_info)
              local gitinfo_nocolor=${gitinfo//\%\{[^\}]##\}}
              local exp_nocolor="$(print -P \"$base_prompt_nocolor$gitinfo_nocolor$post_prompt_nocolor\")"
              local prompt_length=${#exp_nocolor}
              local python_venv="($(echo $CONDA_DEFAULT_ENV)) "
            
              PROMPT="${python_venv}${base_prompt}${gitinfo}${post_prompt}"
            }
            

            【讨论】:

              【解决方案12】:

              根据文档,您不需要创建新功能 - 此功能是为您创建的。 https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/virtualenv

              但是你仍然需要编辑主题文件,如上所述,只需输入正确的函数名 - virtualenv_prompt_info:

              PROMPT+='%{$fg[green]%}$(virtualenv_prompt_info)%{$reset_color%}%'

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-14
                • 2015-07-23
                • 2023-02-17
                • 1970-01-01
                • 2013-04-14
                相关资源
                最近更新 更多