Bash zsh提示符中未显示虚拟机名称

Bash zsh提示符中未显示虚拟机名称,bash,zsh,oh-my-zsh,Bash,Zsh,Oh My Zsh,最近,我试了一下哦,我的zsh,在我尝试virtualevn和virtualenvwrapper之前,一切看起来都很好。当我在普通bash上激活virtualenv(例如test)时,我会看到virtualenv名称,如: (test)abc@abc: 但当我切换到zsh时,我看不到virtualenv名称。尽管如此,我还是在oh my zsh的插件中添加了virtualenv和virtualenvwrapper。我还检查了我的virtualenv的激活文件,它包含: f [ -z "${VI

最近,我试了一下哦,我的zsh,在我尝试virtualevn和virtualenvwrapper之前,一切看起来都很好。当我在普通bash上激活virtualenv(例如test)时,我会看到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被其他东西覆盖了

发现问题,是因为主题。我在上述案例中使用的主题是pygmalion,它不允许您更改$PS1

更改为robbyrussell主题后,我可以在终端中更改$PS1,但仍然无法看到virtualenv名称。经过一段时间的调试,我发现默认情况下oh my zsh的virtualenv插件会禁用提示:

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

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

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

export VIRTUAL_ENV_DISABLE_PROMPT=

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

~/.zshrc
中执行此操作:

plugins=(virtualenv)

POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status virtualenv)
注意事项:

1--除了您拥有的其他插件之外,还要添加该插件

2--我使用的是POWERLEVEL9K主题。也许您可以根据本指南来设置主题

  • 首先在文件
    .zshrc
    如果这对您不起作用,那么这意味着您选择的主题(oh my zsh主题之一)在bash提示符中不包含virtualenv名称,所以请尝试第二步

  • 转到文件
    ~/.oh my zsh/themes/YOUR_THEME\u NAME.zsh THEME
    ,并将其添加到基本提示中
    
    %{$fg[绿色]]]}$(虚拟提示信息)%{$reset\U color%}%
    

注意
virtualenv\u prompt\u info
是在
~/.oh my zsh/plugins/virtualenv/virtualenv.plugin.zsh
中声明的函数名。如果你的插件文件有不同的函数名,那么相应地修改它


或者,您可以在
~/.zshrc
文件中声明自己的函数,如本文件所示。如果您使用conda启动虚拟环境,则环境变量将不同。要找出保存virtaulenv名称的环境名称,请键入
printenv
,并查看输出。对我来说,它是
CONDA\u PROMPT\u修饰符

知道变量open.zshrc的名称后,添加此函数

function virtualenv\u info{
[$CONDA_提示符_修饰符]&&echo`basename$CONDA_提示符_修饰符`
}

下面加上这一行

PROMPT=“%{$fg[green]]]}$(virtualenv\u info)%{$reset\u color%}%${PROMPT}”


关闭编辑器并键入
source.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
我重复下面的答案

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

要以您想要的方式修改提示,我建议绕过
bin/activate
中的提示设置,并修改主题文件中
prompt
的定义

首先将以下内容添加到
.zsh主题
(或
.zshrc

并在
提示符
定义的第二行前面添加
%(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[黄色]]}(%1V)%{$reset_color%}。)
例如

说明

virtenv_指示器
将在每次创建提示之前调用。它检查
$VIRTUAL_ENV
是否已设置且不为空。如果是这样,它会将
$psvar
数组的第一个元素设置为
$VIRTUAL_ENV
,删除之前的所有内容,包括最后一个
/
(如
basename$VIRTUAL_ENV
,但成本较低)

提示符的定义中
%(1V.(%1V)。
检查
$psvar
的第一个元素是否已设置且不为空(
%(1V.true text.false text)
),并添加此元素的内容和一些括号(
(%1V)


export-VIRTUAL\u-ENV\u-DISABLE\u-PROMPT=yes
通过
bin/activate
脚本禁用任何提示设置。

My设置为默认主题(也称为robbyrussell
)显示Python virtualenv名称

.zshrc
文件中的

  • virtualenv
    添加到
    插件中

  • 添加自定义函数:

    function virtualenv_info { 
        [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
    }
    
  • 导航到您的主题

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

    $ source ~/.zshrc
    
    PS:您可以在提示符+之前或之后添加姓名或一些空格


    希望有帮助

    如果您使用自制软件安装了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
    

    我正在使用oh my zsh pygmalion,这对我很有用:

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

    • 打开~/.oh my zsh/themes/pygmalion.zsh-themes,修改
      pro
      
       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}"
       }
      
      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