zsh无法更新vcs_info

15

我只是想通过使用vcs_info来显示我所在的git存储库的当前分支(如果有)。 我的.zshrc文件的相关部分如下:

autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' formats "%F{010}(%b)%f "

precmd() { vcs_info }
setopt prompt_subst

PROMPT="%F{226}%m:%n @ %F{214}%1d %F{226}\$%f ${vcs_info_msg_0_}"

我期望:

  1. 我打开终端并从~(主目录)开始。zsh提示应该显示为:

    hostname:username @ user $

  2. cd dev/repo可以让我进入git repo,zsh提示应该显示为:

    hostname:username @ repo $ (master)

  3. cd ..可以让我回到不是git repo的dev目录,提示应该显示为:

    hostname:username @ dev $

我的经历:

提示从未自动更改/更新;当我更改目录时,我必须运行source ~/.zshrc才能使提示更新。

我尝试过的:

我尝试将precmd()块更新为以下内容:

precmd() {
    vcs_info
    echo "This has been executed"
}

我看到在每个提示符之前都有 This has been executed,因此我知道 precmd 块被正确执行了。似乎 vcs_info 没有起作用。

也许我漏掉了什么;有人能指出可能的问题吗?谢谢!


1
我最终将 PROMPT 赋值放在 precmd 方法里面。 - Raul Rene
2个回答

34

几个月后,偶然发现问题的解决办法...提示符必须使用单引号而不是双引号。

PROMPT='%F{226}%m:%n @ %F{214}%1d %F{226}\$%f $ {vcs_info_msg_0_}'


3
就是这样!现在双引号有问题了。 谢谢你,你救了我的一天。 - Alberto Fortes
2
用单引号,我可以在提示符中看到一个字面值 "${vcs_info_msg_0_}"。 - Cris Luengo
3
@CrisLuengo - 确保你启用了setopt prompt_subst的提示符替换功能。 - Gairfowl
1
对我来说,情况正好相反。双引号不起作用,只会将${vcs_info_msg_0_}以纯文本形式打印出来,而双引号虽然能工作,但无法更新分支名称。 - Raul Rene
@RaulRene 我遇到了同样的问题。 - zardilior

3
将整个内容放在precmd()函数内部运行可以解决问题。
autoload -Uz vcs_info
precmd() {
  vcs_info
  # Format the vcs_info_msg_0_ variable
  zstyle ":vcs_info:git:*" formats "(%b) "

  echo -e -n "\x1b[\x33 q"
  PROMPT="%B%1~ $%b %F{004}${vcs_info_msg_0_}%f> "
  RPROMPT=" %F{005}%T%f"
}

关于单引号和双引号。在前一天,单引号对我有效,但在接下来的一天却无效了。不确定这个错误的根本原因是什么,但是当阅读其他评论时,行为似乎相当不一致。我希望有人能够通过回答来改进这个问题。 - zardilior
1
引号对我来说没有影响,但将变量放在precmd中完美地解决了问题,谢谢。 - Martin Lyne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接