首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止其他脚本更新我的提示符?

如何阻止其他脚本更新我的提示符?
EN

Stack Overflow用户
提问于 2015-12-27 02:02:40
回答 1查看 52关注 0票数 0

我在zsh中创建了自己的自定义提示符脚本,它工作得很好,但是当我在python中启动一个虚拟环境(例如$WORKON venv)时,我的提示符被更新了两次,因为我的venv中的激活脚本运行了,其中包含更新我的提示符的代码,以及我的自定义提示符脚本,它包含基本上相同的代码。我几乎复制了激活脚本中的提示函数,并将其放入我的自定义提示脚本中,这样我就可以更改颜色和位置。很明显,我得到的是副本。

为了解决这个问题,我可以在我的每个venv中更改激活脚本,但这似乎很繁琐。如果激活脚本正在更新我的提示符,我希望我的提示符脚本能够看到这些更改,然后访问并操作这些更改以达到我想要的效果。如果我能够做到这一点,我可以删除我的提示脚本中的重复代码,让激活脚本来做它的事情,然后让我的提示脚本调整更新激活脚本。

下面是我的实际prompt.zsh的简化版本,但它应该足以演示我的问题。

prompt.zsh

代码语言:javascript
复制
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`%~'

激活

代码语言:javascript
复制
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)不是红色的,但第二个是红色的。我知道发生了什么,我只是不知道如何修复它,而不是不断地修改我的激活脚本。

EN

回答 1

Stack Overflow用户

发布于 2015-12-27 04:40:05

在阅读了更多之后,我发现没有一种简单的方法可以做到这一点,然而,任何更新提示符的插件或脚本都应该有一个环境变量,您可以设置该变量来禁用提示符更新,但仍然可以设置变量以供您访问和更新到自定义提示符。

例如,virtualenv检查变量$VIRTUAL_ENV_DISABLE_PROMPT。我不得不在我的.zshrc文件中添加$VIRTUAL_ENV_DISABLE_PROMPT="1",以便在激活脚本中禁用更新提示。接下来,我将我的add_venv_info函数更改为:

代码语言:javascript
复制
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上的文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34473846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档