Jawaban:
Jawaban Quincy baik-baik saja, tetapi ada cara tepat untuk melakukan ini yang tidak memerlukan pengeditan buffer:
:%s/pattern//ng
Ini akan mencetak pesan seperti 3 matches on 2 lines, dan tidak ada perubahan yang dilakukan pada buffer Anda.
The nbendera membuat :substituteperintah mencetak jumlah pertandingan bukan melakukan substitusi yang sebenarnya; yang gbendera memungkinkan pelaporan beberapa pertandingan per baris.
Hal lain yang mungkin berguna untuk use case Anda adalah mencetak semua baris yang cocok dengan pola:
:global/pattern/print
yang dapat disingkat menjadi:
:g/pattern
Ini adalah salah satu penggunaan :globalperintah yang paling sederhana (yang sangat kuat). Ini hanya akan mencetak semua baris yang cocok pattern, dan kemudian (jika ada lebih dari satu baris) Anda menekan Enteratau mengetik perintah lain untuk membuatnya pergi.
Sedikit hal-hal sepele: Perintah ini adalah asal dari nama grep, seperti yang biasa digambarkan sebagai g/re/p, di mana resingkatan dari "regular expression".
g/re/psebenarnya dari ed, bukan vi. Grep mendahului vi dalam beberapa tahun.
nnoremap <leader>n :%s///gn<CR>pemetaan. Jadi saya tekan <leader>nuntuk menghitung kemunculan pola yang sebelumnya dicari. Saya sering menggunakan ini secara mengejutkan.
:%s/pattern//nThe nbendera pada akhirnya memberitahu :sperintah untuk melaporkan jumlah pertandingan dan tidak benar-benar pengganti. Baca :h :s_flagsuntuk lebih jelasnya.
gn?
gjika Anda merasa mungkin ada lebih dari satu kecocokan per baris, yang seringkali benar. Namun untuk keperluan pertanyaan, bendera nitu lebih penting.
Pertama gunakan /untuk mencari regex, lalu
:%s///gn
Ini sama dengan jawaban Dhurva, kecuali itu a.) Lebih mudah digunakan (karena Anda dapat melihat dulu hasil dari apa yang cocok dengan regex Anda terlebih dahulu) dan b.) Cocok secara global dengan gbendera untuk menghitung semua kemunculan.
Berkat PR ini https://github.com/vim/vim/pull/4317 , setiap perintah pencarian menunjukkan statistik pencarian (seperti posisi pertandingan saat ini, dan jumlah pertandingan) di vim 8.1.1270. Pastikan untuk menghapus Sdari variabel shortmess.
:%s/pattern//g
Anda akan melihat jumlah pergantian di bilah status. Itulah berapa kali patternmuncul. Kemudian cukup tekan uuntuk membatalkan substitusi.
Pemetaan yang saya tambahkan ke .vimrc saya berdasarkan jawaban di sini:
" 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>
Sedikit penjelasan, semoga bermanfaat bagi yang lebih baru:
<c-r><c-w> menyisipkan kata di bawah kursor di baris perintah, berguna dalam banyak kesempatan.
The <c-u>diperlukan untuk menghapus secara otomatis dimasukkan '<,'>
ketika menekan :dalam mode visual dan pergi ke baris perintah. The
*mendaftar berisi (terakhir) seleksi visual, <c-r>*
menyisipkan isi dari *register command line (juga dapat digunakan dalam modus insert).
:h count-items