在我的zsh配置中,我对vcs_info
进行了以下设置:
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' unstagedstr '!'
zstyle ':vcs_info:*' stagedstr '+'
zstyle ':vcs_info:*' formats "%u%c"
使用这些设置,当我在包含未分级更改的git存储库中时,提示符中将显示!
。当有阶段性更改时,提示符中将显示+
。
这一切都很好,但是当存储库中有未跟踪的文件时,如何让zsh指示,例如?
?
我在zsh手册中找不到内置设置。如果Git存储库中有未跟踪的文件,有没有办法获得指示?
答案 0 :(得分:3)
在zsh的源代码中,有一个很好的示例显示T
标记在有未跟踪文件时提示:Misc/vcs_info_examples
### Display the existence of files not yet known to VCS
### git: Show marker (T) if there are untracked files in repository
# Make sure you have added staged to your 'formats': %c
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked
+vi-git-untracked(){
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
git status --porcelain | grep '??' &> /dev/null ; then
# This will show the marker if there are any untracked files in repo.
# If instead you want to show the marker only if there are untracked
# files in $PWD, use:
#[[ -n $(git ls-files --others --exclude-standard) ]] ; then
hook_com[staged]+='T'
fi
}
你可以复制&从这里粘贴,但我写了一个略微修改的版本,使用misc而不是添加字符到staged
。
zstyle ':vcs_info:*' formats "%u%c%m"
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked
+vi-git-untracked() {
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
git status --porcelain | grep -m 1 '^??' &>/dev/null
then
hook_com[misc]='?'
fi
}
格式中的 %m
对应hook_com[misc]
中的字符。
同样只是整理git status --porcelain
的整个输出,而使用grep -m 1
可能会更快(取决于缓冲标准输出的方式或实现git status --porcelain
的方式)。
答案 1 :(得分:0)
ymonad的帖子是一种巧妙的解决方案,但由于它提示的提示太长,因此我发布了答案。
我发现记住.zshrc
文件只是一个shell脚本很有帮助-您可以将其视为终端。因此,请阅读man git
,以了解可用于收集所需信息的信息。然后,您可以在.zshrc
中的函数或类似函数中查询git。像这样:
zstyle ':vcs_info:*' formats "%u%c%m"
zstyle ':vcs_info:git*+set-message:*' hooks untracked-git
+vi-untracked() {
if [[ -n "$(git ls-files --others --exclude standard)" ]]; then
hook_com[misc]='?'
else
hook_com[misc]=''
fi
}
当我意识到可以将.zshrc
文件当作shell脚本(duh)处理时,我意识到我可以复制bash中对我有用的文件。因此,以上与我在.bashrc
中查找是否存在未跟踪文件的if语句完全相同。