Liczenie wystąpień w Vimie bez oznaczania zmienionego bufora

111

Aby wiedzieć, ile razy wzorzec istnieje w bieżącym buforze, robię:

:%s/pattern-here/pattern-here/g

Podaje liczbę wystąpień wzoru, ale jest oczywiście uciążliwy, a także ma efekt uboczny w postaci ustawienia „zmienionego” statusu.

Czy istnieje bardziej elegancki sposób liczenia?

Paul Oyster
źródło

Odpowiedzi:

166

Aby uniknąć zamiany, pozostaw drugi wzorzec pusty i dodaj flagę „n”:

:%s/pattern-here//gn

Jest to opisane jako oficjalna wskazówka .

Bruno De Fraine
źródło
8
jeszcze bardziej uciążliwe, ale przynajmniej jest teraz oficjalne, że nie ma eleganckiego sposobu ...
Paul Oyster
53
Jeśli już przeprowadziłeś wyszukiwanie przy użyciu /, stanie się po prostu:% s /// gn
Peter Gibson
Więc po prostu dodaj go do swojego .vimrc
JESii
3
Bardzo przydatne znalazłem następujące mapowanie: nnoremap <leader>n :%s///gn <CR>policzyć wystąpienia ostatniego wyszukiwania
Ikar Pohorský
1
Nie ma sposobu, aby ta liczba przeszła do zmiennej, prawda? Tego właśnie potrzebuję ...
Steven Lu
8
:help count-items

Oto jak to zrobić w VIM 6.3.

:set report=0
:%s/your_word/&/g    # returns the count without substitution

W VIM 7.2, tak byś to zrobił:

:%s/your_word/&/gn   # returns the count, n flag avoids substitution
konyak
źródło
Miałem duży plik i takie podejście było znacznie szybsze niż grep.
Jai Prakash
5
:!cat %| grep -c "pattern"

Nie jest to dokładnie polecenie vim, ale da ci to, czego potrzebujesz od vima.
Możesz przypisać go do polecenia, jeśli chcesz go często używać.

Ilya
źródło
7
Mówiąc prościej:!grep -c "pattern" %
Iazel
2

Vimscript IndexedSearch rozszerza polecenia wyszukiwania Vima, aby wyświetlały "At match #N z M dopasowań".

zredagowano
źródło
1

Umieść kursor na słowie, które chcesz policzyć i wykonaj następujące czynności.

:%s/<c-r><c-w>//gn

Widzieć :h c_ctrl-r_ctrl-w

Sagar Jain
źródło
-1

vimgrep jest twoim przyjacielem tutaj:

vimgrep pattern %

Przedstawia:

(1 of 37)
rdeits
źródło
7
To nie liczy wystąpień, ale liczy wiersze zawierające wzór. Więc jeśli wzorzec wystąpi dwa razy w linii, zostanie policzony tylko raz.
sotto