11

我在 Mac OSX (10.8.2) 上运行 virtualenv,虽然它可以工作(我可以设置 venvs,在它们之间切换,激活和停用),但不能工作的一件事(而且很烦人)是终端提示切换。

我的基本提示是[\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

如果我在最后加上回声,我可以看到PS1var 设置为(myproject)[\u] \w \n\[\033[0;31m\]$\[\e[0m\],但由于某种原因没有坚持,并且没有导出正确的 PS1。

这与我的自定义提示或权限问题有关吗?这显然不是virtualenv 的东西,因为我知道它可以工作(实际上它可以在我的 vagrant VM 上工作,而不是在我的 OSX 主机上)。

?

[更新 1]

我的错误 - 看起来我有一个 git-aware 提示,它根据目录/repo 状态覆盖提示。这就是杀死 venv 提示符的原因。现在我只需要一个两者兼而有之的人 - 所以,后续问题是:有没有人有一个颜色、git-aware、OSX 提示符,可以很好地与 virtualenv 搭配使用。

4

2 回答 2

16

设置 git 感知提示的任何内容都可能是定义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

什么是 Aspen 魔法目录?我不知道; 这是从脚本复制的代码,activate用于演示如何将PROMPT_COMMAND虚拟环境信息包含到您的道具中。如果它们与您的情况无关,您可以简单地添加PS1=...您想要的分配。唯一真正重要的部分是 1) 检查VIRTUAL_ENV_DISABLE_PROMPT和 2) 对PS1.

于 2013-02-20T18:52:34.780 回答
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}\] "
于 2014-05-01T13:24:37.830 回答