Получить количество слов в реальном времени для документа в vim

Я хотел бы, чтобы vim отображал общее количество слов документа в строке состояния (где отображаются текущая строка и номер символа). Я сталкивался с похожими вопросами на SO и пробовал все предложения, упомянутые здесь и здесь --- и ни один из них не оказал никакого влияния на мой статус бар.

Чтобы явно назвать несколько, я попытался вставить любое из следующего в свой ~/.vimrc (и впоследствии перезапустить 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 

OR

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()}

OR

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()}

OR

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

или многое другое. И, как я уже сказал, не было никакого эффекта. Нет сообщений об ошибках, нет визуально заметных изменений. Я предполагаю, что может быть общая проблема, которую я упускаю, но что это?


person TheChymera    schedule 21.08.2018    source источник
comment
По крайней мере, у меня работает второй пример. Проверьте свой вариант statusline после запуска: :set statusline?. Попробуйте также повторить возврат вашей функции напрямую: :echo WordCount(), возможно, вы установили плагин, который управляет строкой состояния.   -  person yolenoyer    schedule 21.08.2018
comment
echo WordCount() действительно печатает номер строки, но не в реальном времени. :set statusline? печатает только statusline=wc:%{WordCount()}. единственный плагин, который я установил, это sleuth.   -  person TheChymera    schedule 21.08.2018
comment
Отвечает ли это на ваш вопрос? Функция быстрого подсчета слов в Vim   -  person Serge Stroobandt    schedule 20.02.2020


Ответы (2)



Количество слов в vim-airline

Количество слов стандартно предоставляется vim-airline для ряда типы файлов, существовавшие на момент написания: asciidoc, help, mail, markdown, org, rst, tex ,text

Если количество слов не отображается в vim-airline, чаще всего это происходит из-за нераспознанного типа файла. Например, по крайней мере сейчас, тип составного файла markdown.pandoc не распознается vim-airline для подсчета слов. Это можно легко исправить, изменив .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 по умолчанию. Последняя строка гарантирует, что vim-airline включен.

В случае сомнений &filetype открытого файла возвращается при выполнении следующей команды:

:echo &filetype

Вот мета-пример:

vim-авиакомпания количество слов

person Serge Stroobandt    schedule 19.02.2020
comment
Я играл с этим, и это довольно приятно, однако было бы лучше иметь возможность удалить переднюю часть в жидких файлах или также удалить теги HTML. Я делаю это со сценарием в bash, на данный момент. - person Gerard; 26.06.2020