如何在 zsh 提示符下为 git 分支名称着色



我的.zshrc中有以下设置

autoload -Uz add-zsh-hook vcs_info
setopt prompt_subst
add-zsh-hook precmd vcs_info
zstyle ':vcs_info:git:*' formats '%b'

而这在我的 自定义ZSH主题:

vcs_info_wrapper() {
vcs_info
if [[ "${vcs_info_msg_0_}" == "master" ]]; then
echo "%{$FG[196]%}"
else
echo "%{$fg[cyan]%}"
fi
}

PROMPT=$'%B%{$FG[039]%}%n%b%{$fg_bold[white]%}@%m%{$FG[220]%} %{x1b[3m%}%5~ %{$reset_color%}$(git_prompt_info)%{$reset_color%}%{x1b[0m%} %(?.%{$fg[white]%}.%{$fg_bold[red]%}[%?])» %{$FG[010]%} ||$(vcs_info_wrapper)${vcs_info_msg_0_}|| '

我有$(vcs_info_wrapper)${vcs_info_msg_0_}$(git_prompt_info)来测试颜色输出。由于某种原因,前者总是有效并且具有正确的颜色,但后者则不然,一旦颜色发生变化,它就永远不会重置。在这一点上,我基本上已经尝试了所有方法。欢迎任何想法

编辑:

感谢@Gairfowl我现在大部分工作:

function my_precmd {
vcs_info
local user='%B%F{#00ACE6}%n%f%b'
local host='%B%F{white}@%m%f%b'
local path='%F{#FFD700}%4~%f'
local rcAndArrow='%(?.%F{white}.%B%F{red}[%?])»%f%b'
local git2color='cyan'
local git2=""
[[ "${vcs_info_msg_0_}" == "master" || "${vcs_info_msg_0_}" == "main" ]] && git2color='196'
if [[  "${vcs_info_msg_0_}" != "" ]]
then
local git2="%B%F{${git2color}}($(git_prompt_info))%f%b "
fi
psvar[1]="${user}${host} ${path} ${git2}${rcAndArrow} "

但是,如果我将其与似乎有效的path(如local path="%F{#FFD700}%4~%f $(git_prompt_info)")结合使用,我没有从$(git_prompt_info)获得任何 git 信息。

读取和调试precmd函数通常比 将所有内容放入PROMPT变量中。尝试构建如下函数的提示;您可以注释掉各个部分并隔离您正在处理的部分:

autoload -Uz add-zsh-hook vcs_info
setopt prompt_subst
add-zsh-hook precmd my_precmd
zstyle ':vcs_info:git:*' formats '%b'
function my_precmd {
local theUser='%B%F{39}%n%f%b'
local theHost='%B%F{white}@%m%f%b'
local git1="%F{220}~%f$(git_prompt_info)"
local rcAndArrow='%(?.%F{white}.%B%F{red}[%?])»%f%b'
vcs_info
local git2color='cyan'
[[ "${vcs_info_msg_0_}" == "master" ]] && git2color='196'
local git2="||%F{${git2color}}${vcs_info_msg_0_}%f||"
psvar[1]="${theUser}${theHost} ${git1} ${rcAndArrow} "
psvar[2]="${git2}"
}
PROMPT='${psvar[1]}'
RPROMPT='${psvar[2]}'