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 linesi żadne zmiany nie zostaną wprowadzone w buforze.
nFlaga powoduje, że :substitutepolecenie wydrukowania liczbę meczów zamiast wykonywania rzeczywistej zmiany; gflaga 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ń :globalpolecenia (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 Enterlub 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 reoznacza „wyrażenie regularne”.
+1 To dość miła odpowiedź, na miejscu i jednocześnie dość szczegółowa. Miejmy nadzieję, że większość pytań uzyska takie odpowiedzi! :)
yo '
Świetna odpowiedź i niesamowite ciekawostki!
BiBi
Muszę to robić może 2-3 razy w roku i nigdy nie pamiętam składni, więc za każdym razem jest to wyszukiwarka. Chciałem tylko podziękować za tę jasną odpowiedź, ponieważ była tam dla mnie więcej niż raz i od kilku lat uratowała mi tę okropną stronę wiki! (wikia, nie treść strony)
Czy
1
Drobny bit: polecenie g/re/ppochodzi w rzeczywistości ed, a nie vi. Grep wyprzedza vi o kilka lat.
Czy
Mam nnoremap <leader>n :%s///gn<CR>mapowanie. Naciskam więc, <leader>naby policzyć wystąpienia poprzednio wyszukiwanego wzoru. Używam tego zaskakująco często.
Rolf
15
:%s/pattern//nnFlag w końcu mówi :skomendę zgłosić liczbę meczów, a nie faktycznie zastąpić. Czytaj :h :s_flagswięcej informacji.
@yo 'Tak, chociaż g to tylko kolejna flaga, warto też użyć tej opcji, gjeś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 njest jednak ważniejsza.
Dhruva Sagar
5
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 gflagą, 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 Sze zmiennej shortmess.
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
Odpowiedzi:
Odpowiedź Quincy jest w porządku, ale jest na to dokładny sposób, który nie wymaga edycji bufora:
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:
które można skrócić do:
Jest to jedno z najprostszych zastosowań
:global
polecenia (które jest zadziwiająco potężne). Po prostu wydrukuje wszystkie pasujące liniepattern
, a następnie (jeśli jest więcej niż jedna linia) naciśnieszEnter
lub wpisz inne polecenie, aby zniknęło.Trochę ciekawostek: to polecenie jest początkiem nazwy
grep
, jak to bywa powszechnie określane jakog/re/p
, gdziere
oznacza „wyrażenie regularne”.źródło
g/re/p
pochodzi w rzeczywistościed
, a nievi
. 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.źródło
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 flagan
jest jednak ważniejsza.Najpierw użyj,
/
aby wyszukać wyrażenie regularne, a następnieJest 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.źródło
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 zmiennejshortmess
.źródło
:%s/pattern//g
Zobaczysz liczbę zmian na pasku stanu. Tak wiele razy się
pattern
pojawia. Następnie wystarczy nacisnąć,u
aby cofnąć zamiany.źródło
Mapowanie, które dodałem do mojego .vimrc na podstawie odpowiedzi tutaj:
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).źródło