微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在带有 promptinit 的 zsh 自定义提示中使用 vcs_info

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

msgsz

这让我的外壳看起来像下面这样:

.zshrc

我想将此配置移出 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' 并移至使用 [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 "$@"

但是,vcs_info 没有显示,而是在我的提示中有一个常量静态值 .zshrc

autoload -Uz promptinit
promptinit

prompt mycustomprompt

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

解决方法

发生这种情况是因为函数中的语句 setopt promptsubst 是在执行 promptsetopt localoptions 函数内执行的。因此,当 prompt 返回时,该选项会重置为默认值。

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

数组 prompt_opts 可以被赋值为 "bang""cr""percent""sp" 和/或 "subst" 中的任何一个作为值。对应的setopts(promptbang等)开启,其他所有与prompt相关的选项都关闭。

因此,为了提示您使用 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 钩子函数,因为所有 prompinit 钩子函数名称都应该遵循模式 prompt_<theme>_<hook>,以便在切换主题时 the prompt function can automatically unhook them .

此外,promptinit 主题应该使用较短的 $PS1$RPS1 等,而不是 $PROMPT$RPROMPT 等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。