Używam Emacsa od dłuższego czasu i nadal jakoś nie rozumiem, jaki jest najlepszy sposób (rekurencyjnie) grep dla ciągu w katalogu (projektu) i otrzymuję wyniki przedstawione jako bufor diodowy lub w jeszcze więcej użyteczny sposób. Proszę, oświeć mnie.
14
helm-projectile-grep
polecenia (jeśli masz zainstalowany pocisk steru) lubprojectile-grep
?helm
lubprojectile
jest, ale jeśli jest to zalecane narzędzie, zainstalowałbym je i nauczę się.projectile-grep
. RÓWNIEŻ polecam zainstalowaćhelm
pakiet. Nie wyobrażam sobie uruchamiania emacsa bezhelm
ihelm-projectile
. Możesz być także interesujący whelm-ag
pakiecie (który zapewnia interfejs sterujący dla srebrnego wyszukiwarki w emacsie, który jest podobno szybszy niż grep lub ack).M-x grep
nie robi tego, czego potrzebujesz. To pozwala ci podać dowolną linię poleceń, której czasami używamfind
, gdy potrzebuję rekurencji.Odpowiedzi:
Cóż, ponieważ oryginalne pytanie nie wspomina
rgrep
, postaram się to wyjaśnić tutaj. Jest to najprostsza opcja już wbudowana w Emacsa i okazało się, że jest wystarczająca do większości rzeczy.Z dokumentacji
Wyszukiwanie jest ograniczone do nazw plików pasujących do wzorca powłoki PLIKI.
Tak więc, na przykład, aby wyszukać wszystkie pliki Pythona pod moim katalogu domowym dla zastosowań
some_function
, nazwałbym gosome_function
,*.py
,~/
jako argumenty. Wyniki są wyświetlane w nowym buforze.źródło
find-grep-dired
ponieważ OP wspomniał o „wynikach przedstawionych jako bufor dired lub ...”find-grep-dired
siebie, dodaj to do odpowiedzi.rgrep
robi tak dobrą robotę, kierując wyszukiwanie, że nie było między nimi znaczących różnic prędkości. (Chcę powiedzieć, że rgrep był w niektórych przypadkach frakcjonalnie szybszy , ale nie pamiętam tego na pewno.)next-error
iprevious-error
może służyć do poruszania się po zestawie wyników. ZnajdujęM-g M-n
iM-g M-p
najwygodniejszy ze standardowych wiązań.find-grep-dired
nie daje mi bufora z linkami odsyłającymi.rgrep
robi to dla mnie i ta ostatnia sugestianext-error
previous-error
jest fantastyczna! Moim jedynym sporem jest to, że wszystkie niechlujne dane wyjściowe wykonywania komend na początku bufora.Z przyjemnością korzystam
M-x find-grep-dired
od lat. Zwraca wyniki w postaci buforowanego bufora, którego można użyć.źródło
find-ls-option
), a w końcu dostajesz coś bardzo gadatliwego, ponieważ nie działa bez daty przed nazwą pliku!Rozwiązanie 1 (najlepsze rozwiązanie):
Zainstaluj doradcę ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Potem
M-x counsel-git-grep
.Nie jest wymagana konfiguracja (git zna katalog główny projektu i pliki do wykluczenia). Zarówno
git grep
icounsel
jest wydajny.Projekt musi być zarządzany przez git.
rada wymaga trybu bluszczu.
Rozwiązanie 2:
To rozwiązanie używa grep i działa na każdym projekcie. Jest gorszy od rozwiązania 1, ponieważ jest wolniejszy i wymaga ręcznej konfiguracji. Opiera się również na trybie bluszczu.
Aby skonfigurować
simple-project-root
, musisz utworzyć plik .dir-locals.el , zobacz https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html w celu uzyskania szczegółowych informacji technicznychKod w rozwiązaniu 2 jest tylko prototypem. Moja prawdziwa implementacja jest znacznie bardziej złożona. Zobacz
counsel-etags-grep
w https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elStreszczenie:
To dwa najlepsze rozwiązania, jakie znam.
Jeśli istnieją jakieś inne lepsze rozwiązania, muszą one przynajmniej rozwiązać poniższe problemy, aby były gotowe do produkcji,
jak zmusić słowo kluczowe do grep (na przykład uzyskać słowo kluczowe z wybranego regionu)
uciec od słowa kluczowego
jeśli istnieje bardziej wydajny program grep, powinniśmy go użyć (ripgrep, the_silver_searcher / ag, ... itd.), lub cofnąć domyślny grep
okno kandydata powinno korzystać z pełnej szerokości ekranu, a użytkownicy mogą interaktywnie filtrować kandydatów (dlatego ludzie używają bluszczu lub hełmu)
powinniśmy pokazać ścieżkę względną w oknie kandydata
w stanie ponownie użyć poprzedniego grepowanego wyniku. Poprzedni wynik powinien zostać zapisany. Możesz używać
ivy-resume
zivy
lubhelm-resume
zhelm
Kiedy zapisujesz poprzedni grepowany wynik, kontekst poprzedniego wyniku również powinien zostać zapisany. Na przykład w kodzie rozwiązania 2.
default-directory
jest kontekst. Więcej informacji na stronie https://github.com/abo-abo/swiper/issues/591 .Należy użyć rozszerzonego wyrażenia regularnego, ponieważ jest ono prostsze i jest już używane przez
counsel-git-grep
the_silver_searcher / ag.źródło
Chciałbym dodać kolejne rozwiązanie do rozwiązania @chen bin, które również wykorzystuje
counsel
(ale nie musisz mieć projektugit
do tego utrzymanego ).Musisz zainstalować ag (srebrny wyszukiwarka) i
counsel
podać polecenie,counsel-ag
które przeszukuje bieżący katalog pod kątem wprowadzonego ciągu.Jeśli chcesz wyszukiwać w projekcie (nie tylko w bieżącym katalogu roboczym), dodaj to do
.emacs
:Ta funkcja posłuży
ag
do rekurencyjnego przeszukiwania katalogu głównego projektu.Edycja : powyższa funkcja domyślnie przyjmuje symbol w punkcie wyszukiwania. Jeśli nie lubisz tego zachowania, należy wymienić
(thing-at-point 'symbol)
znil
. A jeśli chcesz wyniki wyszukiwania we własnym buforze naciśnijC-c C-oEdit2 : jeśli już
ripgrep
zainstalowany, można wymienićcounsel-ag
zecounsel-rg
w powyższej funkcji, a to będzie tak jak grzywny :)źródło
projectile-project-root
można znaleźć katalog główny projektu Rails?rag/...
?rag/
przedrostka, dzięki czemu można je łatwo znaleźć podM-x
:)Oto przykład niestandardowej funkcji grep, która rekursywnie grepuje zawartość pliku (używając wyrażenia regularnego dla wyszukiwanego terminu) w katalogu i jego podkatalogach oraz wyświetla wyniki z liniami kontekstu przed i po. Wbudowane
compile.el
igrep.el
biblioteki zapewniają kilka metod przeskakiwania do lokalizacji w pliku zawierającym wyniki wyszukiwania. Aby ten przykład działał, nie trzeba instalować niczego innego - potrzebna jest tylko pełna wersja Emacsa i komputer zgrep
zainstalowanym narzędziem. Zmiennągrep-program
można dostosować tak, aby wskazywała określoną lokalizacjęgrep
narzędzia, jeśli wartość domyślna nie jest wystarczająca.źródło
multiple-cursors
iwgrep
. Sprawia, że modyfikowanie wielu plików za jednym zamachem jest dziecinnie proste. Wymienione biblioteki będą jednak musiały zostać zainstalowane, jeśli te funkcje są pożądane.rgrep
?rgrep
jest czasochłonne w dostosowywaniu do moich preferowanych kryteriów wyszukiwania wyrażeń regularnych i zdecydowałem się na sztywne kodowanie wszystkiego w funkcji niestandardowej (której używam kilka razy dziennie). Jeśli chcesz napisać alternatywną odpowiedź, która opisuje sposób dostosowywaniargrep
, byłoby to pomocne dla innych czytelników forum w przyszłości.