如何自定义 bash 提示符而不挤压 venv

如何自定义 bash 提示符而不挤压 venv

我是一个长期使用 tcsh 的用户,并且使用过自定义提示符,其中包括日期/时间、主机和一个较大的路径。过去,当我使用 venv 时,我会先切换到 bash,因为一切都面向 bash,我喜欢将当前环境添加到提示符中,而我没有自定义 bash 提示符。但是,由于我越来越多地使用 bash,我决定迁移自定义 tcsh 提示符的版本。为此,我将以下内容添加到我的 bash 配置文件中:

changeprompt() { DIR=`dirs | perl -e '$p=scalar(<STDIN>);$p=~s/.*(?=\S{40}\Z)/.../;print($p)'`;export PS1="\h[\D{%F %T}]:$DIR\$ "; }
PROMPT_COMMAND="changeprompt"

它给我留下了这样的提示:

gen-rl-macbookair[2021-02-12 14:01:24]:~/PROJECT-local/TRACEBASE$

我想要提示中的更长路径,该路径会根据字符而不是目录深度在给定长度处手动用省略号截断,这就是我设置的原因PROMPT_COMMAND

然而,昨天当我很长时间以来第一次开始研究 venv 时,我意识到激活 venv 不会将提示符更改为添加(environment_name)到提示符前面,因为我已经设置了PROMPT_COMMAND

我通过编辑激活脚本来解决这个问题,COMMAND_PROMPT在激活时取消设置,在停用时重置COMMAND_PROMPT......

但我想知道是否存在更好的方法来维护像这样的自定义命令提示符,允许 venv 激活脚本添加可变的前置字符串 - 而无需对任何激活脚本进行自定义编辑。

答案1

作为一种(糟糕的)解决方法,您可以定义设置和取消设置前缀的 bash 函数PS1,并在激活/停用 venv 而不是 和 时调用这些source activate函数deactivate

在你的 .bashrc 中:

export PROMPT_PREFIX=
set_prompt_prefix(){
    PS1=$PROMPT_PREFIX$PS1
}

PROMPT_COMMAND='changeprompt && set_prompt_prefix'

activate_venv(){
    source activate && PROMPT_PREFIX="(venv) " && alias 'deactivate'='deactivate_venv'
}

deactivate_venv(){
    deactivate && PROMPT_PREFIX=
}

然后,您必须调用activate_venv而不是source activate。venvdeactivate基函数以我的别名,deactivate_venv以便始终删除前缀。

请注意前缀始终是(venv)。更智能的解决方案可以检索 venv 名称或目录并将其设置为前缀。

相关内容