如何在不离开vim的情况下计算文件部分中的单词?


10

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

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

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

Answers:


16

您可以使用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。这将过滤运动到外壳工具(在本例%中为整个缓冲区),但您也可以使用其他范围(例如:1,5!wc -w前5行,!,+5!wc -w当前和后5行,等等)。您还可以在可视模式下选择文本,然后键入:!wc -w以过滤您的选择。

请注意,这会将运动替换为外壳工具的输出,但是您可以u撤消该操作。

请参阅:help :range!:help range以及这个答案,在我将提供更多范围示例。


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

1
我不知道您可以使用g<C-g>这种方式。太棒了!
EvergreenTree

3

有两种方法可以实现,即纯vimscript方法和wc

纯Vim方式

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

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

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

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

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

wc方法

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

:5,15!wc -w

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

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

请注意,这会破坏a寄存器。

注意

看来这也可以在视觉模式下通过g<C-g>组合键完成。有关此说明,请参见Carpetsmoker的答案。


这些需要a和n一起使用才能使它们成为全局字符(否则,它们每行仅匹配一个单词)。第二个开头也需要一个s。
Colin McFaul

1
已修复,对此表示抱歉。
EvergreenTree

1
\w起初使用声音听起来是个不错的主意,但是经过测试之后,我发现了许多问题。最大的问题是,它将不匹配非ASCII字符,因此über简单地跳过了类似的单词(昨天对此有疑问)。另外,e-mail由于-不在中,类似like的单词也算作2个单词\w-例如,在英语中使用a 有点不常见,例如在荷兰语中很常见)。也许还有其他一些以这种方式被忽略的字符,这使我
想起

……以各种语言出现,而诸如此类的“适当”工具wc可能会在语言环境中出现(我不知道GNU是否wc真的通过这种方式进行处理,GNU工具因其出色的unicode支持而闻名。)
Martin Tournoij 2015年

这太有趣了。我可能会将其添加为wc解决方案的一个优点。
EvergreenTree

1

对于单词,请使用:

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

. 表示当前行。

另外,我在.vimrc文件中添加了以下内容:

:cabbrev zzcc   s/./&/gn

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

我可以打字:

:.,+6 zzcw

zzcw将扩大到s/\i\+/&/g

zzcw仅仅是一个奇怪的名字,将不符合(对我来说)什么。

副作用是整个文件被选中并突出显示。

我希望能够在文件中键入多行推文,确保没有太多字符,然后将推文粘贴到Twitter中。

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.