예를 들어 다음과 같습니다.
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 상태가 변경될 때 프롬프트도 업데이트해야 하므로 프롬프트가 표시될 때마다 업데이트 코드를 실행해야 합니다.