Vim中的快速字数统计功能

Gre*_*ton 34 vim

我试图在vim状态行中显示实时字数.我这样做是通过在我的.vimrc中设置我的状态行并在其中插入一个函数.这个函数的想法是返回当前缓冲区中的字数.然后,此编号显示在状态行上.这应该很好地工作,因为状态线几乎在每个可能的机会更新,因此计数将始终保持"实时".

问题是我当前定义的函数很慢,因此当它用于除最小文件之外的所有文件时,vim显然是缓慢的; 由于这个功能如此频繁地执行.

总之,有没有人有一个聪明的技巧来产生一个快速计算当前缓冲区中的字数并返回结果的函数?

小智 25

我真的很喜欢迈克尔邓恩上面的回答,但我发现当我编辑时,它导致我无法访问最后一列.所以我对这个功能进行了一些小改动:

function! WordCount()
   let s:old_status = v:statusmsg
   let position = getpos(".")
   exe ":silent normal g\<c-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
Run Code Online (Sandbox Code Playgroud)

我把它包含在我的状态行中没有任何问题:

:set statusline=wc:%{WordCount()}

  • 这里有一个小错字.第一个粗体线下面的行应该是'exe':静音正常g\<cg>"`. (2认同)

小智 23

这是罗德里戈奎罗的想法的可用版本.它不会更改状态栏,而是还原statusmsg变量.

function WordCount()
  let s:old_status = v:statusmsg
  exe "silent normal g\<c-g>"
  let s:word_count = str2nr(split(v:statusmsg)[11])
  let v:statusmsg = s:old_status
  return s:word_count
endfunction
Run Code Online (Sandbox Code Playgroud)

这似乎足够快,可以直接包含在状态行中,例如:

:set statusline=wc:%{WordCount()}
Run Code Online (Sandbox Code Playgroud)

  • FWIW,这不适用于Ubuntu 12.04上的Vim 7.3.我不能追加到最后!也就是说,"A"和"a"(后者在一行中的最后一个字符上)不会将光标留在最后一个字符之外,而是直接在它前面.我无法想象为什么. (5认同)

Ste*_*yer 9

保持当前行的计数和缓冲区其余部分的单独计数.当您在当前行上键入(或删除)单词时,仅更新该计数,但显示当前行计数和缓冲计数的其余部分之和.

更改行时,将当前行计数添加到缓冲区计数,计算当前行中的单词,a)设置当前行计数,b)从缓冲区计数中减去它.

定期重新计算缓冲区也是明智的(请注意,您不必一次计算整个缓冲区,因为您知道正在进行编辑的位置).