Tip 860 Printable Monobook Previous Next

created 2005 · complexity basic · author Marc Weber · version 7.0


To count the number of matches of a pattern, use the substitute command with the n flag. The following shows the number of times that pattern matches text in the current buffer:

:%s/pattern//gn

Omit g to display the number of lines where the pattern matches:

:%s/pattern//n

To restrict the count to a region of the text, specify a range instead of % (% means all lines). For example, the following counts the number of occurrences in lines 10 to 50 inclusive:

:10,50s/pattern//gn

The following counts the number of occurrences in the lines in the most recent visual selection.

:'<,'>s/pattern//gn

Note: As of Vim 7.3, substitutions applied to a range defined by marks or a visual selection (which uses a special type of marks '< and '>) are not bounded by the column position of the marks by default. Instead, Vim applies the substitution to the entire line on which each mark appears unless the \%V atom is used in the pattern like:'<,'>s/\%Vfoo/bar/g. Accordingly, for Vim7.3+, count in visual selection:

:'<,'>s/\%Vpattern//gn

Word under cursor[edit | edit source]

To count the number of occurrences of the last used search pattern, you can leave out the pattern entirely:

:%s///gn

This makes it easy to count the number of occurrences of the word under the cursor: first press * to search for the current word, then enter :%s///gn to count all occurrences of that word.

To access this quickly, define a shortcut command like

map ,* *<C-O>:%s///gn<CR>

then typing ,* in quick succession will run the following: * finds the next match to the word under the cursor, <C-O> (CTRL+O) returns the cursor to where it started, then :%s///gn does the counting we want. Of course this also works with any choice of command instead of ,*, and you can even overwrite the meaning of * with nnoremap * *<C-O>:%s///gn<CR> (see :help map)

Custom command[edit | edit source]

To quickly count the occurrences of a pattern, add the following to your vimrc:

command -nargs=1 Count :%s/<args>//gn

You can then run :Count foo to get a response identical to :%s/foo//gn. Unless you have another custom command starting with C, shortened versions of Count e.g. :C foo will also work.

Comments[edit | edit source]

...you just became my personal hero...))

This thing is causing "Trailing characters" error in gvi editor....what might be the problem?

Which thing? One problem could be that "gvi" is not necessarily the same as "gvim" and may not actually be Vim, but something else, or a very stripped-down version. But I'm only speculating here without version information about "gvi" and without knowing which specific command gives that error. --Fritzophrenic (talk) 17:05, October 25, 2016 (UTC)

Just to add one thing here, after running suggested command, cursor actually moves to first non space character in the line where search started, not at the beginning of searched pattern. For that add 'n' at the end to move cursor to beginning of the word, like nnoremap * *<C-O>:%s///gn<CR>n..-@Rakesh

Add `` at the end to move cursor back to the beginning of word, which keeps the count status line.

Like: map ,* *<C-O>:%s///gn<CR>``

-@YingchunLi

Another problem with this approach is that it adds an entry to the undo history

Community content is available under CC-BY-SA unless otherwise noted.