VIM 统计匹配的个数

1. 统计匹配的个数

1 统计当前模式的配个

这条技巧介绍了两种用于统计模式匹配个数的方法。

假设想知道在以下文本中出现过多少次单词“buttons”。

search/buttons.js

var buttons = viewport.buttons;
viewport.buttons.previous.show();
viewport.buttons.next.show();
viewport.buttons.index.hide();

首先,查找这个单词。

➾ \<buttons>\

现在,可以按下n和N键,从一个匹配移动到另外一个匹配。但是Vim的查找命令不会提示在当前文档中有多少匹配。可以使用 :substitue或者 :vimgrep命令来获知匹配的总数。

1.1 用‘:substitute’命令统计匹配总数

通过运行以下命令,可以得到某个匹配的总数。

➾ /\<buttons\>
➾ :%s///gn 
《 5 matches on 4 lines

实际上,我们调用的是:substitute 命令,但标志位n 会抑制正常的替换动作。该命令不会对每处匹配进行替换,而是简单地统计匹配的次数,并将结果显示到命令行上。此处将查找域留空,旨在让Vim 使用当前的查找模式。替换域(由于标志位n 的缘故)不管怎样都将会被忽略,因此也可以将其留空。

请注意该命令包含了三个 / 字符。第一个和第二个界定了模式域,第二个和第三个界定了替换域。请注意不要忽略其中任意 / 字符,否则执行 :%s//gn的结果将是把所有匹配都替换成gn!

1.2 用‘:vimgrep’命令统计匹配总数

:substitute命令的n选项可以让我们知道某个匹配的总数。但有时,如果能知道当前匹配文本所处的位置会很有用,例如共5个匹配,当前是第3个。:vimgrep命令可以告诉我们这方面的信息。

➾ /\<buttons\>
➾ :vimgrep //g %
《(1 of 5) var buttons = viewport.buttons; 

该命令会把当前文件中所有找到的匹配放进quickfix列表。虽然 :vimgrep可以跨文件查找,但在本例中只用它在单个文件中查找。% 标志会被扩展为当前文件的完整路径(参见 :h cmdline-special)。将模式域留空的目的是让:vimgrep使用当前查找的模式。

就像 nN键可以在匹配之间跳转一样,用 :cnext和 :cprev命令可以正向和反向遍历quickfix列表。

➾ :cnext
《(2 of 5) var buttons = viewport.buttons;
➾ :cnext
《(3 of 5) viewport.buttons.previous.show();
➾ :cprev
《(2 of 5) var.buttons = viewport.buttons; 

当我想查看每一处匹配,并可能作出修改时,我更喜欢用这种方法,而不是用替换命令。看到(1 of 5)、(2 of 5)这类提示能让我对剩余工作量有所了解,这一点很有用。

quickfix列表是一个非常重要的功能,它在很多 Vim 工作流程中占据了核心位置。在第17章中可以了解更多关于它的内容。