在Vim中显示匹配数

时间:2011-01-12 12:10:23

标签: search vim

进行搜索时,Google Chrome中有一项很棒的功能。它会告诉您正在搜索的关键字的匹配数。但是,在Vim我没有看到这样的功能。有些人建议使用%s/pattern//gn或类似的:

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
Unable to count the number of matches in Vim

但这真的很长!!当我按'*','%'或使用'/'和'?'进行搜索时,我正在寻找计数。

有什么想法吗?

11 个答案:

答案 0 :(得分:27)

插件index search

最新版本here

答案 1 :(得分:20)

我不知道这样做的直接方法,但您可以使用:%s///使用上次搜索作为默认模式的方式:

:nmap ,c :%s///gn

然后,您应该可以进行搜索,然后点击,c报告匹配数量。

唯一的问题是*#忽略'smartcase',因此在使用*后结果可能会被一些人关闭。你可以通过*后跟/ Up ENTER 然后,c来解决这个问题。

答案 2 :(得分:13)

@ Al的答案的一个补充:如果你想让vim在状态栏中自动显示它,请尝试将以下内容添加到vimrc:

let s:prevcountcache=[[], 0]
function! ShowCount()
    let key=[@/, b:changedtick]
    if s:prevcountcache[0]==#key
        return s:prevcountcache[1]
    endif
    let s:prevcountcache[0]=key
    let s:prevcountcache[1]=0
    let pos=getpos('.')
    try
        redir => subscount
        silent %s///gne
        redir END
        let result=matchstr(subscount, '\d\+')
        let s:prevcountcache[1]=result
        return result
    finally
        call setpos('.', pos)
    endtry
endfunction
set ruler
let &statusline='%{ShowCount()} %<%f %h%m%r%=%-14.(%l,%c%V%) %P'

答案 3 :(得分:6)

这是一个廉价的解决方案......我在Vim中使用了Find and Replace All。没有花哨的脚本。我做了一个Find X并用X替换了所有。最后,Vim报告了“9892行上的2134个替换”。 X出现了2134次。使用:q!退出文件而不保存它。没有伤害。

答案 4 :(得分:3)

你已经有了很多答案,但在我看来,还有一个答案 更多解决这个问题的方法。

这实际上是我几天前要处理的事情。我添加了一个函数和一个映射 以这种方式,当光标位于您想要计数的单词下时,您可以点击映射 并返回匹配数。

功能:

" Count number of occurances of a word
function Count(word)
    let count_word = "%s/" . a:word . "//gn"
    execute count_word
endfunction

映射:

" Count current word 
nmap <Leader>w <Esc>:call Count(expand("<cword>"))<CR>

答案 5 :(得分:2)

或者从@Al建议您可以映射键组合以写入大部分行,然后将光标移动到插入实际模式的位置:

  

:nmap,c ^ [:%s /// gn ^ [OD ^ [OD ^ [OD ^ [OD

其中'^ ['是 Ctrl + V, Esc 和'^ [OD'是 Ctrl + V, Left

然后按',c'将进入命令模式,输入模式并将光标放在第二个'/'上,准备插入模式。

答案 6 :(得分:1)

这个插件就是这样做的。 https://github.com/osyo-manga/vim-anzu

在vim中搜索单词时,它会在状态行上显示单词计数。它还可以选择显示搜索到的单词旁边,即。 this_is_my_sample_word(3/12) this_is_my_sample_word(7/12)。这基本上说:这是总共发生12次中的第3次或第7次。

答案 7 :(得分:1)

我不确定确切添加了什么版本,但是现在它已内置到Vim中,您只需要:

:set shortmess-=S

在8.1.x补丁中添加了某个时间(在撰写本文时,我们的版本是8.1.2300)。

答案 8 :(得分:1)

另一个不错的vim插件: https://github.com/google/vim-searchindex

将显示为:

when looking for 'cd' in the file

答案 9 :(得分:0)

:vim[grep][!] /{pattern}/[g][j] {file} ...

Vimgrep使用Vim的内置正则表达式搜索引擎,因此您可以重用Vim标准搜索命令中的模式。所以,我首先使用正常方式测试搜索模式:/ {pattern} /

然后输入以下内容:

:vim /CTRL+r//g %

其中CTRL+r/将在第一个斜杠后插入最后一个搜索模式。状态行将显示(最多1个),其中max是{pattern}的最大匹配数。然后使用:cnext:cprev搜索下一个&amp;以前的比赛以及第一场和最后一场比赛的:cfirst:clast。可以重新映射这4个命令以使它们更快地执行。

答案 10 :(得分:0)

另一种方法是使用grep命令进行计数。

例如如果要在当前文件中搜索TODO,则为:

:echo system('grep -c TODO ' . expand('%:p'))