在 vim 状态行上显示总字符数

Display total characters count on vim statusline

我想在我的状态栏中添加一个功能,通过它我可以显示当前文件的总字符数。 :help statusline 告诉我 F 指的是 Full path to the file in the buffer,通过一些搜索,我知道了如何显示 shell 命令的输出。所以我目前在 .vimrc:

中有这些
set statusline+=%#lite#\ %o/%{DisplayTotalChars()}\

function! DisplayTotalChars()
    let current_file = expand("%:F")
    let total_chars = system('wc -c ' . current_file)
    return total_chars
endfunction

这是它现在在状态行中显示的内容,而我只需要字符数而不是要显示的文件路径:

36/29488 /home/nino/scripts/gfp.py^@

set statusline+=%#lite#\ %o/%{DisplayTotalChars()}\

那部分是正确的,减去末尾没有用处的 \

let current_file = expand("%:F")

那部分是不正确的,因为你在 :help 'statusline' 下找到的 F 直接用在 &statusline 的值中是有意义的,但它在 :help expand() 中是没有意义的,其中你应该使用 :help filename-modifiers。正确的行是:

let current_file = expand("%:p")

还有一个工作函数:

function! DisplayTotalChars()
    let current_file = expand("%:p")
    let total_chars = system('wc -c ' . current_file)
    return total_chars
endfunction

但是您的状态行可能每秒刷新几次,因此每次调用外部程序似乎很昂贵。

相反,您应该放弃整个函数并直接使用 :help wordcount()

set statusline+=%#lite#\ %o/%{wordcount().bytes}

它不关心文件名或调用外部程序。

由于重复调用 system()wordcount() 会做很多不必要的工作并消耗额外的 CPU 时间,这甚至可能导致机器速度变慢(尤其是在一个巨大的文件),强烈建议您改用 line2byte()

set statusline=%o/%{line2byte(line('$')+1)-1}

或者更好的是,只要您真的想获取此信息并保持状态栏清洁,请按 gCtrl-g