Odpowiedzi:
Odpowiedź Quincy jest w porządku, ale jest na to dokładny sposób, który nie wymaga edycji bufora:
:%s/pattern//ng
Spowoduje to wydrukowanie komunikatu typu 3 matches on 2 lines
i żadne zmiany nie zostaną wprowadzone w buforze.
n
Flaga powoduje, że :substitute
polecenie wydrukowania liczbę meczów zamiast wykonywania rzeczywistej zmiany; g
flaga umożliwia raportowanie wielu meczów na linie.
Inną rzeczą, która może być przydatna w twoim przypadku użycia, jest wydrukowanie wszystkich linii pasujących do wzoru:
:global/pattern/print
które można skrócić do:
:g/pattern
Jest to jedno z najprostszych zastosowań :global
polecenia (które jest zadziwiająco potężne). Po prostu wydrukuje wszystkie pasujące linie pattern
, a następnie (jeśli jest więcej niż jedna linia) naciśniesz Enter
lub wpisz inne polecenie, aby zniknęło.
Trochę ciekawostek: to polecenie jest początkiem nazwy grep
, jak to bywa powszechnie określane jako g/re/p
, gdzie re
oznacza „wyrażenie regularne”.
g/re/p
pochodzi w rzeczywistości ed
, a nie vi
. Grep wyprzedza vi o kilka lat.
nnoremap <leader>n :%s///gn<CR>
mapowanie. Naciskam więc, <leader>n
aby policzyć wystąpienia poprzednio wyszukiwanego wzoru. Używam tego zaskakująco często.
:%s/pattern//n
n
Flag w końcu mówi :s
komendę zgłosić liczbę meczów, a nie faktycznie zastąpić. Czytaj :h :s_flags
więcej informacji.
gn
?
g
jeśli uważasz, że może występować więcej niż jeden mecz na linię, co często jest prawdą. Dla celów pytania flaga n
jest jednak ważniejsza.
Najpierw użyj, /
aby wyszukać wyrażenie regularne, a następnie
:%s///gn
Jest to to samo, co odpowiedź Dhurvy, z tą różnicą, że a.) Jest łatwiejsza w użyciu (ponieważ możesz wyświetlić podgląd wyników tego, co pasuje do wyrażenia regularnego jako pierwsza) i b.) Dopasowuje się globalnie z g
flagą, aby zliczyć wszystkie wystąpienia.
Dzięki temu PR https://github.com/vim/vim/pull/4317 każde polecenie wyszukiwania pokazuje statystyki wyszukiwania (takie jak aktualna pozycja dopasowania i liczba dopasowań) w vimie 8.1.1270. Pamiętaj o usunięciu S
ze zmiennej shortmess
.
:%s/pattern//g
Zobaczysz liczbę zmian na pasku stanu. Tak wiele razy się pattern
pojawia. Następnie wystarczy nacisnąć, u
aby cofnąć zamiany.
Mapowanie, które dodałem do mojego .vimrc na podstawie odpowiedzi tutaj:
" 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>
Trochę wyjaśnienia, miejmy nadzieję, pomocne dla nowszych vimerów:
<c-r><c-w>
wstawia słowo pod kursorem w linii poleceń, przydatne przy wielu okazjach.
Jest <c-u>
to konieczne, aby usunąć automatycznie wstawiony '<,'>
po naciśnięciu :
w trybie wizualnym i przejściu do wiersza poleceń.
*
Rejestr zawiera (ostatnie) wybór wizualnego, <c-r>*
wstawia zawartość *
rejestru w wierszu poleceń (może być również stosowany w trybie wstawiania).
:h count-items