oh-my-zshプロンプトの交換

oh-my-zshプロンプトの交換

私は現在、pyenv設定をプロンプトに追加するために、oh-my-zshでintika2テーマを修正しています。 OMZには、これを行うためにintika2テーマのLEFTINFOS変数に追加したpyenv_prompt_infoコマンドが含まれています。これにより、.zshrcファイルをインポートするたびに正しいpyenvバージョンが提供されますが、pyenvバージョンを変更した後の後続のプロンプトは正しいpyenvバージョンを提供しません。

提案されたテーマ修正の最小バージョン:

function prompt_char {  
    if [ $UID -eq 0 ]; then echo "#"; else echo $; fi
}

LEFTINFOS="$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}"
PROMPT='
╭─$LEFTINFOS
╰─$(prompt_char)%{$reset_color%} '

LEFTINFOSは私が追加したものではなく、intika2テーマで定義されています。

これは私に次のことを与えます: プロンプトの更新が正しくありません。

私がPROMPT次に変更した場合

PROMPT='
╭─$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}
╰─$(prompt_char)%{$reset_color%} '

これで私が期待する動作が表示されます。 望む行動

Prompt_substが設定されていることを確認しました。LEFTINFOSたとえば、定義に対してさまざまな調整を試みましたが、%{$(pyenve_prompt_info%)成功しませんでした。私は見たことがないこれに

修理(つまり交換LEFTINFOS)が簡単です。理由を理解したいです。コマンド置換は機能しません。

ベストアンサー1

あなたの見積もりが間違っています。定義ではLEFTINFOS二重引用符が使用されるため、引用符内の内容はプロンプトが評価されるのではなく、定義が評価されたときに評価されます。PROMPT文字列を含むように値をソートする必要があります$(pyenv_prompt_info)。したがって、LEFTINFOSインクルードは、内部引用符が拡張されないように$(pyenv_prompt_info)単一引用符を使用して定義されます。$…代わりに、値には文字列以外のPROMPT値を含める必要があります。それ以外の場合、プロンプトに結果は展開されずに含まれます。したがって、定義時に二重引用符を使用してください。LEFTINFOS$LEFTINFOS$(pyenv_prompt_info)

他の変数の場合は重要ではありませんが、セッション中に色を調整できるようにするには、以前ではなくプロンプトの計算中にも拡張する必要があります。

LEFTINFOS='$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}'
PROMPT="
╭─$LEFTINFOS
╰─$(prompt_char)%{$reset_color%} "

また、ここに示すように、$(prompt_char)これは奇妙で遅い作成方法で%(!:#:\$)あり%(!…)、有効なUIDを使用することに加えて、ルートシェルから一時的に権限を削除する場合にのみ重要です。

使用psvarそして%1v、、、%2vプロンプト定義を読みやすくするのは簡単ですが、oh-my-zshがそれを妨げるかどうかはわかりません。

おすすめ記事