我想自定义我的终端提示。通常,当激活 conda 环境时,环境名称会添加到 PS1 字符串之前。我想对此进行更多定制,但一直无法弄清楚。
如果我添加changeps1: false
到我的.condarc
文件中,当我激活新环境时,终端提示符不会被修改。然后我可以修改我的环境变量,.bash_profile
例如:
PS1+="\[${cyan}\]<$(basename $CONDA_DEFAULT_ENV)> ";
这将返回环境的名称,其颜色与我想要的被胡萝卜包围的颜色相同,但这仅在我运行source .bash_profile
激活环境后才起作用,没有任何效果,这并不意外。
我的问题是如何在激活环境时更新提示,或者是否有更好的方法来解决此问题?
这与这个问题
和这个示例配置文件但是,这些并不能直接解决我在激活环境时遇到的提示未更改的问题
答案1
这里的问题是,您使用双引号并使用直接命令替换,这意味着$(basename $CONDA_DEFAULT_ENV)
(因此$CONDA_DEFAULT_ENV
) 的值只会在执行该行代码时计算一次,并将逐字合并到 PS1 中细绳。
bash 处理 PS1 的方式,$(...)
每次打印提示时都会评估序列,因此您需要做的是以其文字形式保留序列($
例如,通过使用反斜杠转义 s),这应该会产生您的结果正在寻找。
所以这应该有效:
PS1+="\[${cyan}\]<\$(basename \$CONDA_DEFAULT_ENV)> ";
或者,更好的是,在变量周围添加双引号,以便命令在有空格、空或未设置时basename
继续工作:$CONDA_DEFAULT_ENV
PS1+="\[${cyan}\]<\$(basename \"\$CONDA_DEFAULT_ENV)\"> ";
请注意,我没有 escape ${cyan}
,因为只评估一次就可以了,因为预计它不会改变......
转义元字符(例如$
和"
)在某些时候开始变得繁重,因此在某些时候使用单引号逐字保留字符串可能是更好的选择,所以我们可以这样做。但由于我们仍然想扩展${cyan}
,所以让我们混合使用双引号和单引号,以最少的转义达到所需的结果:
PS1+="\[${cyan}\]"'<$(basename "$CONDA_DEFAULT_ENV")> ';
您可能仍然遇到将颜色设置为青色而没有在最后重置它的问题...但这应该很容易解决,通过"\[${...}\]"
在末尾添加另一个块以及重置格式的代码(不确定您的颜色常量来自哪里)来自,因此请检查这些重置代码。)但在您的特定环境中,这可能不是问题,如果您在 PS1 上附加了更多行以进一步修改它,这些行也会更改颜色。 (我想这就是你的情况,因为你说每当你获取你的个人资料时你所拥有的都是有效的。)
答案2
稍微扩展一下 filbranden 的答案,如果您想在未设置环境时避免使用 <>,您可以执行以下操作:
# CONDA
function parse_conda_env () {
if [ ! -z "$CONDA_DEFAULT_ENV" ]
then
echo "<$(basename "$CONDA_DEFAULT_ENV")> "
fi
}
# COLORS
BLUE="\[\033[0;34m\]"
RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
NO_COLOR="\[\033[0m\]"
PROMPT_DIRTRIM=2
PS1="$CYAN\$(parse_conda_env)$GREEN\h$BLUE:\w$YELLOW\$(parse_git_branch)$NO_COLOR\$ ";