Como atualizar o prompt na mudança de diretório

1

Por exemplo, com o seguinte:

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)"

não reage se eu mudar de diretório

para atualizar as estatísticas do git eu preciso de exec "${SHELL}" "$@"

como reagir na mudança de diretório automaticamente?

obrigado

    
por Cynede 22.07.2016 / 11:38

1 resposta

2

com PROMPT="…$(build_prompt)" , você está executando build_prompt no momento da atribuição, ou seja, quando seu .zshrc é lido e usando o resultado dessa execução como o prompt.

Para executar build_prompt sempre que o prompt for exibido, inclua a string $(build_prompt) diretamente no valor da variável PROMPT . Isso requer a ativação da opção prompt_subst .

setopt prompt_subst
PROMPT="%{%f%b%k%}$(build_prompt)"

Como alternativa, execute o código de configuração de prompt em um precmd hook .

set_prompt () {
  …
  PROMPT="%{%f%b%k%}${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode} "
  fi
}
precmd_functions+=set_prompt
set_prompt

Observe também que o código que executa setopt , zstyle e autoload não pertence a uma função. Isso funciona, mas impede a alteração dessas configurações mais tarde. Este é um código que precisa ser executado apenas uma vez, portanto, coloque-o em .zshrc fora de qualquer função.

Para responder à pergunta que você fez, para executar o código em uma alteração de diretório, coloque-a em um chpwd gancho . Mas isso não é o que você quer: você precisa atualizar o prompt não apenas em uma alteração de diretório, mas também em uma alteração de estado do git, para que o código de atualização precise ser executado toda vez que o prompt for exibido.

    
por 23.07.2016 / 02:03

Tags