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

How to colour git branch name in zsh prompt

我的 .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} "

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

阅读和调试 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]}'