目前在我的 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
为什么我的提示不会按预期运行?
答案 0 :(得分:0)
发生这种情况是因为函数中的语句 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
等。