Was ist der einfachste Weg, um alle nützlichen Dateien in einem einzigen Projekt zu durchsuchen?


28

Was ist der einfachste Weg, um im gesamten Inhalt aller Dateien im aktuellen Projekt nach einem regulären Ausdruck zu suchen, wobei nicht nützliche Dateien übersprungen werden?

Nutzlose Dateien sind kompilierte Dateien, importierte Bibliotheken, Versionskontrolldateien usw.

Mir ist bewusst rgrep, aber es durchsucht einfach alles. Gibt es ein Paket, das "intelligent" sucht und verschiedene Programmiersprachen kennt, sodass ich es nicht für jedes einzelne Projekt konfigurieren müsste?


Ihr Kommentar zu "Es durchsucht einfach alles" rgrepist etwas verwirrend, da standardmäßig alle Dateien ausgeschlossen werden, die Ihren Kriterien für "Unbrauchbare Dateien" entsprechen.
Phils

Antworten:


32

Die projektbasierte Suche in Emacs kann mit Hilfe von Projectile durchgeführt werden .

Es ermöglicht die projektspezifische Konfiguration von Ignorierdateien (in einer <projectroot>\.projectileDatei) oder die Angabe von Unterverzeichnissen, in denen alle anderen Dateien überwacht und ignoriert werden sollen.

Er kann laufen grep, ack(erfordert ack-and-a-half.el) und ag( ag.el) auf Dateien innerhalb des definierten Projektes (entweder auf der Grundlage der .projectileDatei oder durch eine unterstützte VC - Datei der Suche nach einem Projektstamm zu definieren).

Nützliche Befehle

(In Bezug auf die Suche in nützlichen Dateien)

Gemäß Projektil-Readme

  • C-c p s g :: Führen Sie grepdie Dateien im Projekt aus.
  • C-c p s a :: Läuft ackauf dem Projekt. Benötigt das Vorhandensein von ack-and-a-half.
  • C-c p s s :: Läuft agauf dem Projekt. Benötigt die Anwesenheit von ag.el.
  • C-c p f :: Zeigt eine Liste aller Dateien im Projekt an.
  • C-c p d :: Zeigt eine Liste aller Verzeichnisse im Projekt an.
  • C-c p a :: Wechseln Sie zwischen Dateien mit demselben Namen, aber unterschiedlicher Erweiterung im Projekt.
  • C-c p o:: Läuft multi-occurauf allen aktuell geöffneten Projektpuffern.

Diese wirken sich nur auf Dateien aus, die als Teil des Projekts definiert sind (oder gefunden werden, wenn der Cache generiert / neu generiert wird).


Danke, was ist der Projektilbefehl, den ich dafür verwenden kann?
Malabarba

Bearbeitet, um eine Teilmenge der Befehle aufzunehmen (die sich mit Suchen, Finden von Dateien und Dired befassen). Die vollständige Liste befindet sich in der Readme-Datei des Pakets.
Jonathan Leech-Pepin

13

Die agprojektweite Suche nur nach relevanten Dateien kann mit Hilfe von the_silver_searcher durchgeführt werden .

Warum ag?

  • Es ignoriert Dateimuster von Ihrem .gitignore, .hgignore, svn:ignore. Sie können für Ihre Suche festlegen, dass die Ignorierliste NICHT in den Versionskontroll-Ignorierlisten verwendet wird, indem Sie den -USchalter verwenden.
  • Wenn Ihre Quelldatei Dateien enthält, die Sie nicht durchsuchen möchten, fügen Sie einfach deren Muster zu einer .agignoreDatei hinzu.
    • Eine globale .agignoreDatei kann in Ihre eingefügt werden, $HOMEund dann können Sie weitere projektspezifische .agignoreDateien in Ihre Projektstammverzeichnisse einfügen.

