Contando le occorrenze in Vim senza contrassegnare il buffer modificato


111

Per sapere quante volte esiste un pattern nel buffer corrente, faccio:

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

Fornisce il numero di occorrenze del pattern, ma è ovviamente ingombrante e ha anche l'effetto collaterale di impostare lo stato "modificato".

Esiste un modo più elegante per contare?

Risposte:


166

Per evitare la sostituzione, lasciare vuoto il secondo pattern e aggiungere il flag "n":

:%s/pattern-here//gn

Questo è descritto come un suggerimento ufficiale .


8
ancora più ingombrante, ma almeno ora è ufficiale che non esiste un modo elegante ...
Paul Oyster

53
Se hai già eseguito una ricerca utilizzando /, diventa semplicemente:% s /// gn
Peter Gibson,

Quindi aggiungilo al tuo .vimrc
JESii

3
Ho trovato abbastanza utile la seguente mappatura: nnoremap <leader>n :%s///gn <CR>per contare le occorrenze dell'ultima ricerca
Ikar Pohorský

1
Non c'è modo di far entrare questo conteggio in una variabile, giusto? Questo è quello che mi serve ...
Steven Lu

8
:help count-items

In VIM 6.3, ecco come lo fai.

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

In VIM 7.2, ecco come lo faresti:

:%s/your_word/&/gn   # returns the count, n flag avoids substitution

Avevo un file di grandi dimensioni e seguire questo approccio è stato molto più veloce di grep.
Jai Prakash

5
:!cat %| grep -c "pattern"

Non è esattamente il comando vim, ma ti darà ciò di cui hai bisogno da vim.
Puoi associarlo al comando se devi usarlo frequentemente.


7
Più semplicemente:!grep -c "pattern" %
Iazel


1

Posiziona il cursore sulla parola che desideri contare ed esegui quanto segue.

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

Vedere :h c_ctrl-r_ctrl-w


-1

vimgrep è tuo amico qui:

vimgrep pattern %

Spettacoli:

(1 of 37)

7
Questo non conta le occorrenze, ma conta le righe che contengono il modello. Quindi, se il pattern si verifica due volte in una riga, verrà conteggiato solo una volta.
sotto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.