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 n
bendera membuat :substitute
perintah mencetak jumlah pertandingan bukan melakukan substitusi yang sebenarnya; yang g
bendera 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 :global
perintah 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 Enter
atau 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 re
singkatan dari "regular expression".
g/re/p
sebenarnya dari ed
, bukan vi
. Grep mendahului vi dalam beberapa tahun.
nnoremap <leader>n :%s///gn<CR>
pemetaan. Jadi saya tekan <leader>n
untuk menghitung kemunculan pola yang sebelumnya dicari. Saya sering menggunakan ini secara mengejutkan.
:%s/pattern//n
The n
bendera pada akhirnya memberitahu :s
perintah untuk melaporkan jumlah pertandingan dan tidak benar-benar pengganti. Baca :h :s_flags
untuk lebih jelasnya.
gn
?
g
jika Anda merasa mungkin ada lebih dari satu kecocokan per baris, yang seringkali benar. Namun untuk keperluan pertanyaan, bendera n
itu 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 g
bendera 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 S
dari variabel shortmess
.
:%s/pattern//g
Anda akan melihat jumlah pergantian di bilah status. Itulah berapa kali pattern
muncul. Kemudian cukup tekan u
untuk 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