Электронная почта Zsh git в приглашении не обновляется

Проблема

У меня есть zsh, установленный на Mac OS Catalina и использующий iTerm2 в качестве терминала. Я использую тему robbyrussell.zsh-theme и изменил ее для печати электронной почты git в приглашении (дополнительная информация здесь ). Я изменил robbyrussell.zsh-theme на это:

PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT+=' %{$fg[cyan]%}%~%{$reset_color%} $(git_prompt_info)'

ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[blue]%}$(git_current_user_email)["
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}] %{$fg[yellow]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%}] %{$fg[green]%}✔"

Когда я перехожу в каталог git, он не получает электронную почту пользователя из локального .git/config или из глобального ~/.git/config.

Проведенные исследования:

Я просмотрел несколько stackoverflow и других статей и перепробовал кучу вещей, но безуспешно.

Подход, который сработал для меня, заключался в создании псевдонимов для переключения между двумя адресами электронной почты:

home='git config user.email "<homeemail>" && source ~/.zshrc'
work='git config user.email "<workemail>" && source ~/.zshrc'

Но я должен выполнять эти команды все время, чтобы подсказка забирала письмо, даже если оно установлено в локальной конфигурации git.

Может ли кто-нибудь помочь в отношении того, что нужно сделать, чтобы zsh запрашивал чтение электронной почты пользователя git напрямую, когда мы переходим в репозиторий?


person codenoob    schedule 08.05.2021    source источник
comment
Я только что понял, что мой ответ на самом деле не работал, когда не был в репозитории git. Я обновил его.   -  person mihi    schedule 13.05.2021
comment
Ваш ответ отлично сработал для меня, даже если он не был в репозитории git. Но просто нужно было небольшое изменение форматирования, чтобы сохранить [ в ZSH_THEME_GIT_PROMPT_PREFIX и не доводить его до PROMPT   -  person codenoob    schedule 13.05.2021


Ответы (2)


Это происходит потому, что ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[blue]%}$(git_current_user_email)[" использует двойные кавычки, что приводит к тому, что $(git_current_user_email) оценивается только один раз, когда robbyrussell.zsh-theme получает источник, а не для каждого приглашения.

Вы можете подтвердить это, запустив echo "$ZSH_THEME_GIT_PROMPT_PREFIX", который теперь должен содержать адрес электронной почты, вместо буквального $(git_current_user_email).

К сожалению, здесь также нельзя использовать одинарные кавычки (которые не оценивают замены). Так как тогда вы увидите буквальное $(git_current_user_email) в своем приглашении, поскольку функция git_prompt_info (которая использует ZSH_THEME_GIT_PROMPT_PREFIX внутри) не оценивает его.

Тем не менее, вы можете поместить $(git_current_user_email) непосредственно в PROMPT, который будет оцениваться при каждом новом приглашении.

Но нам нужно отключить его самостоятельно, когда мы не в репозитории git и не можем полагаться на плагин git.

Что-то вроде этого:

PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT+=' %{$fg[cyan]%}%~%{$reset_color%} $(my_git_prompt_prefix)$(git_prompt_info)'

ZSH_THEME_GIT_PROMPT_PREFIX=""
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}] %{$fg[yellow]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%}] %{$fg[green]%}✔"

function my_git_prompt_prefix() {
  # Based on: https://github.com/ohmyzsh/ohmyzsh/blob/d646884add277d134235a9b18ab755388d6e0d8d/lib/git.zsh#L15-L23
  # If we are on a folder not tracked by git, get out.
  # Otherwise, check for hide-info at global and local repository level
  if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
     || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
    return 0
  fi

  local ref
  ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
  || ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
  || return 0

  # The actual git prompt prefix
  echo "%{$fg[blue]%}$(git_current_user_email)["
}

(Также обратите внимание, что PROMPT имеет одинарные кавычки вместо двойных).

Более подробную информацию о различных стилях цитирования и заменах можно найти здесь: https://mywiki.wooledge.org/Quotes< /а>

person mihi    schedule 12.05.2021
comment
Ваше предыдущее решение работало нормально, но нуждалось в небольшой настройке для случая, когда его нет в репозитории git. Решение, которое я публикую ниже, сработало для меня. - person codenoob; 13.05.2021

В соответствии с решением, предложенным @mihi с небольшой настройкой, у меня это сработало нормально:

PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT+=' %{$fg[cyan]%}%~%{$reset_color%} %{$fg[blue]%}$(git_current_user_email)$(git_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="["
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}] %{$fg[yellow]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%}] %{$fg[green]%}✔"
person codenoob    schedule 13.05.2021