Я хотел бы, чтобы 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
или многое другое. И, как я уже сказал, не было никакого эффекта. Нет сообщений об ошибках, нет визуально заметных изменений. Я предполагаю, что может быть общая проблема, которую я упускаю, но что это?
statusline
после запуска::set statusline?
. Попробуйте также повторить возврат вашей функции напрямую::echo WordCount()
, возможно, вы установили плагин, который управляет строкой состояния. - person yolenoyer   schedule 21.08.2018echo WordCount()
действительно печатает номер строки, но не в реальном времени.:set statusline?
печатает толькоstatusline=wc:%{WordCount()}
. единственный плагин, который я установил, это sleuth. - person TheChymera   schedule 21.08.2018