如何更新目录更改时的提示

如何更新目录更改时的提示

例如以下内容:

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另请注意,运行,的代码zstyleautoload属于函数。它有点有效,但会阻止以后更改这些设置。这是只需要运行一次的代码,因此请将其放在.zshrc任何函数的外部。

要回答您提出的问题,要在目录更改上运行代码,请将其放入chpwd。但这不是您想要的:您不仅需要在目录更改时更新提示,还需要在 git 状态更改时更新提示,因此每次显示提示时都需要运行更新代码。

相关内容