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.