Jedną rzeczą, którą często robię (ale polegam na linii poleceń) jest wyszukiwanie / grepowanie w wielu plikach.
Czy istnieje sposób wyświetlania wyników wyszukiwania dla wszystkich otwartych buforów?
Idealnie chciałbym mieć nowy bufor podzielony zawierający lokalizację wyniku i fragment kodu podobnie jak grep
robi. Na przykład ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
Jako bonus chciałbym móc wyszukać termin pod kursorem, podobnie jak gd
robi.
search
multiple-files
Roflo
źródło
źródło
Odpowiedzi:
Możesz użyć
:vimgrep /pattern/ {files}
do wypełnienia listy szybkich pasujących wzorców. Problem polega na tym, że:vimgrep
opcja plików nie zezwala bezpośrednio na bufory. Możesz użyć:Inną opcją jest napisanie skryptu, który generuje listę plików
:buffers
. Za ten post SO z niewielkim poprawką otrzymujemy:Możesz teraz zadzwonić
:GrepBufs <expression>
i uzyskać standardowe:vimgrep
wyjście, ale zamiast tego użyć buforów.Aktualizacja Jeśli chcesz zadzwonić,
GrepBuffers
używając wartości pod kursorem, dodaj nowe mapowanie.Gdy jesteś w trybie normalnym typu
<leader>z
i będziesz:vimgrep
słowo kursor otwartych buforów.źródło
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Zastosowanie::Bufgrep/foo/
Przeszukiwanie tylko otwartych buforów jest przyjemne, ale może nadejść czas, kiedy będziesz chciał przeszukać cały projekt. To może być szybsze i łatwiejsze niż myślisz!
Wyszukiwanie w projekcie
grep
jest standardowym narzędziem wyszukiwania w systemie Unix. Warto wspomnieć ze względu na jego wszechobecność. Już zintegrowany z Vimem za pomocą:grep
polecenia. np:grep -r 'foo'
. Zobaczyć:h :grep
.--perl
. Aby zapoznać się z integracją Vima, zobacz Ack.vimgit grep
bardzo szybko przeszukuje repozytorium. Fugitive.vim zapewnia:Ggrep
.git grep
. Może być również używany z:grep
.Polecam zarówno ripgrep, Ag,
git grep
jak i wszystkie są super szybkie. Przeszukałem ponad 4700+ w mniej niż 1 sekundę. Trudno jest pokonać ripgrep.Aby przetestować jedną z tych alternatyw bez wtyczki lub po prostu nie chcesz wtyczki, możesz odpowiednio ustawić swoją
'grepprg'
opcję. np .set grepprg=ag\ --vimgrep
lubset grepprg=rg\ --vimgrep
. Zobacz:h 'grepprg'
i:h 'grepformat'
więcej informacji. Teraz możesz wyszukiwać za pośrednictwem:grep
. np:grep 'foo'
.Jako ostatnią rezerwę możesz użyć,
:vimgrep
ponieważ jest ona dostępna we wszystkich systemach, w których Vim jest dostępny. Zobacz:h :vimg
więcej pomocy.Lista QuickFix
Ponieważ większość z tych opcji korzysta z listy szybkich poprawek, sugeruję użycie bardziej przyjaznych mapowań do przekreślenia listy szybkich poprawek. Używam Tim papieża nienagannej wtyczki, które wykorzystuje
]q
i[q
na:cnext
i:cprev
odpowiednio. Niektórzy ludzie lubią QuickFix otworzyć po Wyszukiwanie odbywa się następnie dodać następujące wpisy do~/.vimrc
pliku:autocmd QuickFixCmdPost *grep* cwindow
. Możesz także ręcznie otworzyć listę QuickFix za pośrednictwem:copen
.Chcesz jeszcze szybszych „wyszukiwań”?
Będziesz musiał użyć jakiegoś narzędzia, które korzysta z gotowych indeksów, takich jak ctags , cscope lub GNU global .
:tag
,<c-]>
i wiele innych poleceń i opcji. Zobaczyć:h tags
. Może także chcesz przeczytać Effitless Ctags w Git lub zajrzeć do wtyczki Gutentags:cscope
polecenia. Widzieć:h cscope
Więcej pomocy
Zacznę od tego miłego odcinka Vimcast : Przeszukaj wiele plików za pomocą
:vimgrep
.Więcej pomocy Vima w dokumentacji:
źródło
Moja wtyczka GrepCommands definiuje warianty wbudowanego
:vimgrep
polecenia, które ma na celu wyszukiwanie wszystkich argumentów, wymienionych buforów, okien na bieżącej stronie kart lub wszystkich stron kart. Zasadniczo solidna implementacja wtyczki odpowiedzi @ jecxjo.źródło
Polecenia
:bufdo
i:vimgrepadd
Ta odpowiedź jest oparta na /programming//a/11976158/1057593 .
Chciałem jednak dodać kilka bitów. Ponownie podstawowym poleceniem jest
Jeśli lista szybkich poprawek nie jest pusta, prawdopodobnie najpierw chcesz ją wyczyścić (patrz /programming//q/27385970/1057593 ). Można to zrobić za pomocą
vim-unimpaired zapewnia odwzorowania
]q
i[q
przełącza mecze.cmdline-history
Dobrym przepływem pracy jest oddzielne wprowadzanie wzorca wyszukiwania
/pattern
. Pozwala to na użycie polecenia ogólnego z historii wiersza poleceń przy użyciu bieżącego wzorca wyszukiwania. To by wyglądałoTypowe byłoby wyszukiwanie w całym buforze
Dodałem następujące mapowania do mojego vimrc do użycia
<C-N>
i<C-P>
zamiast klawiszy strzałekAby przeszukać historię poleceń, użyj
q:
, a następnie/bufdo<CR>
wywołaj polecenie za pomocą<CR>
. Aby uzyskać więcej informacji, zobacz https://vim.fandom.com/wiki/Using_command-line_history oraz strony pomocy:h history
i:h cmdline-window
.Możesz dodać do polecenia wielokrotnego użytku,
:copen
aby natychmiast zobaczyć listę poprawek w następujący sposób:Propozycja z przepełnienia stosu
:bufdo vimgrepadd // % | copen
otworzyła w moim przypadku kilka niezamierzonych okien.źródło