我在zsh中创建了自己的自定义提示脚本并且效果很好但是当我在python中启动virtualenv时(例如$ WORKON [venv])我的提示会更新两次,因为我的venev中的激活脚本运行包含代码更新我的提示以及包含基本相同代码的自定义提示脚本。我几乎从激活脚本中复制了提示函数,并将其放在我的自定义提示脚本中,以便我可以更改颜色和位置。我显然是重复的。
要解决这个问题,我可以更改每个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)不是红色,而第二个是。我理解发生了什么,我只是不知道如何解决它而不经常更改我的激活脚本。
答案 0 :(得分:0)
阅读更多后,我发现没有一种简单的方法可以做到这一点,但是,任何更新提示的插件或脚本都应该有一个环境变量,你可以设置它将禁用提示更新但仍然设置您可以访问和更新到自定义提示中的变量。
例如,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
上的文档