0

我正在为我的 vim-statusline 制作这个功能:

function! GitCommitSymbol(timer_id)
  let l:uncommited = system('echo -n $(git checkout | grep -oP "(\M+)" -c)')
  if (uncommited == number)
    let g:uncommited = ''
    hi MyGitSymbol ctermfg=11
  else
    let g:uncommited = ''
    hi MyGitSymbol ctermfg=7
  endif
  call timer_start(30000, 'GitCommitSymbol')
endfunction

git checkout | grep -oP "(\M+)" -c专门制作了这个命令,只返回一些未提交的更改(这就是我使用 grep 的原因)。

所以基本上,如果我在一个 git 存储库的位置并且我在 shell 上键入命令,它会返回“0”、“1”等等,这取决于我有多少未提交的更改。

但是,如果我在不是 git 存储库的位置键入它,它会返回如下内容:

fatal: not a git repository (or any parent up to mount point /) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). 0

所以,在函数的这一行:if (uncommited == number),我需要一个条件来显示一些如果命令的输出是数字的,“else”是用于当它不是数字的时候(就像我上面放的“致命”输出) . 但我不知道如何使这个有条件。

4

1 回答 1

1

您不需要额外的echo,只需直接调用命令,然后使用 Vimscripttrim()删除输出周围的空格。

let uncommitted = trim(system('git checkout | grep -oP "(\M+)" -c'))

然后,您可以使用=~运算符以及正则表达式来检查它是否是数字,例如'^\d\+$'匹配数字输出:

if uncommitted =~ '^\d\+$'

如果稍后您想以数字形式访问计数,您可以使用str2nr(uncommitted).

于 2020-12-18T08:23:58.610 回答