目前在我的 .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/