如果输出是数字,我如何使这个条件 return 成为一个值?

How can i make this conditional return a value IF the output is a number?

我正在为我的 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

并且我专门针对 return 做了这个命令 git checkout | grep -oP "(\M+)" -c 一些未提交的更改(这就是我使用 grep 的原因)。

所以基本上,如果我在一个 git 存储库的位置并且我在 shell 上键入命令,它 return 是我的“0”,“1”依此类推,具体取决于我有多少未提交的更改。

但是,如果我在不是 git 存储库的位置键入它,它 return 就像我:

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”用于当它不是数字时(就像我上面提到的“致命”输出一样)。但我不知道如何使这个有条件。

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

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

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

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

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