我正在修改 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 是否会干扰这一点。