Respuestas:
La respuesta de Quincy está bien, pero hay una manera exacta de hacer esto que no requiere editar el búfer:
:%s/pattern//ng
Esto imprimirá un mensaje como 3 matches on 2 lines
, y no se realizarán cambios en su búfer.
El n
indicador hace que el :substitute
comando imprima el número de coincidencias en lugar de realizar una sustitución real; la g
bandera permite informar múltiples coincidencias por línea.
Otra cosa que puede ser útil para su caso de uso es imprimir todas las líneas que coinciden con un patrón:
:global/pattern/print
que se puede acortar a:
:g/pattern
Este es uno de los usos más simples del :global
comando (que es increíblemente poderoso). Simplemente imprimirá todas las líneas que coinciden pattern
, y luego (si hay más de una línea), presione Enter
o escriba otro comando para que desaparezca.
Un poco de trivia: este comando es el origen del nombre grep
, como se describiría comúnmente como g/re/p
, donde re
significa "expresión regular".
g/re/p
es en realidad de ed
, no vi
. Grep es anterior a vi por un par de años.
nnoremap <leader>n :%s///gn<CR>
mapeo Así que presiono <leader>n
para contar las ocurrencias del patrón buscado anteriormente. Lo uso sorprendentemente a menudo.
:%s/pattern//n
La n
bandera al final le dice al :s
comando que informe el número de coincidencias y que no sustituya realmente. Leer :h :s_flags
para más detalles.
gn
?
g
si crees que puede haber más de una coincidencia por línea, lo que a menudo es cierto. A los fines de la pregunta, sin embargo, la bandera n
es más importante.
Primero use /
para buscar una expresión regular, luego
:%s///gn
Esto es lo mismo que la respuesta de Dhurva, excepto que a.) Es más fácil de usar (ya que puede obtener una vista previa de los resultados de lo que coincide con su expresión regular primero) y b.) Coincide globalmente con la g
bandera para contar todas las ocurrencias.
Gracias a este PR https://github.com/vim/vim/pull/4317 , cada comando de búsqueda muestra estadísticas de búsqueda (como la posición de coincidencia actual y el número de coincidencias) en vim 8.1.1270. Asegúrese de eliminar S
de la variable shortmess
.
:%s/pattern//g
Verá el número de sustituciones en la barra de estado. Esa es la cantidad de veces que pattern
aparece. Luego solo presione u
para deshacer las sustituciones.
Una asignación que agregué a mi .vimrc basada en las respuestas aquí:
" 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>
Un poco de explicación, con suerte útil para los nuevos vimmers:
<c-r><c-w>
inserta la palabra debajo del cursor en la línea de comando, útil en muchas ocasiones.
El <c-u>
es necesario para eliminar el insertado automáticamente '<,'>
al presionar :
en modo visual e ir a la línea de comando. El
*
registro contiene la (última) selección visual, <c-r>*
inserta el contenido del *
registro en la línea de comando (también se puede usar en modo de inserción).
:h count-items