如何在 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]}'
我的 .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]}'