例如以下内容:
prompt_git() {
local PL_BRANCH_CHAR
() {
PL_BRANCH_CHAR='!'
}
local ref mode repo_path
repo_path=$(git rev-parse --git-dir 2>/dev/null)
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)"
if [[ -e "${repo_path}/BISECT_LOG" ]]; then
mode=" <B>"
elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then
mode=" >M<"
elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then
mode=" >R>"
fi
setopt promptsubst
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' get-revision true
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' stagedstr '✚'
zstyle ':vcs_info:*' unstagedstr '●'
zstyle ':vcs_info:*' formats ' %u%c'
zstyle ':vcs_info:*' actionformats ' %u%c'
vcs_info
echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode} "
fi
}
build_prompt() {
RETVAL=$?
prompt_git
}
PROMPT="%{%f%b%k%}$(build_prompt)"
如果我更改目录它不会做出反应
要更新 git stats 我需要exec "${SHELL}" "$@"
如何自动对目录更改做出反应?
答案1
使用,您在分配时PROMPT="…$(build_prompt)"
运行,即当您被读取时,并使用该运行的结果作为提示。build_prompt
.zshrc
build_prompt
要在每次显示提示时运行,请将字符串$(build_prompt)
直接包含在变量值中PROMPT
。这需要打开该prompt_subst
选项。
setopt prompt_subst
PROMPT='%{%f%b%k%}$(build_prompt)'
或者,运行提示设置代码precmd
钩。
set_prompt () {
…
PROMPT="%{%f%b%k%}${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode} "
fi
}
precmd_functions+=set_prompt
set_prompt
setopt
另请注意,运行,的代码zstyle
不autoload
属于函数。它有点有效,但会阻止以后更改这些设置。这是只需要运行一次的代码,因此请将其放在.zshrc
任何函数的外部。
要回答您提出的问题,要在目录更改上运行代码,请将其放入chpwd
钩。但这不是您想要的:您不仅需要在目录更改时更新提示,还需要在 git 状态更改时更新提示,因此每次显示提示时都需要运行更新代码。