我有一个简单但自定义的.zshrc,我想用我当前所在的git分支来填充提示符(当在git代码库中时)。下面的代码似乎可以工作,但比我实际所在的位置慢了一个提示符。
.zshrc:
#Prompt messing
# Load colors for prompt
autoload -U colors && colors
# Load version control information
autoload -Uz vcs_info
precmd() {
vcs_info
if [[ -n ${vcs_info_msg_0_} ]]; then
# allow check for changes
zstyle ':vcs_info:*' check-for-changes true
#sets unstaged string to this
zstyle ':vcs_info:git:*' unstagedstr "!"
#sets staged string to this
zstyle ':vcs_info:git:*' stagedstr "+"
zstyle ':vcs_info:git:*' formats '%K{green}%u%k%K{cyan}%c%k'
BRANCH=$(command git rev-parse --abbrev-ref HEAD)
PS1='%F{magenta}%7>>${BRANCH}%<<%f'
PS1+='${vcs_info_msg_0_} %~; '
else
PS1='%~; '
fi
}例如:
master ~/code/external-api; cd ..
master ~/code;
~/code; 我希望第二行的提示符中没有master。
任何帮助都是非常感谢的!
发布于 2021-12-01 21:31:05
在不厌其烦地启用vcs_info之后,您就得到了自己的git分支实现,其中有两行赋值$BRANCH。不需要在每次运行precmd()时都重复设置vcs_info的zstyle。最好使用psvar和%v,而不是依赖PROMPT_SUBST选项。例如:
PS1='%(V.%v .)%~; '
autoload -U vcs_info
zstyle … # all the zstyle commands from before
precmd() {
vcs_info
psvar[1]="${vcs_info_msg_0_}"
}我也不会为colors函数费心。只需使用%F{majenta}就可以了。它是许多年前的遗留问题,在zsh获得直接支持之前,它只是使用文字转义序列设置变量。
发布于 2021-12-01 21:19:46
根据this page的说法,你可以用vcs_info做到这一点。
# in your ~/.zshrc
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
precmd() {
vcs_info
}
# Prompt setup
setopt prompt_subst
PROMPT='${vcs_info_msg_0_}%# '
# Format the message
zstyle ':vcs_info:git*' formats "%{$fg[grey]%}%s %{$reset_color%}%r/%S%{$fg[grey]%} %{$fg[blue]%}%b%{$reset_color%}%m%u%c%{$reset_color%} "发布于 2021-12-01 22:38:00
要解决“one prompt this”问题,请尝试在声明函数后将其添加到~/.zshrc中:
autoload -Uz add-zsh-hook
add-zsh-hook precmd precmd直到将precmd函数设置为precmd函数,它才是precmd函数:)。许多人安装了oh-my-zsh,并通过这种方式获得了precmd钩子集,因此这部分并不总是文档化的。
为了避免混淆,通常最好对函数使用不同的名称:
function my_precmd {
vcs_info
...
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd my_precmdhttps://stackoverflow.com/questions/70190952
复制相似问题