我试图在vim状态行中显示实时字数.我这样做是通过在我的.vimrc中设置我的状态行并在其中插入一个函数.这个函数的想法是返回当前缓冲区中的字数.然后,此编号显示在状态行上.这应该很好地工作,因为状态线几乎在每个可能的机会更新,因此计数将始终保持"实时".
问题是我当前定义的函数很慢,因此当它用于除最小文件之外的所有文件时,vim显然是缓慢的; 由于这个功能如此频繁地执行.
总之,有没有人有一个聪明的技巧来产生一个快速计算当前缓冲区中的字数并返回结果的函数?
我真的很喜欢迈克尔邓恩上面的回答,但我发现当我编辑时,它导致我无法访问最后一列.所以我对这个功能进行了一些小改动:
function! WordCount() let s:old_status = v:statusmsg let position = getpos(".") exe ":silent normal g\" let stat = v:statusmsg let s:word_count = 0 if stat != '--No lines in buffer--' let s:word_count = str2nr(split(v:statusmsg)[11]) let v:statusmsg = s:old_status end call setpos('.', position) return s:word_count endfunction
我把它包含在我的状态行中没有任何问题:
:set statusline=wc:%{WordCount()}
这是罗德里戈奎罗的想法的可用版本.它不会更改状态栏,而是还原statusmsg变量.
function WordCount() let s:old_status = v:statusmsg exe "silent normal g\" let s:word_count = str2nr(split(v:statusmsg)[11]) let v:statusmsg = s:old_status return s:word_count endfunction
这似乎足够快,可以直接包含在状态行中,例如:
:set statusline=wc:%{WordCount()}
保持当前行的计数和缓冲区其余部分的单独计数.当您在当前行上键入(或删除)单词时,仅更新该计数,但显示当前行计数和缓冲计数的其余部分之和.
更改行时,将当前行计数添加到缓冲区计数,计算当前行中的单词,a)设置当前行计数,b)从缓冲区计数中减去它.
定期重新计算缓冲区也是明智的(请注意,您不必一次计算整个缓冲区,因为您知道正在进行编辑的位置).