Answers:
Quincy的答案很好,但是有一种确切的方法可以做到这一点,而无需编辑缓冲区:
:%s/pattern//ng
这将显示一条消息,如3 matches on 2 lines
,并且不会对缓冲区进行任何更改。
该n
标志使:substitute
命令打印匹配的数目,而不执行实际的替换;该g
标志允许每行报告多个匹配项。
可能对您的用例有用的另一件事是打印与模式匹配的所有行:
:global/pattern/print
可以缩短为:
:g/pattern
这是:global
命令最简单的用法之一(功能强大到令人难以置信)。它只会简单地打印出所有与匹配的行,pattern
然后(如果有多行)您可以按Enter
或键入另一个命令以使其消失。
一点琐事:该命令是名称的由来,grep
通常将其描述为g/re/p
,其中re
代表“正则表达式”。
g/re/p
实际上来自ed
,而不是vi
。Grep比vi早了几年。
nnoremap <leader>n :%s///gn<CR>
映射。因此,我按一下<leader>n
以计算先前搜索的模式的出现。我经常使用它。
:%s/pattern//n
最后的n
标志告诉:s
命令报告匹配的数目,而不是实际替代。阅读:h :s_flags
更多详细信息。
gn
?
g
如果您觉得每行可能有多个匹配项,那么您也想使用它,这通常是正确的。但是,出于问题的目的,标记n
更为重要。
多亏了这个PR https://github.com/vim/vim/pull/4317,每个搜索命令都显示了vim 8.1.1270中的搜索统计信息(例如当前比赛位置和比赛次数)。确保S
从变量中删除shortmess
。
我根据这里的答案将映射添加到.vimrc中:
" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>
" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>
有点解释,希望对新的vimmers有帮助:
<c-r><c-w>
在命令行中的光标下插入单词,在很多情况下都很方便。
的<c-u>
需要以除去自动插入'<,'>
按压时:
在视觉模式和去命令行。该
*
寄存器包含(最后一个)可视选择,<c-r>*
插入的内容*
在命令行寄存器(也可以在插入模式中使用)。
:h count-items