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

时间:2013-02-20 18:13:47

标签: bash virtualenv

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

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

[hugo] /current/directory/path/
$ 

即。它有一个换行符。

如果我激活了virtualenv,我希望:

(myproject)[hugo] /current/directory/path/
$ 

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

我打开了/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

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

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

[更新1]

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

2 个答案:

答案 0 :(得分:12)

无论设置什么是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

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

答案 1 :(得分:5)

我遇到了同样的问题,但上述解决方案并不适用于我。

我最终这样做了: (请注意,还有一个额外的空间可以将(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}\] "