我经常使用 VIM 在报纸或博客网站上写评论。
通常有一个最大数量的字符要输入。
如何创建一个计数器(状态栏中的 pe)来查看我在输入时输入的字符(包括空格)?
该设置允许使用特殊项目'statusline'
评估表达式。%{...}
因此,如果我们可以提出一个返回当前缓冲区中字符数(而不是字节数!)的表达式,我们可以将其合并到状态行中来解决问题。
此命令执行此操作:
:set statusline+=\ %{strwidth(join(getline(1,'$'),'\ '))}
对于带有CJK 字符 strwidth()
的文本还不够好,因为它返回的是显示单元格计数,而不是字符计数。如果双角字符是要求的一部分,请改用此改进版本:
:set statusline+=\ %{strlen(substitute(join(getline(1,'$'),'.'),'.','.','g'))}
但请注意,对缓冲区的每一次更改都会评估表达式。
周日下午奖励——光标下的字符位置也可以打包成一个表达式。不适合胆小的人:
:set statusline+=\ %{strlen(substitute(join(add(getline(1,line('.')-1),strpart(getline('.'),0,col('.')-1)),'.'),'.','.','g'))+1}
通过混合glts 答案和这篇文章以及对代码的一些摆弄,我为自己做了以下内容,您可以将其放入~/.vimrc
文件中(您需要有 1 秒的偶像光标,以便函数计算单词和字符以及值可以通过修改来改变set updatetime=1000
):
let g:word_count = "<unknown>"
let g:char_count = "<unknown>"
function WordCount()
return g:word_count
endfunction
function CharCount()
return g:char_count
endfunction
function UpdateWordCount()
let lnum = 1
let n = 0
while lnum <= line('$')
let n = n + len(split(getline(lnum)))
let lnum = lnum + 1
endwhile
let g:word_count = n
let g:char_count = strlen(substitute(join(getline(1,'$'),'.'),'.','.','g'))
endfunction
" Update the count when cursor is idle in command or insert mode.
" Update when idle for 1000 msec (default is 4000 msec).
set updatetime=1000
augroup WordCounter
au! CursorHold,CursorHoldI * call UpdateWordCount()
augroup END
" Set statusline, shown here a piece at a time
highlight User1 ctermbg=green guibg=green ctermfg=black guifg=black
set statusline=%1* " Switch to User1 color highlight
set statusline+=%<%F " file name, cut if needed at start
set statusline+=%M " modified flag
set statusline+=%y " file type
set statusline+=%= " separator from left to right justified
set statusline+=\ %{WordCount()}\ words,
set statusline+=\ %{CharCount()}\ chars,
set statusline+=\ %l/%L\ lines,\ %P " percentage through the file
它看起来像这样: