【问题标题】:Is it possible to format the colour of parts of my git branch name inside the prompt?是否可以在提示中格式化我的 git 分支名称的部分颜色?
【发布时间】:2021-09-28 07:17:31
【问题描述】:

在我的.zshrc 文件中,我有以下几行来解析我当前的 git 分支并将其显示在终端中,.zshrc 文件如下所示:

# Load version control information
autoload -Uz vcs_info
precmd() { vcs_info }

# Set up the prompt (with git branch name)
setopt PROMPT_SUBST
PROMPT='%n in ${PWD/#$HOME/~} ${vcs_info_msg_0_} > '


# Format the vcs_info_msg_0_ variable
zstyle ':vcs_info:git:*' formats '(%b)'

所以我的终端最终看起来像这样:

me in ~/repos/myrepo (feat/MYISSUE-123/fix-the-broken-stuff) >

我想修改上面的脚本,使MYISSUE-123 的颜色与分支名称的其余部分不同。
我该怎么做?

【问题讨论】:

  • 那么为什么要投票结束这个问题呢?
  • 不幸的是,我不知道 zsh,但我会尝试使用 git branch --show-current 提取分支名称,然后将其传递给 sed 以围绕问题注入颜色。但我不确定它是否就这么简单。我认为在 bash 中,可以将 PROMPT_COMMAND 设置为任何脚本,以便您可以准备 PS1 可以使用的变量。
  • @PatrickJanser 代码已经这样做了,分支名称存储在$vcs_info_msg_0_ 中。但是,OP 只想为分支名称的 部分 着色。由于这是提示的一部分,理想情况下,解决方案不应调用任何外部命令,以避免分叉进程,从而减慢提示的显示速度。
  • 没有冒犯,但这太荒谬了。我被这两件事困住了。
  • @user1934428 这真的很重要。这个问题完全没问题。

标签: regex zsh zshrc


【解决方案1】:

试试这个...将 precmd 更改为:

precmd() {
  vcs_info
  psvar=(${(s:/:)vcs_info_msg_0_})
  # in case there are more than three components:
  psvar[3]=${(j:/:)psvar[3,-1]}  
}

通过将 precmd() 添加到钩子中,确保在每个提示显示之前调用它:

autoload -Uz add-zsh-hook
add-zsh-hook precmd precmd

并将 PROMPT 更改为:

PROMPT='%n in ${PWD/#$HOME/~} %1v/%F{red}%2v%f/%3v > '

在这个答案中有一些关于psvar 的注释:https://stackoverflow.com/a/64094551/9307265
(s)(j) 参数扩展标志记录在 zshexpn 手册页中。

如果有任何问题,请告诉我。

【讨论】:

  • 谢谢!它现在似乎不起作用。所以查看zshexpn 的手册页s 在分隔符处拆分字符串,在这种情况下/j 将数组中的所有内容附加到单个值中。但是,在您拥有(s:/:) 的手册页中,它拥有(s./.),但更改它并没有任何区别。在PROMPT 这-%1v 是说“从数组中取变量一”?等等... %F%f 正在封装格式?现在最终输出看起来像这样:me in ~/repos/myrepo /} > 看起来某处存在格式错误
  • OK 看起来它也应该是零索引,比如 %0v .... 我会调整一些东西
  • @mal - 感谢您的尝试!您注意到的项目在应该工作的部分中:)。 (s:/:)(s./.) 是等价的——分隔符可以是任何东西,只要它是一致的。这就是它支持拆分任何字符的方式,例如s(.:.)%1v 确实是在说要替换 psvar[1]%2vpsvar[2] 等等 - zsh 通常是 1-indexed,这要归功于它的 csh 根。在这里,%F%f 本质上是“开始颜色”和“停止颜色”。
  • 在设置了一个 git 存储库来测试这个端到端之后,我发现在我的系统上,precmd() 没有被调用。但是,vcs_info_msg_0_ 仍在更新中 - 我不确定如何。我更新了答案以确保在显示每个提示之前调用precmd
  • 第一个是钩子名,第二个是函数名。在我的系统上,我将函数命名为 my_precmd() 只是为了避免这种混淆,所以它有 add-zsh-hook precmd my_precmd。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 2010-11-20
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2020-08-11
相关资源
最近更新 更多