Ich benutze Emacs seit geraumer Zeit und verstehe immer noch nicht, wie man (rekursiv) nach einem String in einem (Projekt-) Verzeichnis grept und die Ergebnisse entweder als Dired-Buffer oder in einem noch besseren anzeigt nützliche Weise. Bitte erleuchte mich.
14
helm-projectile-grep
Kommando ausprobiert (wenn Sie ein Helmprojektil installiert haben) oderprojectile-grep
?helm
oderprojectile
ist, aber wenn es ein empfohlenes Tool ist, würde ich es installieren und lernen.projectile-grep
. Außerdem empfehle ich Ihnen dringend, dashelm
Paket zu installieren . Ich kann mir nicht vorstellen, Emacs ohnehelm
und laufen zu lassenhelm-projectile
. Vielleicht interessiert Sie auchhelm-ag
package (das eine Steuerschnittstelle für Silver Searcher in Emacs bietet, die angeblich schneller als grep oder ack ist).M-x grep
nicht das tut, was Sie benötigen. Es lässt sich eine beliebige Befehlszeile angeben, die ich dort manchmal verwende,find
wenn ich die Rekursion benötige.Antworten:
Nun, da die ursprüngliche Frage nicht erwähnt wird
rgrep
, werde ich hier darauf hinweisen. Dies ist die einfachste Option, die bereits in Emacs integriert ist, und ich habe festgestellt, dass sie für die meisten Dinge mehr als ausreichend ist.Aus der Dokumentation,
Die Suche ist auf Dateinamen beschränkt, die dem Shell-Muster FILES entsprechen.
So zum Beispiel aller Python - Dateien unter meinem Home - Verzeichnis zu suchen , für die Verwendung von
some_function
, würde ich es nennt mitsome_function
,*.py
,~/
wie die Argumente. Die Ergebnisse werden in einem neuen Puffer angezeigt.quelle
find-grep-dired
Könnte auch erwähnt werden, da OP erwähnte "Ergebnisse entweder als Dired Buffer oder ..."find-grep-dired
mich selbst nicht benutzt , zögern Sie nicht , es der Antwort hinzuzufügen.rgrep
gelingt die gezielte Suche so gut, dass es keine signifikanten Geschwindigkeitsunterschiede zwischen ihnen gab. (Ich möchte sagen, dass rgrep in einigen Fällen geringfügig schneller war , aber ich kann mich nicht sicher erinnern.)next-error
undprevious-error
durch die Ergebnismenge navigiert werden kann. Ich findeM-g M-n
undM-g M-p
die bequemste der Standardbindungen.find-grep-dired
Gibt mir keinen Puffer mit Querverweislinks.rgrep
tut es für mich und dieser letzte Vorschlagnext-error
previous-error
ist fantastisch! Mein einziges Manko ist, dass die gesamte Befehlsausführung zu Beginn des Puffers chaotisch ist.Ich benutze glücklich
M-x find-grep-dired
seit Jahren. Es gibt die Ergebnisse als gerichteten Puffer zurück, den Sie verwenden können.quelle
find-ls-option
) und schließlich hat man etwas ziemlich Ausführliches, weil es nicht funktioniert, wenn das Datum nicht vor dem Dateinamen steht!Lösung 1 (beste Lösung):
Installieren Sie counsel ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Dann
M-x counsel-git-grep
.Kein Setup erforderlich (Git kennt den Projektstamm und die auszuschließenden Dateien). Beides
git grep
undcounsel
ist effizient.Das Projekt muss von git verwaltet werden.
Für einen Rechtsbeistand ist ein Efeumodus erforderlich.
Lösung 2:
Diese Lösung verwendet grep und funktioniert in jedem Projekt. Es ist der Lösung 1 unterlegen, da es langsamer ist und manuell eingerichtet werden muss. Es basiert auch auf dem Efeu-Modus.
Sie müssen zum Einrichten .dir-locals.el erstellen. Technische Details finden
simple-project-root
Sie unter https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.htmlDer Code in Lösung 2 ist nur ein Prototyp. Meine eigentliche Implementierung ist viel komplexer. Siehe
counsel-etags-grep
unter https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elZusammenfassung:
Das sind die besten zwei Lösungen, die ich kenne.
Wenn es andere bessere Lösungen gibt, müssen diese zumindest die folgenden Probleme lösen, um produktionsbereit zu sein.
wie man das Schlüsselwort zu grep bringt (zum Beispiel ein Schlüsselwort aus einer ausgewählten Region holen)
Entkomme dem Schlüsselwort
Wenn ein effizienteres grep-Programm vorhanden ist, sollten wir es verwenden (ripgrep, the_silver_searcher / ag, ... etc) oder auf das Standard-grep zurückgreifen
Das Kandidatenfenster sollte die volle Bildschirmbreite nutzen und die Benutzer können die Kandidaten interaktiv filtern (daher wird Efeu oder Helm verwendet).
Wir sollten den relativen Pfad im Kandidatenfenster anzeigen
in der Lage, frühere grepped Ergebnis wiederzuverwenden. Das vorherige Ergebnis sollte also gespeichert werden. Sie können
ivy-resume
vonivy
oderhelm-resume
von verwendenhelm
Wenn Sie das vorherige Grepped-Ergebnis speichern, sollte auch der Kontext des vorherigen Ergebnisses gespeichert werden. Zum Beispiel steht im Code von Lösung 2 der
default-directory
Kontext. Weitere Informationen finden Sie unter https://github.com/abo-abo/swiper/issues/591 .Der erweiterte reguläre Ausdruck sollte verwendet werden, da er einfacher ist und bereits von
counsel-git-grep
und the_silver_searcher / ag verwendet wird.quelle
Ich möchte @chen bin's Lösung um eine weitere Lösung erweitern, die ebenfalls verwendet wird
counsel
(Sie müssen jedoch kein Projektgit
dafür verwalten).Sie müssen ag (den Silver Searcher) installieren und
counsel
den Befehl bereitstellen, dercounsel-ag
das aktuelle Verzeichnis nach der eingegebenen Zeichenfolge durchsucht.Wenn Sie in einem Projekt suchen möchten (nicht nur im aktuellen Arbeitsverzeichnis), fügen Sie Folgendes hinzu
.emacs
:Diese Funktion wird
ag
zum rekursiven Durchsuchen des Projektstammverzeichnisses verwendet.Bearbeiten : Die obige Funktion verwendet standardmäßig das Symbol an der Stelle, an der gesucht werden soll. Wenn Ihnen dieses Verhalten nicht gefällt, ersetzen Sie es
(thing-at-point 'symbol)
durchnil
. Und wenn Sie die Suchergebnisse in einem eigenen Puffer anzeigen möchten, drücken SieC-c C-oEdit2 : wenn Sie schon
ripgrep
installiert haben , können Sie ersetzencounsel-ag
mitcounsel-rg
in der obigen Funktion und es wird nur so fein :)quelle
projectile-project-root
man Rails-Projektstamm finden?rag/...
?rag/
Präfix und sind daher leicht zu finden unterM-x
:)Hier ist ein Beispiel für eine benutzerdefinierte grep-Funktion, mit der Dateiinhalte (unter Verwendung eines regulären Ausdrucks für den Suchbegriff) in einem Verzeichnis und seinen Unterverzeichnissen rekursiv überprüft und die Ergebnisse mit Kontextzeilen davor und danach angezeigt werden. Die integrierte Bibliothek
compile.el
und diegrep.el
Bibliotheken bieten verschiedene Methoden, um zu der Position in der Datei zu springen, die die Suchergebnisse enthält. Für dieses Beispiel ist keine weitere Installation erforderlich. Sie benötigen lediglich eine Vollversion von Emacs und einen Computer, auf dem dasgrep
Dienstprogramm installiert ist. Die Variablegrep-program
kann so angepasst werden, dass sie auf eine bestimmte Position desgrep
Dienstprogramms verweist, wenn die Standardeinstellung nicht ausreicht.quelle
multiple-cursors
und zu verwendenwgrep
. Es macht das Ändern mehrerer Dateien auf einen Schlag zum Kinderspiel. Diese Bibliotheken müssten jedoch installiert werden, wenn diese Funktionen gewünscht werden.rgrep
?rgrep
Codes an meine bevorzugten Suchkriterien für reguläre Ausdrücke zeitaufwendig ist, und entschied mich dafür, alles in einer benutzerdefinierten Funktion (die ich mehrmals täglich verwende) fest zu codieren. Wenn Sie eine alternative Antwort verfassen möchten, in der das Anpassen beschriebenrgrep
wird, ist dies in Zukunft für andere Forum-Leser hilfreich.