如何获得(g)Vim以显示当前文件的字符数?


85

我喜欢为我经常去的编程论坛写教程和文章。该论坛每个帖子的字符数限制。我过去曾使用Notepad ++编写帖子,并且它在状态栏中保留实时字符数。我现在开始更多地使用gVim了,我现在真的不想回到Notepad ++,但是对这个字符进行计数非常有用。如果我超过这个数,我通常最终会将帖子粘贴到Notepad ++中,这样我就可以看到何时进行了足够的修剪以达到极限。

我已经看到了一些有用的建议:set ruler,但这仅通过当前行上的当前列索引给出了字符计数。如果我不使用段落分隔符,那就太好了,但是我敢肯定,您会同意在一个段落中读取数千个字符并不舒服。

我阅读了帮助,并认为它rulerformat会起作用,但是在查看了statusline它使用的格式后,我看不到任何能为当前缓冲区提供字符计数的内容。

我已经看到有添加此功能的插件,但是我仍将脚趾插入gVim中,在不确定它们的作用之前,我不确定是否要加载随机插件。我更喜欢使用Vim内置的东西,但是如果它不存在,它就不存在。

我应该怎么做才能实现自己的目标?如果涉及插件,您会使用它吗?

Answers:


140

g CTRL-G在正常模式下按可以在光标和文件上显示一些统计信息。

如果您使用的是Linux,则可以wc -m用来获取当前文件中的字符数

:!wc -m %

由于它不是实时更新的,因此您可能想将此命令映射为以下内容:

map <F4> :!wc -m %<CR>

19
g CTRL-G我不知道这存在。真好!
杰森·唐

很好,我一直忘记在Vim中使用!bang命令
Eddie B

3
g <cg>可以跨平台工作,很好。
AndrewPK

在哪里可以找到有关的更多信息! [...] %
炒锅

帮助在这里:vimdoc.sourceforge.net/htmldoc/various.html#:!cmd。如果您大量使用Shell命令,请同时检查以下插件:stevelosh.com/projects/clam
mrucci 2014年

24
:help count-items

建议您可以进行替换ala的试运行

:%s/./&/gn

(然后报告匹配的字符数),或者您看中strlen()了视觉选择的文本:

:echo strlen(@")

(“是未命名的寄存器)

因为您可以像%{myfunc()}这样在状态栏中调用表达式,所以这可能是一个不错的起点。计数所有时间可能会有点浪费时间,因为您必须先选择整个文本然后再将其拉出,但也许已经可以在“ -register”中显示字节数了。如果您真的想知道该数字缓冲区中的字符数:只需在视觉上选择缓冲区中的所有文本并对其进行猛拉,那么解决方案将是:

 :set statusline=%{strlen(@")}

这将为您提供“-”寄存器中的字符数(如果您选择并提取当前缓冲区,则该字节数与字节数相同)。


该解决方案在Windows上也可以使用(bash命令不会)。
dastrobu

我喜欢计数不会像g<CTRL-g>接受的答案中的方法一秒钟后消失。
切斯特

7

mrucci答案的增强:

您可以wc在Linux上使用,而无需先保存文件:w,方法如下:

:w !wc -m

您可以将其映射到mrucci提到的内容。


6
:help statusline

给你

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

这也是解决您的问题的好方法。只需使用转到缓冲区的末尾,G状态行中显示的字节数就是字符数(当然,对于多字节字符不正确)。回到你的故乡ctrlo


1
对于多字节字符,这是有问题的。我将%o放在状态栏后发现了这个问题:)
Matt

@Matt:那么,解决方案是什么?
akira

1
在正常模式下,mrucci的解决方案“ g ^ g”对我来说已经足够了。我需要它来进行快速调试,因此我没有花时间尝试在状态栏中获取该信息。
马特


1
由于文档含糊不清且令人困惑,因此值得注意的是,一个需要执行的特定命令是set statusline+=\ %o\ %N (有趣的是,它不适用于“ t S”项)。然后,如果状态栏保持不变,那是因为您必须执行set laststatus=2。对我来说,它用新的替换了现有的透明状态行,它是纯黑色的,并且只有“字节数”项。
Hi-Angel


3

您可以追加一个表达式以在状态栏中显示缓冲区的字节数,方法是:

:set statusline+=\ %{\ line2byte(line(\"$\")+1)-1\ }B

或者,您可以直接更改option变量以避免所有转义:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'

当我尝试此操作时,gVim抱怨表达式序列未封闭。我注意到您缺少括号,但是修复该问题也无济于事。这是我重写的内容::set statusline =%{line2byte(line(“ $”)))}
OwenP 2010年

@OwenP:现在应该修复
akira

1
可能您希望...%{ line2byte(line(\"$\")+1))-1 }这样,以便在计数中包括最后一行的字符。但是,这种方法不能正确计数多字节字符。
直觉

1
另外,我认为您需要逃脱空间,或者只是摆脱它们。
直觉

编辑以包括@intuited的建议,并附加到状态行而不是覆盖它。
joeytwiddle 2014年

0

在接受mrucci的回答之前,我一直在使用解决方法:

我偶然发现,当我:w保存文件时,该命令输出写入的字节数。这或多或少是一个字符数,因此到目前为止已经足够接近了。我也很喜欢mrucci的答案,可能还不止于此,因为它也有字数。


0

如果保留文本的文件副本,只需将文本写入磁盘-默认情况下会显示字符数。

如果您不想保留文件,只需将文本保存到/dev/null:w!/dev/null

您还可以让wc您的字符数::%!wc -c-但不要忘记点击U以恢复您的文本。

如果经常需要,只需将这些命令映射到键序列::map #wc :w!/dev/null^[-请注意,^[必须以Ctrl+ 输入V Esc

作为文字大小的第一个指标,只需打开行号即可;承认:这需要一些心算;-)


0

遇到此问题并阅读答案后(感谢mrucci),我将这些行添加到了.vimrc初始化文件中。

# get full statistics on the current buffer (not perfect, may redraw screen)
map ;gg           G$g<C-G>''
# get full statistics on the current position in the buffer
map ;gh           g<C-G>

我留给vim:help用户弄清楚他们在做什么。

我个人觉得用;开始Vim映射很有用。或,因为我很少将它们用作命令的第一个字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.