如何在 vim 状态行中显示字符串的实例数

How to the display the number of instances of a string in vim statusline

不久前我找到了一个在 .vimrc 中使用的函数来显示当前缓冲区中是否出现 " TODO " 并在状态行中显示 TD .这是函数:

...
hi If_TODO_COLOR ctermbg=0 ctermfg=175 cterm=bold
set statusline+=%#If_TODO_COLOR#%{If_TODO()}
...

function! If_TODO()
    let todos = join(getline(1, '$'), "\n")
    if todos =~? " TODO "
        return " TD "
    else
        return ""
    endif
endfunction

我的问题是如何修改函数以 return 字符串在缓冲区中出现的次数 - 类似 TD (6).

您可以 :help filter() 行来获取包含 TODO:

的行列表
let lines = getline(1, '$')
let todos = filter(lines, 'v:val =~? " TODO "')
return len(todos) > 0 ? 'TD' : ''

同样的事情,用更“现代”的方式表达:

return getline(1, '$')
    \ ->filter('v:val =~? " TODO "')
    \ ->len() > 0 ? 'TD' : ''

:help method