Câu trả lời:
Câu trả lời của Quincy là tốt, nhưng có một cách chính xác để làm điều này mà không cần chỉnh sửa bộ đệm:
:%s/pattern//ng
Điều này sẽ in một thông báo như thế 3 matches on 2 lines
, và sẽ không có thay đổi nào được thực hiện đối với bộ đệm của bạn.
Các n
lá cờ làm cho :substitute
lệnh in số lượng các trận đấu thay vì thực hiện một thay thực tế; các g
lá cờ cho phép báo cáo của nhiều trận đấu trên mỗi dòng.
Một điều khác có thể hữu ích cho trường hợp sử dụng của bạn là in tất cả các dòng khớp với một mẫu:
:global/pattern/print
có thể rút ngắn thành:
:g/pattern
Đây là một trong những cách sử dụng đơn giản nhất của :global
lệnh (có sức mạnh đáng kinh ngạc). Nó chỉ đơn giản là in ra tất cả các dòng khớp pattern
, và sau đó (nếu có nhiều hơn một dòng) bạn nhấn Enter
hoặc gõ một lệnh khác để làm cho nó biến mất.
Một chút chuyện nhỏ: Lệnh này là nguồn gốc của tên grep
, vì nó thường được mô tả là g/re/p
, trong đó re
viết tắt của "biểu thức chính quy".
g/re/p
thực sự là từ ed
, không vi
. Grep có trước vi vài năm.
nnoremap <leader>n :%s///gn<CR>
bản đồ. Vì vậy, tôi nhấn <leader>n
để đếm sự xuất hiện của mẫu tìm kiếm trước đó. Tôi sử dụng điều này đáng ngạc nhiên thường xuyên.
:%s/pattern//n
Các n
cờ cuối cùng nói với :s
lệnh để báo cáo số lượng các trận đấu và không thực sự thay thế. Đọc :h :s_flags
để biết thêm chi tiết.
gn
?
g
nếu bạn cảm thấy có thể có nhiều hơn một trận đấu trên mỗi dòng, điều này thường đúng. Đối với mục đích của câu hỏi tuy nhiên cờ n
là quan trọng hơn.
Đầu tiên sử dụng /
để tìm kiếm một regex, sau đó
:%s///gn
Điều này giống như câu trả lời của Dhurva, ngoại trừ câu trả lời a.) Dễ sử dụng hơn (vì bạn có thể xem trước kết quả của regex của mình trước tiên) và b.) Kết hợp trên toàn cầu với g
cờ để đếm tất cả các lần xuất hiện.
Nhờ PR này https://github.com/vim/vim/pull/4317 , mỗi lệnh tìm kiếm hiển thị số liệu thống kê tìm kiếm (như vị trí trận đấu hiện tại và số lượng trận đấu) trong vim 8.1.1270. Hãy chắc chắn để loại bỏ S
khỏi biến shortmess
.
:%s/pattern//g
Bạn sẽ thấy số lượng thay thế trong thanh trạng thái. Đó là bao nhiêu lần pattern
xuất hiện. Sau đó chỉ cần nhấn u
để hoàn tác thay thế.
Một ánh xạ tôi đã thêm vào .vimrc của mình dựa trên các câu trả lời ở đây:
" 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>
Một chút giải thích, hy vọng sẽ hữu ích cho các vimmer mới hơn:
<c-r><c-w>
chèn từ dưới con trỏ vào dòng lệnh, tiện dụng trong nhiều trường hợp.
Các <c-u>
là cần thiết để loại bỏ các tự động chèn vào '<,'>
khi nhấn :
trong chế độ hình ảnh và đi vào dòng lệnh. Thanh
*
ghi chứa lựa chọn trực quan (cuối cùng), <c-r>*
chèn nội dung của thanh *
ghi vào dòng lệnh (cũng có thể được sử dụng trong chế độ chèn).
:h count-items