如何让 zsh 在进入 Git 仓库时显示其中有暂存的修订版本

如何让 zsh 在进入 Git 仓库时显示其中有暂存的修订版本

这是我当前的提示:

user@machine ~/Projects/git/repo (git)-[name_of_the_branch] %

我希望它通过附加“S”来向我显示 Stash 修订,如下所示:

user@machine ~/Projects/git/repo (git)-[name_of_the_branch][S] %

而且‘S’应该是绿色的:)

更好的方法是附加存储的修订版本的数量。

user@machine ~/Projects/git/repo (git)-[name_of_the_branch][Number_of_stashed_revisions] %

我需要在 .zshrc 中更改什么?

这是我当前的 .zshrc 文件

https://gist.github.com/801944

答案1

首先需要定义一个测试函数:

  • 如果你在 git repo 中
  • 如果有隐藏的更改

幸运的是,这两者实际上可以合二为一。您要查找的命令是:

[ "$(git stash list 2>/dev/null)" != "" ]

如果没有回购,那么git 存储列表命令本身会将错误打印到标准错误,但不会将任何内容打印到标准输出(在这种情况下,它会顺便返回错误代码)。如果有存储库,它将不打印任何内容,但不会打印错误。因此,针对空白字符串的测试涵盖了这两者。

然后你需要把它放入你的提示中。我假设你熟悉 $PS1 变量,所以我只向你展示一个仅显示以下内容的定义:

PS1='$(if [ "$(git stash list 2>/dev/null)" != "" ]; then echo "[ S ]"; fi)'

最后一部分是添加颜色。您应该知道,通过写出转义代码,颜色会添加到您的终端中。这些代码不会被渲染,但其后的所有文本都会被更改。这意味着您不仅需要打开它们,还需要关闭它们。最后,由于您在提示符中执行此操作,因此您需要指出它们不占用任何空间(否则当您滚动浏览历史记录时,您的终端将严重重绘自身)。

定义颜色通常使用这个样板:

# Try to load colors
autoload colors zsh/terminfo
if [[ "$terminfo[colors]" -ge 8 ]]; then
    colors
fi
for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
    eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
    eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
done
PR_NO_COLOR="%{$terminfo[sgr0]%}"

在定义 $PS1 之前将其粘贴到 .zshrc 中,然后就可以使用名为 $PR_ 的变量引用颜色颜色名称。为了不占用空间,你需要将它们包裹起来%{风险自回归%}。这意味着你最终会得到类似这样的结果:

PS1='$(if [ "$(git stash list 2>/dev/null)" != "" ]; then echo "%{$PR_GREEN%}[ S ]%{$PR_NO_COLOR%}"; fi)'

您可以使用$PR_LIGHT_GREEN如果您不想让文本加粗。请在$terminfo获得更多文本效果。

相关内容