Jak najłatwiej przeszukać wszystkie przydatne pliki w jednym projekcie?

28

Jaki jest najłatwiejszy sposób wyszukiwania wyrażenia regularnego w treści wszystkich plików w bieżącym projekcie, pomijając pliki, które nie są przydatne?

Bezużyteczne pliki to takie rzeczy, jak skompilowane pliki, importowane biblioteki, pliki kontroli wersji itp.

Jestem tego świadomy rgrep, ale wszystko przeszukuje. Czy istnieje pakiet, który wyszukuje „inteligentnie” i zna kilka różnych języków programowania, więc nie musiałbym konfigurować go dla każdego projektu?

Malabarba
źródło
Twój komentarz „po prostu wszystko przeszukuje” rgrepjest nieco mylący, biorąc pod uwagę, że domyślnie wyklucza wszystkie pliki pasujące do kryteriów „bezużytecznych plików”.
phils

Odpowiedzi:

32

Wyszukiwanie w Emacsie na podstawie projektu można przeprowadzić za pomocą pocisku .

Umożliwia konfigurację ignorowanych plików (w <projectroot>\.projectilepliku) dla poszczególnych projektów lub określenie podkatalogów do monitorowania i ignorowania wszystkich innych.

Może działać grep, ack(wymaga ack-and-a-half.el) i ag( ag.el) na plikach w ramach zdefiniowanego projektu (na podstawie .projectilepliku lub przez znalezienie obsługiwanego pliku VC w celu zdefiniowania katalogu głównego projektu).

Przydatne polecenia

(W odniesieniu do wyszukiwania przydatnych plików)

Zgodnie z plikiem Readme pocisku

  • C-c p s g :: Uruchom grepna plikach w projekcie.
  • C-c p s a :: Działa ackna projekcie. Wymaga obecności półtora kilometra.
  • C-c p s s :: Działa agna projekcie. Wymaga obecności ag.el.
  • C-c p f :: Wyświetl listę wszystkich plików w projekcie.
  • C-c p d :: Wyświetla listę wszystkich katalogów w projekcie.
  • C-c p a :: Przełączanie między plikami o tej samej nazwie, ale z innym rozszerzeniem w projekcie.
  • C-c p o:: Działa multi-occurna wszystkich otwartych buforach projektu.

Będą one działać tylko na plikach określonych jako będące częścią projektu (lub znalezione podczas generowania / regeneracji pamięci podręcznej).

Jonathan Leech-Pepin
źródło
Dzięki, jakiego polecenia pocisku mogę użyć do tego?
Malabarba
Zmodyfikowałem go, aby zawierał podzbiór poleceń (tych, które dotyczą wyszukiwania, znajdź plik i dired). Pełna lista znajduje się w pliku Readme.
Jonathan Leech-Pepin
13

Wyszukiwanie w agcałym projekcie tylko odpowiednich plików można przeprowadzić za pomocą aka the_silver_searcher .

Dlaczego ag?

  • Ignoruje wzory plik z .gitignore, .hgignore, svn:ignore. Możesz wybrać dla swoich wyszukiwań, aby NIE używać listy ignorowanych z list ignorowanych kontroli wersji za pomocą -Uprzełącznika.
  • Jeśli w repozytorium źródłowym znajdują się pliki, których nie chcesz przeszukiwać, po prostu dodaj ich wzorce do .agignorepliku.
    • Plik globalny .agignoremożna umieścić w swoim, $HOMEa następnie możesz umieścić więcej .agignoreplików specyficznych dla projektu w katalogu głównym projektu.

Konfiguracja agi emacs

  • Zainstaluj agtakże w swoim systemie aka the_silver_searcher .
  • Skonfiguruj .agignoreplik. Wolę mieć tylko .agignoreplik globalny $HOME.
  • Zainstaluj agpakiet (dostępny w Melpa).
  • Następnie możesz użyć funkcji ag-projectlub ag-project-regexp(dostarczonej z agpakietem) do wyszukiwania plików w całym projekcie.
    • Domyślnie te funkcje używają katalogu głównego repozytorium VCS jako katalogu do przeszukiwania. Możesz to zmienić, ustawiając lub dostosowując ag-project-root-function.
    • Nawet jeśli twój projekt nie jest kontrolowany przez git, możesz oznaczyć katalog główny projektu dla wyszukiwania na podstawie ag-project/ ag-project-regexp, umieszczając pusty .gitfolder w katalogu głównym projektu. Nie musisz wtedy dostosowywać ag-project-root-function.
Kaushal Modi
źródło
4

Jeśli Twój projekt korzysta z Git, potrzebujesz tylko counsel https://github.com/abo-abo/swiper

  • counsel-git znaleźć plik

  • counsel-git-grep grep

Jedyną zależnością jest git

Grepping tekstu jest szybszy niż srebrny wyszukiwarka (ag)

Counsel zapewnia również inne potężne narzędzia. Na przykład po uruchomieniu counsel-git-grepmożna nacisnąć C-c C-oi, C-x C-qaby przejść wgrep-modedo łatwego zastąpienia tekstu w zakresie projektu.

Artykuł https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ wyjaśniający szczegóły. Ten artykuł wykorzystuje counsel-ag(inne polecenie wbudowane w poradę), ale cousnel-git-grepużywa dokładnie tego samego przepływu pracy.

Chen Bin
źródło
Ale dlaczego grepowanie tekstu jest szybsze niż ag? Czy mógłbyś proszę opracować?
denis631
1
agjest również Program grep, jak git-grep. Nie mogę powiedzieć, co jest szybsze. Zobacz github.com/BurntSushi/ripgrep którym porównano skuteczność popularnych programów grep (w tym agi git-grep)
Chen Bin
1

Pierwsza odpowiedź jest piękna, ale pomija pewne krytyczne szczegóły dotyczące współczesnych wersji Emacsa. Jestem znany Emacsowi, więc inni nowicjusze mogą nie być tego świadomi. Biorąc pod uwagę, że Twoim celem jest wyszukiwanie tekstu W PROJEKCIE, najpierw zainstaluj pocisk przy użyciu repozytorium MELPA.

Spowoduje to zainstalowanie pakietu w .emacs.d i dodanie podstawowej konfiguracji do .emacs w katalogu $ USER (zakładając, że utworzyłeś plik .emacs), na przykład wymaganie Projectile w instalacji Emacsa.

Jednak nadal musisz go włączyć i powiązać prefiksy mapy klawiszy, aby można było wywołać go w mini buforze.

Odpowiedź Zaakceptowany wymienia następujące polecenie:

C-c p s g

To nie będzie działać, chyba że skonfigurujesz pocisk z tym od mapy prefiksu. Ale skonfigurowałem go tak, aby używał Cc Cp jako polecenia dla projektu w .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

Biorąc to pod uwagę, jestem w stanie wyszukiwać tekst w plikach w projekcie za pomocą grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

Aby go rozbić, C-c C-pwywoła pocisk i s gwykona wyszukiwanie grep. Otrzymasz taki piękny wynik, zakładając, że twoje wyszukiwanie jest visit_contacti przeszukujesz rspec Ruby w projekcie:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
Donato
źródło