Contando ocorrências no Vim sem marcar o buffer alterado

111

Para saber quantas vezes um padrão existe no buffer atual, eu faço:

:%s/pattern-here/pattern-here/g

Ele fornece o número de ocorrências do padrão, mas é obviamente complicado e também tem o efeito colateral de definir o status 'alterado'.

Existe uma maneira mais elegante de contar?

Paul Oyster
fonte

Respostas:

166

Para evitar a substituição, deixe o segundo padrão vazio e adicione o sinalizador “n”:

:%s/pattern-here//gn

Isso é descrito como uma dica oficial .

Bruno De Fraine
fonte
8
ainda mais complicado, mas pelo menos agora é oficial que não há maneira elegante ...
Paul Oyster
53
Se você já realizou uma pesquisa usando /, ela se torna apenas:% s /// gn
Peter Gibson
Então, basta adicioná-lo ao seu .vimrc
JESii
3
Achei o seguinte mapeamento bastante útil: nnoremap <leader>n :%s///gn <CR>para contar ocorrências da última pesquisa
Ikar Pohorský
1
Não há como fazer essa contagem entrar em uma variável, certo? Isso é o que eu preciso ...
Steven Lu
8
:help count-items

No VIM 6.3, é assim que você faz isso.

:set report=0
:%s/your_word/&/g    # returns the count without substitution

No VIM 7.2, você faria isso da seguinte maneira:

:%s/your_word/&/gn   # returns the count, n flag avoids substitution
konyak
fonte
Eu tinha um arquivo grande e seguir essa abordagem foi muito mais rápido do que o grep.
Jai Prakash
5
:!cat %| grep -c "pattern"

Não é exatamente o comando vim, mas lhe dará o que você precisa do vim.
Você pode mapeá-lo para o comando se precisar usá-lo com frequência.

Ilya
fonte
7
Mais simplesmente:!grep -c "pattern" %
Iazel
2

O vimscript IndexedSearch aprimora os comandos de pesquisa do Vim para exibir "Na correspondência #N de M correspondências".

redigido
fonte
1

Coloque o cursor na palavra que deseja contar e execute o seguinte.

:%s/<c-r><c-w>//gn

Vejo :h c_ctrl-r_ctrl-w

Sagar Jain
fonte
-1

vimgrep é seu amigo aqui:

vimgrep pattern %

Programas:

(1 of 37)
rdeits
fonte
7
Isso não conta ocorrências, mas conta linhas que contêm o padrão. Portanto, se o padrão ocorrer duas vezes em uma linha, ele será contado apenas uma vez.
sotto de