我在zsh中创建了自己的自定义提示符脚本,它工作得很好,但是当我在python中启动一个虚拟环境(例如$WORKON venv)时,我的提示符被更新了两次,因为我的venv中的激活脚本运行了,其中包含更新我的提示符的代码,以及我的自定义提示符脚本,它包含基本上相同的代码。我几乎复制了激活脚本中的提示函数,并将其放入我的自定义提示脚本中,这样我就可以更改颜色和位置。很明显,我得到的是副本。
为了解决这个问题,我可以在我的每个venv中更改激活脚本,但这似乎很繁琐。如果激活脚本正在更新我的提示符,我希望我的提示符脚本能够看到这些更改,然后访问并操作这些更改以达到我想要的效果。如果我能够做到这一点,我可以删除我的提示脚本中的重复代码,让激活脚本来做它的事情,然后让我的提示脚本调整更新激活脚本。
下面是我的实际prompt.zsh的简化版本,但它应该足以演示我的问题。
prompt.zsh
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
export PROMPT='\n%F{red}`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"
else
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
fi
export PS1如果我想激活venenv "py3“,我运行以下命令:
$ $WORKON py3
假设我在主目录(~)中,我的提示符更改如下:
~
要这样做:
(py3)(py3)~
第一个(py3)不是红色的,但第二个是红色的。我知道发生了什么,我只是不知道如何修复它,而不是不断地修改我的激活脚本。
发布于 2015-12-27 04:40:05
在阅读了更多之后,我发现没有一种简单的方法可以做到这一点,然而,任何更新提示符的插件或脚本都应该有一个环境变量,您可以设置该变量来禁用提示符更新,但仍然可以设置变量以供您访问和更新到自定义提示符。
例如,virtualenv检查变量$VIRTUAL_ENV_DISABLE_PROMPT。我不得不在我的.zshrc文件中添加$VIRTUAL_ENV_DISABLE_PROMPT="1",以便在激活脚本中禁用更新提示。接下来,我将我的add_venv_info函数更改为:
add_venv_info () {
local virtualenv_path="$VIRTUAL_ENV"
if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then
echo `basename $virtualenv_path`
fi}
现在一切都很好了。我是计算机科学的新手,所以请原谅我那些愚蠢的问题。
请参阅http://virtualenv.readthedocs.org/en/latest/reference.html上的文档
https://stackoverflow.com/questions/34473846
复制相似问题