![如何让 zsh 在进入 Git 仓库时显示其中有暂存的修订版本](https://linux22.com/image/1263592/%E5%A6%82%E4%BD%95%E8%AE%A9%20zsh%20%E5%9C%A8%E8%BF%9B%E5%85%A5%20Git%20%E4%BB%93%E5%BA%93%E6%97%B6%E6%98%BE%E7%A4%BA%E5%85%B6%E4%B8%AD%E6%9C%89%E6%9A%82%E5%AD%98%E7%9A%84%E4%BF%AE%E8%AE%A2%E7%89%88%E6%9C%AC.png)
这是我当前的提示:
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 文件
答案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获得更多文本效果。