Contando ocurrencias en Vim sin marcar el búfer cambiado

111

Para saber cuántas veces existe un patrón en el búfer actual, hago:

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

Da el número de apariciones del patrón, pero obviamente es engorroso y también tiene el efecto secundario de establecer el estado "cambiado".

¿Existe una forma más elegante de contar?

Paul Oyster
fuente

Respuestas:

166

Para evitar la sustitución, deje el segundo patrón vacío y agregue la bandera "n":

:%s/pattern-here//gn

Esto se describe como un consejo oficial .

Bruno De Fraine
fuente
8
aún más engorroso, pero al menos ahora es oficial que no hay forma elegante ...
Paul Oyster
53
Si ya ha realizado una búsqueda con /, se convierte en solo:% s /// gn
Peter Gibson
Así que agréguelo a su .vimrc
JESii
3
Encontré bastante útil el siguiente mapeo: nnoremap <leader>n :%s///gn <CR>para contar las ocurrencias de la última búsqueda
Ikar Pohorský
1
No hay forma de hacer que este recuento entre en una variable, ¿verdad? Eso es lo que necesito ...
Steven Lu
8
:help count-items

En VIM 6.3, así es como se hace.

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

En VIM 7.2, así es como lo haría:

:%s/your_word/&/gn   # returns the count, n flag avoids substitution
Konyak
fuente
Tenía un archivo grande y seguir este enfoque fue mucho más rápido que grep.
Jai Prakash
5
:!cat %| grep -c "pattern"

No es exactamente el comando vim, pero le dará lo que necesita de vim.
Puede asignarlo al comando si necesita usarlo con frecuencia.

Ilya
fuente
7
Más simplemente:!grep -c "pattern" %
Iazel
2

Vimscript IndexedSearch mejora los comandos de búsqueda de Vim para mostrar "En coincidencia #N de M coincidencias".

redactado
fuente
1

Coloque el cursor sobre la palabra que desea contar y ejecute lo siguiente.

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

Ver :h c_ctrl-r_ctrl-w

Sagar Jain
fuente
-1

vimgrep es tu amigo aquí:

vimgrep pattern %

Muestra:

(1 of 37)
rdeits
fuente
7
Esto no cuenta las ocurrencias, pero cuenta las líneas que contienen el patrón. Entonces, si el patrón aparece dos veces en una línea, solo se contará una vez.
sotto