我有一个充满文本的文件(例如Markdown或LaTeX)。我想计算一下该文件一部分中的单词数。

我知道我可以做到! wc -w%在当前缓冲区上运行wc -w。而且我知道我可以将感兴趣的部分拖到命名寄存器中。我猜想有一种方法可以将命名寄存器发送到操作系统以在命令或管道中使用,但是我一直找不到。还是有更好的方法来计数寄存器中的单词?

我的用例是我在vim中进行了很多非编程性的写作(笔记,论文等),我想计算在编辑会话中间我给文件的给定部分添加了多少个单词。

#1 楼

您可以使用gCTRL + g,它将为您提供:

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678


如果您只想获取所选内容的字数,也可以在可视模式下使用它,与文本对象(例如ip)结合使用时特别有用。 (例如,您可以使用vipg<C-g>来获取当前段落的字数)。

请参阅::help word-count:help text-objects


上述选项可能更好,但您也可以使用wc实用工具来计算部分中的单词数。除了使用:! wc -w %表格之外,您还可以使用:%!wc -w。这将过滤运动到外壳工具(在本例中为%,整个缓冲区),但您也可以使用其他范围(例如前5行:1,5!wc -w,当前行和后5行!,+5!wc -w等)。您还可以在可视模式下选择文本,然后键入:!wc -w来过滤选择。

请注意,这将用shell工具的输出替换运动,但是您可以u撤消该操作。 />
请参阅:help :range!
:help range,在本答案中,我将给出范围的更多示例。

评论


我在搜索时发现了类似的内容,但是错过了第一个g是计数命令的一部分,而不是位置说明符。该解决方案现在很有意义。我显然也应该在Visual模式下阅读;我没有经常使用它。

–科林·麦克弗(Colin McFaul)
15年6月28日在0:31

我不知道您可以那样使用g 。太棒了!

–EvergreenTree
15年6月28日在0:48

#2 楼

可以通过两种方法完成此操作:纯vimscript方法和wc方法。

纯vim方法

您可以使用search and replace命令执行此操作。例如:

:%s/\<\w\{-}\>//gn


它的作用是代替某些东西代替给定的模式,它只计算模式的出现。这是因为有n标志。要计算特定部分的单词(在本例中为第5至15行),您可以执行以下操作:

选择到寄存器中。要查看可以替代5-15的更多可能性,请阅读cmdline-ranges的帮助主题。如果您想经常执行此操作,最好为其创建一个映射(或命令)。另外,如果启用了hlsearch,则可能需要稍后运行:nohlsearch来清除突出显示。

wc的方式

wc可以完成相同的操作。以相同的方式,您可以使用cmdline-ranges命令使用:s选择区域,也可以将其与外部命令一起使用。例如:

:5,15s/\<\w\{-}\>//gn


这将通过wc命令运行第5至15行。不利的一面是它用命令的输出替换了该行范围。您可以通过按u撤消此更改。还要注意,vimscript解决方案可能无法与其他语言一起使用,因为\w与其他语言中通常的单词字符不匹配。 wc可能比\w做得更好。另外,这是一个花哨的命令,可以使它更快地执行此操作:

:5,15!wc -w


请注意,这会掩盖a寄存器。

注意

看来,也可以使用g<C-g>组合键在可视模式下完成此操作。有关此说明,请参阅Carpetsmoker的答案。

评论


它们需要一个g和一个n才能使它们成为全局的(否则,它们每行仅匹配一个单词)。第二个开头也需要一个s。

–科林·麦克弗(Colin McFaul)
15年6月28日在0:29

已修复,对此表示抱歉。

–EvergreenTree
15年6月28日在0:32

起初使用\ w听起来不错,但是经过测试之后,我发现了许多问题。最大的问题是,它将不匹配非ASCII字符,因此只是跳过了über之类的单词(昨天对此有疑问)。另外,电子邮件之类的单词也算作2个单词,因为-不在\ w中(使用-在英语中不太常见,但在荷兰语中非常常见)。可能还有其他一些字符以这种方式被忽略,这使我想到了最后一点:关于“单词”的约定可能有所不同...

–马丁·图尔诺伊(Martin Tournoij)
15年6月28日在0:43

...有多种语言,而且像wc这样的“适当”工具可能会在语言环境中出现(我不知道GNU wc是否真的通过这种方式处理了这个问题,GNU工具并不以其出色的unicode支持而闻名)。

–马丁·图尔诺伊(Martin Tournoij)
15年6月28日在0:43

这太有趣了。我可能会将其添加为wc解决方案。

–EvergreenTree
15年6月28日在0:44

#3 楼

对于单词,请使用:

:.,+4 s/\i\+/&/gn


.表示当前行。

我也在.vimrc文件中添加了以下内容:

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g


我可以输入:

:.,+6 zzcw


zzcw将扩展为s/\i\+/&/g

zzcw只是一个奇怪的名字,不会匹配任何东西(对我来说)。 br />我希望能够在文件中键入多行推文
,请确保没有太多
字符,然后将该推文粘贴到twitter中。