oh-my-zsh 自定义终端 PS1中的 Conda 和 Virtualenv 环境标识

发布时间 2023-12-22 14:48:58作者: 假不了

起因是因为在安装完 Conda 后每次进入终端,都会自动进入名为“base”的 Python 虚拟环境,这本来没什么,而我用的 shell 工具是 oh-my-zsh,主题是 dst,这个主题貌似有点问题,导致虚拟环境与后面的用户名@主机名等信息打印了两行,类似如下效果:

(base)
mz@mac:~                                                       [13:20:58]
$ 

看起来很别扭,而我想要下面的这种效果:

mz@mac:(base) ~                                                [13:20:58]
$ 

另外,既然 Conda 都改了,那 Virtualenv 也顺便做了,具体步骤如下:

首先,因为是自定义位置显示环境信息,所以需要做一些配置,来关掉前缀显示:

  1. Conda 添加如下配置,位置在~/.condarc,没有该文件则需要新建:

    # 是否自动激活 base 环境(如果需要开启可以跳过这条,或者改成 true)
    auto_activate_base: false
    # 是否更改 PS1(PS1前面是否加环境标识)
    changeps1: false
    
  2. Virtualenv 也需要关闭,方法是添加一条环境变量(添加完别忘了刷新 source xxx):

    export VIRTUAL_ENV_DISABLE_PROMPT=1
    

然后,是 dst 主题的配置,位置在~/.oh-my-zsh/themes/dst.zsh-theme, 其它主题也可以仿照这个配置来。

另:查询 oh-my-zsh 当前主题:echo $ZSH_THEME

ZSH_THEME_GIT_PROMPT_PREFIX=" %{$fg[green]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}!"
ZSH_THEME_GIT_PROMPT_CLEAN=""

# 这里是新增代码
local env_prompt='$(env_prompt_info)'
env_prompt_info() {
    # Conda info
    # 需要
    if [ -n "$CONDA_DEFAULT_ENV" ]
    then
        echo -n "%{$fg[green]%}($CONDA_DEFAULT_ENV)%{$reset_color%} "
    # Virtualenv info
    elif [ -n "$VIRTUAL_ENV" ]
    then
        VIRTUAL_ENV_NAME=`basename $VIRTUAL_ENV`
        echo -n "%{$fg[green]%}($VIRTUAL_ENV_NAME)%{$reset_color%} "
    else
        echo -n ""
    fi
}
# 结束

function prompt_char {
	if [ $UID -eq 0 ]; then 
        echo "%{$fg[red]%}#%{$reset_color%}"; 
    else 
        echo $; 
    fi
}

# 注意这里用英文半角的双引号,而不是单引号
# 在合适的位置上加入`${env_prompt}`就可以了
PROMPT="\
%(?,,%{$fg[red]%}FAIL %{$reset_color%})\
%{$fg[magenta]%}\
%n%{$reset_color%}@%{$fg[yellow]%}%m%{$reset_color%}:${env_prompt}%{$fg_bold[blue]%}%~%{$reset_color%}$(git_prompt_info)
$(prompt_char) "

RPROMPT='%{$fg[green]%}[%*]%{$reset_color%}'

最后,保存并退出后重新打开一个终端,并开启一个虚拟环境就可以看到效果了。