如何在zsh的双引号提示符中使用vcs_info功能?
解决zsh中双引号提示符下vcs_info不生效的问题
我来帮你捋清楚这个问题的根源,以及怎么快速修复它!
问题核心原因
zsh对单引号和双引号的变量展开规则完全不同:
- 用单引号定义prompt时,变量会被延迟到每次显示提示符的瞬间才展开——这时候
precmd已经执行完毕,vcs_info_msg_0_已经被正确赋值为版本控制信息,所以能正常显示分支内容。 - 而用双引号时,变量会在你执行
prompt="..."这行命令的那一刻就直接展开了!这时候precmd还没运行过,vcs_info_msg_0_是空值,之后不管vcs_info怎么更新,提示符里的这个位置都只会是空的。
两种修复方案
选任意一种都能解决问题:
方案1:转义双引号里的变量
给变量前的$加反斜杠,让zsh延迟解析这个变量:
autoload -Uz vcs_info zstyle ':vcs_info:*' enable git svn zstyle ':vcs_info:git*' formats "- (%b) " precmd() { vcs_info } setopt prompt_subst prompt="%2/ \${vcs_info_msg_0_}> " # 给$添加反斜杠转义,实现延迟展开
方案2:继续使用单引号定义prompt
既然单引号本身就支持延迟变量展开,直接用回你原本能正常工作的单引号写法就行:
autoload -Uz vcs_info zstyle ':vcs_info:*' enable git svn zstyle ':vcs_info:git*' formats "- (%b) " precmd() { vcs_info } setopt prompt_subst prompt='%2/ ${vcs_info_msg_0_}> ' # 单引号版本,天然支持实时获取变量值
验证方法
修改完配置后,执行source ~/.zshrc让配置生效,然后进入一个git仓库目录,看看提示符是不是自动显示出- (分支名) >的格式了。
内容的提问来源于stack exchange,提问作者jak bin




