oh-my-zsh 提示替换

oh-my-zsh 提示替换

我正在修改 oh-my-zsh 中的 intika2 主题,以将当前的 pyenv 设置添加到我的提示符中。 OMZ 包含一个 pyenv_prompt_info 命令,我将其添加到 intika2 主题中的 LEFTINFOS 变量中来执行此操作。每当获取 .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 之外,只有当您临时从根 shell 中删除权限时,这才会产生影响。

使用psvar%1v, %2v, …可以使提示定义更容易阅读和编写,但我不知道 oh-my-zsh 是否会干扰这一点。

相关内容