zsh - 在带有promptinit的zsh自定义提示符中使用vcs_info

标签 zsh prompt zshrc

目前在我的 .zshrc 中,我有以下几行来提供一些 git 信息:

autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
RPROMPT=\$vcs_info_msg_0_
zstyle ':vcs_info:git:*' formats '%b'

这使我的 shell 如下所示:

[me@computer dir]$                                                                  main

我想将此配置移出 .zshrc 并移至使用 promptinit 初始化的自定义提示中。此配置位于名为 prompt_mycustomprompt_setup 的文件中,该文件可在我的 fpath 上找到。配置如下:

precmd_vcs_info() {
    vcs_info
}

prompt_mycustomprompt_setup () {
    autoload -Uz add-zsh-hook vcs_info
    setopt prompt_subst
    add-zsh-hook precmd precmd_vcs_info
    RPROMPT=\$vcs_info_msg_0_
    zstyle ':vcs_info:git:*' formats '%b'

    PS1='(test)> '
}

prompt_mycustomprompt_setup "$@"

然后,我从 .zshrc 中删除了相关行,并替换为以下行:

autoload -Uz promptinit
promptinit

prompt mycustomprompt

但是,vcs_info 并未显示,而是在提示符中显示了一个常量静态值 $vcs_info_msg_0_:

(test)>                                                         $vcs_info_msg_0_

为什么我的提示符不会按预期运行?

最佳答案

发生这种情况是因为语句 setopt promptsubst在你的函数中执行 prompt函数,它的作用是 setopt localoptions 。所以,当 prompt返回,该选项将重置为默认值。

不直接设置 shell 选项, promptinit主题应该是set the prompt_opts array :

The array prompt_opts may be assigned any of "bang", "cr", "percent", "sp", and/or "subst" as values. The corresponding setopts (promptbang, etc.) are turned on, all other prompt-related options are turned off.

因此,对于提示您使用 setopt promptsubst ,你应该在你的 setup 中做这样的事情功能:

prompt_opts=(cr percent sp subst)

但是,正如 Zsh mailing list 中提到的,Zsh 开发人员通常建议使用 promptsubst ,因为这可以

  • 会产生您可能意想不到的副作用(例如使用 print -P 时)和/或
  • 导致性能不佳(提示中的表达式比预期的成本更高,并且每当提示重新绘制时都会重新计算)。

为了确保最佳性能和稳定性,我建议这样做:

prompt_mycustomprompt_precmd() {
    vcs_info
    RPS1=" $vcs_info_msg_0_"
}

prompt_mycustomprompt_setup () {
    autoload -Uz vcs_info
    add-zsh-hook precmd prompt_mycustomprompt_precmd   
    zstyle ':vcs_info:git:*' formats '%b'

    prompt_opts=( cr percent sp )
    PS1='(test)> '
}

prompt_mycustomprompt_setup "$@"

请注意,我还重命名了您的 precmd钩子(Hook)函数,因为所有prompinit钩子(Hook)函数名称应该遵循 prompt_<theme>_<hook> 模式,这样 the prompt function can automatically unhook them切换主题时。

此外,promptinit主题应该使用较短的 $PS1 , $RPS1等代替 $PROMPT , $RPROMPT

关于zsh - 在带有promptinit的zsh自定义提示符中使用vcs_info,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66844301/

相关文章:

iterm2 - macOS Mojave 更新后 - iterm 和 zsh 损坏

bash - Shell 变量定义和替换是否在一行中正确引用?

rvm - zsh中rbenv版本显示右键提示不刷新

bash - 将 Zsh 历史保存到 ~/.persistent_history

shell - Powershell 中的 $ExecutionContext.SessionState.Path.CurrentLocation 和 $pwd 有什么区别?

javascript - JS 的意外提示行为

ios - 以编程方式向 UINavigationBar 添加提示

启动新终端时执行zshrc别名

bash - 尝试通过 bash 脚本显示不同的颜色

python - 尝试使用 python 脚本获取源时检测到不安全的依赖于完成的目录