提示中的 Zsh git 电子邮件不刷新

如何解决提示中的 Zsh git 电子邮件不刷新

问题

我在 mac OS catalina 上安装了 oh my zsh 并使用 iTerm2 作为终端。我正在使用 robbyrussell.zsh-theme 主题并对其进行了修改以在提示中打印 git email(更多信息 here)。我已将 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 config 中设置的。

当我们 cd 到 repo 时,有人可以帮助 zsh 提示直接读取 git 用户电子邮件要做什么吗?

解决方法

发生这种情况是因为 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

,

根据@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]%}✔"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?