디렉터리 변경 시 프롬프트를 업데이트하는 방법

디렉터리 변경 시 프롬프트를 업데이트하는 방법

예를 들어 다음과 같습니다.

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 통계를 업데이트하려면 필요합니다.exec "${SHELL}" "$@"

디렉토리 변경에 자동으로 반응하는 방법은 무엇입니까?

답변1

PROMPT="…$(build_prompt)"를 사용하면 할당 시간 , 즉 읽을 때 실행 하고 해당 실행 결과를 힌트로 사용합니다.build_prompt.zshrc

build_prompt프롬프트가 표시될 때마다 실행하려면 $(build_prompt)변수 value 에 문자열을 직접 포함하십시오 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 상태가 변경될 때 프롬프트도 업데이트해야 하므로 프롬프트가 표시될 때마다 업데이트 코드를 실행해야 합니다.

관련 정보