Respostas:
A resposta de Quincy é boa, mas há uma maneira exata de fazer isso que não requer a edição do buffer:
:%s/pattern//ng
Isso imprimirá uma mensagem como 3 matches on 2 lines
, e nenhuma alteração será feita no seu buffer.
A n
sinalização faz com que o :substitute
comando imprima o número de correspondências em vez de executar uma substituição real; o g
sinalizador permite relatar várias correspondências por linha.
Outra coisa que pode ser útil para o seu caso de uso é imprimir todas as linhas que correspondem a um padrão:
:global/pattern/print
que pode ser reduzido para:
:g/pattern
Esse é um dos usos mais simples do :global
comando (que é incrivelmente poderoso). Simplesmente imprime todas as linhas correspondentes pattern
e, em seguida (se houver mais de uma linha), você pressiona Enter
ou digita outro comando para fazê-lo desaparecer.
Um pouco de trivialidades: Este comando é a origem do nome grep
, como seria comumente descrito como g/re/p
, onde re
significa "expressão regular".
g/re/p
é realmente de ed
, não vi
. O Grep é anterior ao vi em alguns anos.
nnoremap <leader>n :%s///gn<CR>
mapeamento. Então, pressiono <leader>n
para contar as ocorrências do padrão pesquisado anteriormente. Eu uso isso surpreendentemente frequentemente.
:%s/pattern//n
A n
bandeira no final diz :s
ao comando para relatar o número de correspondências e não substituir efetivamente. Leia :h :s_flags
para mais detalhes.
gn
?
g
se achar que pode haver mais de uma correspondência por linha, o que geralmente é verdade. Para os fins da pergunta, no entanto, a bandeira n
é mais importante.
Primeiro use /
para procurar uma regex e, em seguida,
:%s///gn
É o mesmo que a resposta de Dhurva, exceto que a.) É mais fácil de usar (já que você pode visualizar os resultados do que o seu regex corresponde primeiro) eb). Corresponde globalmente ao g
sinalizador para contar todas as ocorrências.
Graças a este PR https://github.com/vim/vim/pull/4317 , cada comando de pesquisa mostra estatísticas de pesquisa (como posição de correspondência atual e número de correspondências) no vim 8.1.1270. Certifique-se de remover S
da variável shortmess
.
:%s/pattern//g
Você verá o número de substituições na barra de status. Isso é quantas vezes o pattern
aparece. Em seguida, pressione u
para desfazer as substituições.
Um mapeamento que eu adicionei ao meu .vimrc com base nas respostas aqui:
" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>
" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>
Um pouco de explicação, espero que útil para os vimmers mais recentes:
<c-r><c-w>
insere a palavra sob o cursor na linha de comando, útil em várias ocasiões.
A <c-u>
é necessária para remover o inseridas automaticamente '<,'>
quando se pressiona :
no modo visual e indo para a linha de comando. O
*
registro contém a (última) seleção visual, <c-r>*
insere o conteúdo do *
registro na linha de comando (também pode ser usado no modo de inserção).
:h count-items