在Vim中计数事件而不标记缓冲区已更改


111

为了知道模式在当前缓冲区中存在多少次,我这样做:

:%s/pattern-here/pattern-here/g

它给出了模式的出现次数,但显然很麻烦,并且具有设置“已更改”状态的副作用。

有没有更优雅的计数方法?

Answers:


166

为了避免替换,请将第二个模式留空,并添加“ n”标志:

:%s/pattern-here//gn

这被描述为官方提示


8
更加麻烦,但至少现在正式有一种优雅的方法……
保罗·厄斯特

53
如果您已经使用/进行过搜索,则搜索结果将变成:%s /// gn
Peter Gibson,2009年

因此,只需将其添加到您的.vimrc
JESii 2014年

3
我发现以下映射非常有用:nnoremap <leader>n :%s///gn <CR>计算最近一次搜索的发生
IkarPohorský15年

1
没有办法使这个计数成为变量吗?这就是我需要的...
Steven Lu

8
:help count-items

在VIM 6.3中,操作方法如下。

:set report=0
:%s/your_word/&/g    # returns the count without substitution

在VIM 7.2中,操作方法如下:

:%s/your_word/&/gn   # returns the count, n flag avoids substitution

我的文件很大,采用这种方法比grep快得多。
杰·普拉卡什

5
:!cat %| grep -c "pattern"

这不是完全的vim命令,但是它将为您提供vim所需的功能。
如果需要经常使用它,可以将其映射到命令。


7
更简单:!grep -c "pattern" %
Iazel 2014年



-1

vimgrep是您的朋友在这里:

vimgrep pattern %

显示:

(1 of 37)

7
这不计算出现次数,而是计算包含模式的行。因此,如果一行中出现两次模式错误,则只会计数一次。
2012年
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.