たとえば、次のようになります。
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状態が変更されたときにプロンプトも更新する必要があるため、プロンプトが表示されるたびに更新コードを実行する必要があります。