我是一个长期使用 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 名称或目录并将其设置为前缀。