Show Count of Matches in Vim

SearchVim

Search Problem Overview


There is a nice feature in Google Chrome when you do a search. It tells you the number of matches there is for the keyword you are searching for. However, in Vim I don't see such a feature. Some people suggested using %s/pattern//gn or similar:

http://vim.wikia.com/wiki/Count_number_of_matches_of_a_pattern
https://stackoverflow.com/questions/647049/unable-to-count-the-number-of-matches-in-vim

But that is quite long really!! I am looking for the count when a press the '*', '%', or do any search using '/' and '?'.

Any idea?

Search Solutions


Solution 1 - Search

Modern Vim

Starting with Vim 8.1.1270, there's a new feature in core to show the current match position. NeoVim enables this functionality by default, but standard Vim does not.

To enable it in standard Vim, run:

:set shortmess-=S

Originally mentioned below in Ben's answer, and added here for visibility.

Older Versions

In Vim 7.4+, the IndexedSearch plugin can be used.

Check henrik/vim-indexed-search on GitHub to ensure you get the latest version.

Solution 2 - Search

I don't know of a direct way of doing it, but you could make use of the way :%s/// uses the last search as the default pattern:

:nmap ,c :%s///gn

You should then be able to do a search and then hit ,c to report the number of matches.

The only issue will be that * and # ignore 'smartcase', so the results might be off by a few after using *. You can get round this by doing * followed by /UpENTER and then ,c.

Solution 3 - Search

One addition to @Al's answer: if you want to make vim show it automatically in the statusline, try adding the following to the 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'

Solution 4 - Search

Here's a cheap solution ... I used Find and Replace All in Vim. No fancy scripting. I did a Find X and Replace All with X. At the end, Vim reports "2134 substitutions on 9892 lines". X appeared 2134 times. Use :q! to quit the file without saving it. No harm done.

Solution 5 - Search

I'm not sure exactly what version added it, but this is built into Vim now, you just need to:

:set shortmess-=S

Added sometime in the 8.1.x patches (as of this writing we're at 8.1.2300).

Solution 6 - Search

You already have a good wealth of answers, but it seems to me that there is still one more approach to this problem.

This is actually something I had to deal with a few days ago. I added a function and a mapping in such a way that you hit the mapping when the cursor is under the word you want to count and it returns the number of matches.

The Function:

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

And the mapping:

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

Solution 7 - Search

Alternatively from what @Al suggests you can map the key combination to write most of the line and then move the cursor to the position where the actual pattern is inserted:

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

Where '^[' is Ctrl+V,Esc and '^[OD' is Ctrl+V,Left

Then pressing ',c' will go into command mode, enter the pattern and leave the cursor over the second '/', ready to insert the pattern.

Solution 8 - Search

This plugin does just that. https://github.com/osyo-manga/vim-anzu

When searching for a word in vim, it will display word count on the statusline. It also has the option to display next to the searched word ie. this_is_my_sample_word (3/12), or this_is_my_sample_word(7/12). This basically says: this is the 3rd or 7th occurrence out of 12 total occurrences.

Solution 9 - Search

another nice vim plugin for that: https://github.com/google/vim-searchindex

will be shown like this:

when looking for 'cd' in the file

Solution 10 - Search

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

Vimgrep uses Vim's built-in regex search engine, so you can reuse the patterns from Vim's standard search command. So, I first test the search pattern the normal way using: /{pattern}/

Then enter the following:

:vim /CTRL+r//g %

where CTRL+r/ will insert the last search pattern after the first slash. The status line will display (1 of max), where max is the maximum number of matches for the {pattern}. Then use the :cnext and :cprev to search for the next & previous matches and :cfirst and :clast for the first and last matches. These 4 commands can be remapped to make them faster to execute.

Solution 11 - Search

A alternative is to count using the grep command.

Ex. If you want to search TODO in current file is:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRafidView Question on Stackoverflow
Solution 1 - SearchSergioAraujoView Answer on Stackoverflow
Solution 2 - SearchDrAlView Answer on Stackoverflow
Solution 3 - SearchZyXView Answer on Stackoverflow
Solution 4 - Searchmh2parkerView Answer on Stackoverflow
Solution 5 - SearchBenView Answer on Stackoverflow
Solution 6 - SearchalfredodezaView Answer on Stackoverflow
Solution 7 - SearchDavid Rodríguez - dribeasView Answer on Stackoverflow
Solution 8 - SearchcsebryamView Answer on Stackoverflow
Solution 9 - SearchAlon GouldmanView Answer on Stackoverflow
Solution 10 - SearchPeter FarfelView Answer on Stackoverflow
Solution 11 - SearchtonView Answer on Stackoverflow