如何解决在带有 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
是在执行 prompt
的 setopt 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 举报,一经查实,本站将立刻删除。