我在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很好地搭配。
答案 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}\] "