代码之家  ›  专栏  ›  技术社区  ›  TheChymera

获取vim中文档的实时单词计数

  •  4
  • TheChymera  · 技术社区  · 7 年前

    我希望vim在状态栏中显示文档总字数(其中显示当前行和字符数)。我也遇到过类似的问题,并尝试了所有提到的建议 here here

    为了明确指出一些,我尝试在 ~/.vimrc (ofc随后重启vim):

    function! CountNonEmpty()
        let l = 1
        let char_count = 0
        while l <= line("$")
            if len(substitute(getline(l), '\s', '', 'g')) > 3   
                let char_count += 1 
            endif
            let l += 1
        endwhile
        return char_count
    endfunction
    
    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  
    
    " If buffer modified, update any 'Last modified: ' in the first 20 lines.
    " 'Last modified: ' can have up to 10 characters before (they are retained).
    " Restores cursor and window position using save_cursor variable.
    function! LastModified()
      if &modified
        let save_cursor = getpos(".")
        let n = min([15, line("$")])
        keepjumps exe '1,' . n . 's#^\(.\{,10}LOC:\).*#\1' .
              \ ' ' . CountNonEmpty() . '#e'
        keepjumps exe '1,' . n . 's#^\(.\{,10}Word Count:\).*#\1' .
              \ ' ' . WordCount() . '#e'
        call histdel('search', -1)
        call setpos('.', save_cursor)
      endif
    endfun 
    

    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
    set statusline=wc:%{WordCount()}
    

    或者

    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
    set statusline=wc:%{WordCount()}
    

    或者

    let g:word_count="<unknown>"
    fun! WordCount()
        return g:word_count
    endfun
    fun! UpdateWordCount()
        let s = system("wc -w ".expand("%p"))
        let parts = split(s, ' ')
        if len(parts) > 1
            let g:word_count = parts[0]
        endif
    endfun
    
    augroup WordCounter
        au! CursorHold * call UpdateWordCount()
        au! CursorHoldI * call UpdateWordCount()
    augroup END
    
    " how eager are you? (default is 4000 ms)
    set updatetime=500
    
    " modify as you please...
    set statusline=%{WordCount()}\ words
    

    1 回复  |  直到 7 年前
        1
  •  15
  •   romainl    7 年前

    假设您的状态行已启用( set laststatus=2 ),如下:

    set statusline+=%{wordcount().words}\ words
    

    wc

    :help wordcount()


    如果您绝对需要向后兼容,那么下面的代码在Vim 7.x中可以正常工作,并且可能在早期版本中也可以正常工作:

    function! WC()
        return len(split(join(getline(1,'$'), ' '), '\s\+'))
    endfunction
    set statusline+=%{WC()}\ words
    

    可以 不过,要更快或更聪明。


        2
  •  0
  •   Serge Stroobandt    5 年前

    字数输入 vim-airline

    字数由提供 vim-airline 对于许多文件类型,在编写时: asciidoc, help, mail, markdown, org, rst, tex ,text

    如果字数未显示在 维姆航空公司 at least for now ,复合文件类型 markdown.pandoc 不被认可 为了字数。这可以通过修改 .vimrc 具体如下:

    let g:airline#extensions#wordcount#filetypes = '\vasciidoc|help|mail|markdown|markdown.pandoc|org|rst|tex|text'
    set laststatus=2    " enables vim-airline.
    

    \v 语句重写默认值 g:airline#extensions#wordcount#filetypes 变量。最后一行确保 已启用。

    如果有疑问 &filetype 在发出以下命令时返回打开的文件的:

    :echo &filetype
    

    vim-airline word count

    推荐文章