Jak możesz wyświetlić listę dopasowań wyszukiwania Vima?

101

Chciałbym wymienić mecze, kiedy trafię:

/example

aby zobaczyć, gdzie są wszystkie mecze naraz.

Léo Léopold Hertz 준영
źródło

Odpowiedzi:

3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps
Yordan Georgiev
źródło
1
Bardzo podoba mi się twoje pomysły na F5-F8. Byłoby miło mieć tutaj kilka wizualizacji / wyników tych poleceń. Jak ma działać F8? Przeszukuje tylko bieżący katalog? - - Pominięcie reż to zwyczaj - - dlaczego node_modules? - - Jak wyrażenia regularne perla zmieniają domyślne działanie Vima? - - Oto jak zaprojektowałem moje wyszukiwanie plików .tex askubuntu.com/a/789769/25388 Byłoby miło nauczyć się od Ciebie, jak to ulepszyć. Nie jest to zbyt intuicyjne, więc często zapominałem o logice.
Léo Léopold Hertz 준영
node_modules jest katalogiem zawierającym dużo kodu js z modułów npm, gdybyś opracował front-endy ... to tylko przykład ...
Yordan Georgiev
1
zrób kopię zapasową swojego pliku .vimrc i dodaj te ustawienia, załaduj je: więc%, a potem spróbuj uruchomić "pomoc" w poleceniach ... vim jest trudny - musiałbyś powtarzać te tysiące razy, ale raz opanuj je, będziesz się śmiać @ każdy, kto wskazuje swoje nowe funkcje UI IDE ...
Yordan Georgiev
226
:g//p

W dłuższej formie:

:global/regular-expression/print

Możesz pominąć wzorzec / wyrażenie regularne, a Vim ponownie użyje poprzedniego wyszukiwanego hasła.

Ciekawostki: grep narzędzie zostało nazwane po tej sekwencji poleceń.

za dużo php
źródło
18
:g//- ponieważ p (rint) jest akcją domyślną, możesz ją również pominąć.
dekeguard
6
:g/jest jeszcze krótsza!
Sparhawk
2
Czy można tu zobaczyć kontekst, jak w grep --context 9?
Witalij Zdanevich
@VitalyZdanevich Try :%s/regular-expression//gn It wyprodukuje coś takiego:X matches on Y lines
Alexej Magura
@AlexejMagura Mam na myśli - jak zobaczyć kilka linijek przed i po ciągu?
Witalij Zdanevich
50

Możesz również wykonać:

g/pattern/#

który wydrukuje wybrany wzór i numer linii.

Taurus Olson
źródło
2
Niezłe. Ale jeśli masz już włączone numery linii, #nie jest to wymagane. Domyślnie pokazuje numery linii
Pavan Manjunath
44

jeśli chcesz przejrzeć tę listę i szybko przeskakiwać między dopasowaniami, rozważ użycie

:vimgrep example %

lub

:grep example %

Spowoduje to zapełnienie „listy błędów” wszystkimi dopasowaniami, dzięki czemu będzie można :copenwyświetlić je wszystkie w buforze quickfix, nacisnąć klawisz Enter w określonej linii, aby przejść do tego dopasowania, lub użyć poleceń takich jak :cni, :cpaby przejść tam iz powrotem.

szczegółowe wyjaśnienie znajduje się w mojej odpowiedzi na podobne pytanie

Paul Ivanov
źródło
Daje to E499: Empty file name for '%' or '#', only works with ":p:h"MacVim 8.1
Lincoln Bergeson
35

Właśnie nauczyłem się nowego Location List:!
Wpisz, :lvim foo %aby wyszukać foow bieżącym pliku, i wprowadź wszystkie dopasowania zawierające foona liście lokalizacji .
Wpisz, :lopenaby otworzyć listę lokalizacji w oknie quickfix, po którym jak zwykle można w pełni nawigować.
Użyj :lnext/ :lpreviousto, aby przejrzeć listę (użyj tpope / unimpaired mapping, aby uzyskać najlepsze wrażenia)

freeo
źródło
2
Niezła wskazówka! to doprowadziło mnie do stworzenia tego mapowania, które automatycznie rozwija słowo pod kursorem i otwiera się w jednym przeciągnięciu: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen
16

Inną możliwością jest użycie poleceń dołączania wyszukiwania plików.

[I

Spowoduje to wyświetlenie wszystkich wystąpień słowa pod kursorem. Może to być jednak więcej niż potrzebujesz, ponieważ przeszuka również wszystkie pliki zawarte w bieżącym pliku.

Ale fajną rzeczą w tym poleceniu jest to, że ekran wyników wyszukiwania pokazuje również liczbę dopasowań, oprócz numeru wiersza każdego dopasowania.

:help include-search

aby zobaczyć wiele wariantów.

Uwaga o

:g//p

Można to dalej zredukować do

:g//

ponieważ, jak powiedzieli inni, p (rint) jest akcją domyślną.

dekeguard
źródło
Czy można uzyskać wynik [Iz kontekstem, jak na grep --context 9?
Witalij Zdanevich
10

możesz otrzymać ładne quickfixokno z dopasowaniami z twojego aktualnego wzorca wyszukiwania

:vim // %
:copen

bardzo przydatne, jeśli wcześniej utworzyłeś złożony wzorzec wyszukiwania przy użyciu tylko /pattern

Edycja : właśnie dowiedziałem się, że działa to również dla wszystkich otwartych buforów

:bufdo vimgrepadd // %
:copen
user1859022
źródło
10

Użycie :set hlsearchpodświetli wszystkie dopasowania na żółto, umożliwiając łatwe skanowanie pliku w poszukiwaniu dopasowań. Może to jednak nie być to, czego chcesz, po wyszukaniu: g // p wyświetli listę dopasowań

Kevin
źródło
2
Powinien być „: set hlsearch” not ”: hlsearch”.
za dużo php
Przydatne jest również mapowanie, :nohlaby usunąć najciekawsze miejsca, gdy już ich nie potrzebujesz.
Kos
9

Aby rozwinąć to ... zamiast

/example
:g//p

możesz też pisać bezpośrednio

:g/example/p

lub, ponieważ p (rint) jest domyślną akcją dla polecenia: g (lobal), można to skrócić do

:g/example

I zamiast p (rint) możliwe są inne akcje, np. D (elete). Zobacz: help: global

user55400
źródło
6
g/pattern

Jeśli masz :set number , powyższe polecenie wyświetla również numery linii.

Jeśli nie :set number, to

g/pattern/#

wyświetli numery linii.

Sagar Jain
źródło
0

Napisałem do tego kawałek kodu. W rzeczywistości unika problemów w vimgrep. Działa nawet z nienazwanymi plikami. I jest łatwiejszy w użyciu.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Kiedy nazywasz to wzorem, otwiera okna lokalizacji ze wszystkimi dopasowaniami.

To może być rozkaz

command! -nargs=1 Mat call Matches(<f-args>)

Wszystko, co musisz zrobić, to wpisać :Mat pattern

Używam również następującego mapowania, aby uzyskać dopasowania do bieżącego wyboru wizualnego.

vnoremap Y "xy:call Matches(@x)<CR>
user2679290
źródło
-1

Ctrl-f, aby wyświetlić wszystkie wyniki wyszukiwania:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Rybak
źródło