ZSH vcs_info:如何指示Git中是否有未跟踪的文件

时间:2018-04-10 02:03:18

标签: git zsh

在我的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存储库中有未跟踪的文件,有没有办法获得指示?

2 个答案:

答案 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语句完全相同。