端末プロンプトをカスタマイズしたいです。通常、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)\"> ";
${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\$ ";