Einrichten agund Emacs

  • Installieren Sie agaka the_silver_searcher auf Ihrem System.
  • Richten Sie die .agignoreDatei ein. Ich bevorzuge es, nur eine globale .agignoreDatei in meiner zu haben $HOME.
  • Installieren Sie das agPaket (verfügbar auf Melpa).
    • Ich würde auch empfehlen, das wgrep-agPaket zu installieren (auch auf Melpa verfügbar). Das würde helfen, wenn Sie versuchen, projektweit zu suchen / ersetzenag .
  • Sie können dann die Funktion ag-projectoder ag-project-regexp(die mit dem agPaket geliefert wird) verwenden, um projektweite Dateisuchen durchzuführen.
    • Standardmäßig verwenden diese Funktionen das Stammverzeichnis des VCS-Repositorys als Verzeichnis, in dem gesucht werden soll. Sie können dies überschreiben, indem Sie das Verzeichnis festlegen oder anpassen ag-project-root-function.
    • Auch wenn Ihr Projekt nicht git-gesteuert ist, können Sie einen Projektstamm für die ag-project/ ag-project-regexp-basierte Suche markieren, indem Sie einen leeren .gitOrdner in Ihrem Projektstamm ablegen. Sie müssen dann nicht anpassen ag-project-root-function.

4

Wenn Ihr Projekt Git verwendet, benötigen Sie nur counsel https://github.com/abo-abo/swiper

  • counsel-git Datei zu finden

  • counsel-git-grep zu greifen

Die einzige Abhängigkeit ist Git

Text-Grepping ist schneller als der Silver Searcher (ag)

Counsel bietet auch andere leistungsstarke Tools. Zum Beispiel, nach dem Laufen counsel-git-grep, können Sie drücken C-c C-ound C-x C-qgehen in wgrep-modedem einfachen Text in dem Projektumfang zu ersetzen.

In einem Artikel https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/ werden Details erläutert. In diesem Artikel wird counsel-ag(ein weiterer in counsel integrierter Befehl) cousnel-git-grepderselbe Arbeitsablauf verwendet.


Aber warum ist das Greifen von Texten schneller als ag? Könnten Sie bitte näher darauf eingehen?
denis631

1
agist auch ein grep programm, wie git-grep. Ich kann nicht sagen, was schneller ist. Siehe github.com/BurntSushi/ripgrep, in dem die Leistung beliebter grep-Programme (einschließlich agund git-grep) verglichen wird
chen bin

1

Die erste Antwort ist schön, lässt aber einige kritische Details über moderne Versionen von Emacs aus. Ich bin Emacs selbst bekannt, daher sind sich andere Neulinge möglicherweise dessen nicht bewusst. Wenn Sie das Ziel haben, INNERHALB einer Datei in einem PROJEKT nach Text zu suchen, installieren Sie Projectile zunächst über das MELPA-Repository.

Dadurch wird das Paket in .emacs.d installiert und .emacs in Ihrem $ USER-Verzeichnis wird eine Grundkonfiguration hinzugefügt (vorausgesetzt, Sie haben die .emacs-Datei erstellt), beispielsweise, dass Projectile in Ihrer Emacs-Installation erforderlich ist.

Sie müssen es jedoch noch aktivieren und Keymap-Präfixe zuordnen, damit Sie es im Minipuffer aufrufen können.

In der akzeptierten Antwort wird der folgende Befehl erwähnt:

C-c p s g

Dies funktioniert nur, wenn Sie Projectile mit diesem Keymap-Präfix konfigurieren. Aber ich habe es so konfiguriert, dass Cc Cp als Befehl für Project in .emacs verwendet wird:

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

Nun kann ich mit grep eine Textsuche in Dateien in einem Projekt durchführen:

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

Um es zu zerlegen, C-c C-pwird Projectile aufgerufen und s gdie Grep-Suche durchgeführt. Sie erhalten eine schöne Ausgabe wie diese, vorausgesetzt, Ihre Suche ist visit_contactund Sie suchen Rubys rspec in einem Projekt:

./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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.