显示Vim中的匹配计数

问题描述 投票:49回答:9

进行搜索时,Google Chrome浏览器中有一项不错的功能。它会告诉您搜索关键词的匹配数。但是,在Vim中我看不到这样的功能。有人建议使用%s/pattern//gn或类似名称:

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

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

任何想法?

search vim
9个回答
27
投票

插件index search

最新版本here


21
投票

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

:nmap ,c :%s///gn

然后您应该可以进行搜索,然后按,c报告匹配数目。

唯一的问题是*#忽略了'smartcase',因此在使用*之后,结果可能会偏离一些。您可以通过以下方法来解决此问题:先执行*,然后依次执行/ Up ENTER,c


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'

7
投票

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


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>

2
投票

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

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

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

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


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个事件。


1
投票

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

:set shortmess-=S

在8.1.x补丁中的某个时间添加(截至撰写本文时,我们位于8.1.2300)。


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

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

以正常方式测试搜索模式

然后输入以下内容:

:vim /CTRL+r//g %

其中CTRL+r/将在第一个斜杠后插入最后一个搜索模式。状态行将显示(最大值为1),其中最大值为{pattern}的最大匹配数。然后使用:cnext:cprev搜索下一个和上一个匹配项,并使用:cfirst:clast搜索第一个和最后一个匹配项。可以重新映射这4个命令,以使其更快地执行。

© www.soinside.com 2019 - 2024. All rights reserved.