2013-02-20 126 views
7

我有在Mac OSX上运行的virtualenv(10.8.2),虽然它可以工作(我可以设置venvs,在它们之间切换,激活和解除关联),但是一件不起作用的功能是终端提示开关。为什么virtualenv没有设置我的终端提示符?

我的基本提示是[\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没有被导出。

这是我的自定义提示或权限问题?这很明显是而不是这是一个virtualenv的东西,因为我知道它的工作原理(事实上它适用于我的流浪VM,而不是我的OSX主机)。

[更新1]

我的错误 - 它看起来像我有一个混帐感知提示,这是覆盖取决于目录/回购的状态提示。这是什么杀死venv提示符。现在我只需要一个可以同时执行的操作 - 因此,后续问题是:是否有人有颜色,git-aware,OSX提示符,这些提示符与virtualenv很好地匹配。

回答

10

无论设置你的git-aware提示符,可能是定义了PROMPT_COMMAND函数。尝试将其添加到您的.bashrc文件的末尾。

add_venv_info() { 
    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" 
      elif [ "$VIRTUAL_ENV" != "" ]; then 
       PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" 
      fi 
     fi 
     export PS1 
    fi 
} 
PROMPT_COMMAND=add_venv_info 
+0

烨分开 - 感谢 - 我的工作了最终 – 2013-02-22 08:57:55

+0

Likewise-不得不摆弄。添加在.bashrc末尾不会直接工作,而是直接在.bashrc中的其他提示设置下复制粘贴此脚本(与virtualenv文件夹中的“bin/activate”中的内容相同) ,但在PS1出口之前,它的工作。 – Nate 2014-01-21 17:02:34

+0

我认为需要在最后一个林中添加一个分号e $ PROMPT_COMMAND和add_venv_info之间,以使其工作。 – jgosmann 2017-07-12 18:48:10

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}\] " 
+0

你需要提供job_color – msudder 2014-09-24 17:28:59

+1

我有同样的问题,最重要的答案不适合我。我已经将你的add_venv_info函数添加到了我的提示构建函数中,并且它工作正常,谢谢。 – 2015-02-19 13:19:20

+0

与@TomDalton做了同样的事情,工作得很好!请注意,'if [“x”!= x]'部分并不真正起作用,可以删除。 – Pascal 2016-08-10 10:06:58

相关问题