为什么virtualenv没有设置我的终端提示?

Hug*_*own 10 bash virtualenv

我有运行在Mac OSX(10.8.2)上的virtualenv,虽然它可以工作(我可以设置venvs,在它们之间切换,激活和deactvate),一件不起作用(并且非常烦人)的是终端提示切换.

我的基本提示是[\u] \w \n\[\033[0;31m\]$\[\e[0m\],它呈现为:

[hugo] /current/directory/path/
$ 
Run Code Online (Sandbox Code Playgroud)

即它有一个换行符.

如果我激活virtualenv,我会期望:

(myproject)[hugo] /current/directory/path/
$ 
Run Code Online (Sandbox Code Playgroud)

但实际上我根本没有变化.

我打开了/bin/activate脚本,看了看代码:

if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
    _OLD_VIRTUAL_PS1="$PS1"
    if [ "x" != x ] ; then
        PS1="$PS1"
    else
    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
        # special case for Aspen magic directories
        # see http://www.zetadev.com/software/aspen/
        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
    fi
    fi
    export PS1
fi
Run Code Online (Sandbox Code Playgroud)

如果我在最后粘贴一个回声,我可以看到PS1var设置为(myproject)[\u] \w \n\[\033[0;31m\]$\[\e[0m\],但由于某些原因没有粘连,并且没有输出正确的PS1.

这与我的自定义提示或权限问题有关吗?它显然不是一个虚拟的东西,因为我知道它有效(事实上它适用于我的流浪汉VM,而不是我的OSX主机).

[更新1]

我的错误 - 看起来我有一个git-aware提示符,它会根据目录/ repo状态覆盖提示符.这就是杀死venv提示的原因.现在我只需要一个同时做到这两者 - 所以,后续问题是:是否有人有颜色,git-aware,OSX提示与virtualenv很好地配合.

che*_*ner 13

无论设置你的git-aware提示是什么,都可能定义了这个PROMPT_COMMAND功能.尝试将此添加到.bashrc文件的末尾.

add_venv_info () {
    if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
        _OLD_VIRTUAL_PS1="$PS1"

        if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
            # special case for Aspen magic directories
            # see http://www.zetadev.com/software/aspen/
            PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
        elif [ "$VIRTUAL_ENV" != "" ]; then
            PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
        fi
    fi
    export PS1
}
PROMPT_COMMAND=add_venv_info
Run Code Online (Sandbox Code Playgroud)

什么是阿斯彭魔术目录?我不知道; 这是从activate脚本中复制的代码,用于演示如何使用PROMPT_COMMAND虚拟环境信息包含在您的propmt中.如果它们与您的情况无关,您只需添加所需的PS1=...分配即可.唯一真正重要的部分是1)检查VIRTUAL_ENV_DISABLE_PROMPT和2)进行所需的分配PS1.


pur*_*ion 6

我有同样的问题,但上述解决方案对我不起作用.

我最终做到了这一点:(请 注意,还有一个额外的空间来分隔(virtenv)$

# Virtual ENV stuff
add_venv_info () {
    if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
        VIRT_ENV_TXT=""
        if [ "x" != x ] ; then
            VIRT_ENV_TXT=""
        else
            if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
                # special case for Aspen magic directories
                # see http://www.zetadev.com/software/aspen/
                VIRT_ENV_TXT="[`basename \`dirname \"$VIRTUAL_ENV\"\``]"
            elif [ "$VIRTUAL_ENV" != "" ]; then
                VIRT_ENV_TXT="(`basename \"$VIRTUAL_ENV\"`)"
            fi
        fi
        if [ "${VIRT_ENV_TXT}" != "" ]; then
           echo ${VIRT_ENV_TXT}" "
        fi
    fi
}

# Now we construct the prompt.
# in my case a bunch of lines constructing the complete PS1
# somewhere call the add_venv_info function like below

        PS1=${PS1}"\[\$(job_color)\]\n\$(add_venv_info)\$\[${NC}\] "
Run Code Online (Sandbox Code Playgroud)