Risposte:
La risposta di Quincy va bene, ma esiste un modo esatto per farlo che non richiede la modifica del buffer:
:%s/pattern//ng
Questo stamperà un messaggio simile 3 matches on 2 lines
e non verranno apportate modifiche al buffer.
Il n
flag fa sì che il :substitute
comando stampi il numero di corrispondenze anziché eseguire una sostituzione effettiva; il g
flag consente di segnalare più corrispondenze per riga.
Un'altra cosa che potrebbe essere utile per il tuo caso d'uso è stampare tutte le linee che corrispondono a un motivo:
:global/pattern/print
che può essere abbreviato in:
:g/pattern
Questo è uno degli usi più semplici del :global
comando (che è incredibilmente potente). Stamperà semplicemente tutte le righe corrispondenti pattern
, quindi (se c'è più di una riga) premi Enter
o digiti un altro comando per farlo sparire.
Un po 'di curiosità: questo comando è l'origine del nome grep
, come sarebbe comunemente descritto come g/re/p
, dove re
sta per "espressione regolare".
g/re/p
viene effettivamente da ed
, non vi
. Grep precede Vi di un paio d'anni.
nnoremap <leader>n :%s///gn<CR>
mappatura. Quindi premo <leader>n
per contare le occorrenze del modello precedentemente cercato. Lo uso sorprendentemente spesso.
:%s/pattern//n
Il n
flag alla fine indica :s
al comando di segnalare il numero di corrispondenze e di non sostituirlo effettivamente. Leggi :h :s_flags
per maggiori dettagli.
gn
?
g
anche se ritieni che ci possa essere più di una corrispondenza per riga, il che è spesso vero. Ai fini della domanda, tuttavia, la bandiera n
è più importante.
Prima usa /
per cercare una regex, quindi
:%s///gn
Questa è la stessa della risposta di Dhurva, tranne per il fatto che a.) È più facile da usare (poiché puoi visualizzare in anteprima i risultati di ciò che corrisponde per primo al regex) e b.) Corrisponde a livello globale con la g
bandiera per contare tutte le occorrenze.
Grazie a questo PR https://github.com/vim/vim/pull/4317 , ogni comando di ricerca mostra le statistiche di ricerca (come la posizione attuale della partita e il numero di partite) in vim 8.1.1270. Assicurati di rimuovere S
dalla variabile shortmess
.
:%s/pattern//g
Vedrai il numero di sostituzioni nella barra di stato. Questo è quante volte pattern
appare. Quindi basta premere u
per annullare le sostituzioni.
Una mappatura che ho aggiunto al mio .vimrc in base alle risposte qui:
" 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 po 'di spiegazione, si spera utile per i nuovi vimmers:
<c-r><c-w>
inserisce la parola sotto il cursore nella riga di comando, utile in molte occasioni.
La <c-u>
è necessario per rimuovere il inserito automaticamente '<,'>
quando viene premuto :
in modalità visiva e andare alla linea di comando. Il
*
registro contiene la (ultima) selezione visiva, <c-r>*
inserisce il contenuto del *
registro nella riga di comando (può essere utilizzato anche in modalità inserimento).
:h count-items