@Malabarba erwähnte die Verwendung von wgrep
package zur Bearbeitung von grep / ack / ag-Ergebnissen.
Ich möchte eine detaillierte Einführung in die Verwendung des ag
Pakets und der wgrep-ag
Pakete schreiben , um die Bearbeitung von Ergebnissen zu erreichen, die mit dem multiple-cursors
Paket erzielt wurden .
Diese Pakete sind über Melpa erhältlich. Sie müssen auch ag
aka the_silver_searcher auf Ihrem System installiert haben .
Diese Anleitung gilt für Fälle, in denen Sie nach einer Möglichkeit suchen, einzelne Zeilen an allen / ausgewählten gefundenen Stellen zu bearbeiten ag
.
Installieren Sie ag
auf Ihrem System und den oben genannten Emacs-Paketen.
ag
unterstützt das Durchsuchen von Dateien mit Inhalten, die Ihrem angegebenen regulären Ausdruck entsprechen. Die einfachste Möglichkeit, festzustellen, ag
wo sich der Projektstamm befindet, besteht darin, dort einen leeren .git
Ordner abzulegen. Führen Sie dann die Suche mit M-x ag-project-regexp
.
Der Ergebnispuffer von ag search kann standardmäßig nicht bearbeitet werden. Um es bearbeitbar zu machen, M-x wgrep-change-to-wgrep-mode
verwenden Sie die wgrep
Standardbindung C-c C-p
.
Wenn Sie nun in all Ihren Dateien 'abcdef' in 'ghijkl' ändern müssen, suchen Sie nach 'abcdef' und der Ag-Ergebnispuffer zeigt alle Zeilen an, die diese Zeichenfolge enthalten. Anschließend können Sie diesen Puffer bearbeitbar machen und diese Zeichenfolgen manuell ändern. Diese Änderungen wirken sich auf die tatsächlichen Dateipuffer aus, wenn Sie M-x wgrep-finish-edit
die Standardbindung ausführen oder verwenden C-c C-e
. Sie können query-replace-regexp
diese Suche auch verwenden , um zu ersetzen.
Ich bevorzuge die multiple-cursors
schnelle Umgestaltung, damit ich in Echtzeit eine Rückmeldung darüber bekomme, wo meine mehrfachen Bearbeitungen gleichzeitig stattfinden. Markieren Sie die Zeichenfolge, die Sie ersetzen möchten, in diesem Ag-Ergebnispuffer und rufen Sie sie auf, M-x mc/mark-all-like-this
und bearbeiten Sie sie dann voller Ehrfurcht, während Sie sehen, wie Dinge an mehreren Stellen gleichzeitig bearbeitet werden.
Wenn Sie mit den oben erwähnten Änderungen zufrieden sind, müssen Sie C-c C-e
die Änderungen in den tatsächlichen Puffern "reflektieren". Die Puffer sind noch nicht gespeichert.
Um alle Puffer zu speichern, mache ich das normalerweise auf einmal, indem ich die Standardbindung von Emacs verwende C-x s !
.
Hier ist ein Beispiel für einen Anwendungsfall mit Screenshots:
Es zeigt den Vorgang des Ersetzens aller Instanzen von bind-to-modi-map
to bind-to-my-map
in my ~/.emacs.d/
.
Wenn ich bind-to-modi-map
in meinem Emacs-Installationsordner nach suche, erhalte ich das folgende Ergebnis:
Dieser Puffer ist schreibgeschützt.
Nachdem M-x wgrep-change-to-wgrep-mode
ich -modi-map
alle Instanzen dieser Auswahl mit M-x mc/mark-all-like-this
und nach dem Bearbeiten dieser Auswahl mit ausgewählt habe -my-map
, sieht es wie folgt aus:
Die blaue Markierung zeigt an, welche Zeilen geändert werden, wenn ich drücke C-c C-e
.
Nach dem Treffer sehen C-c C-e
Sie die Änderung in der aktuellen Datei in diesem Screenshot:
Ich würde dann alle geänderten Dateien mit speichern C-x s !
.
Sie müssen den grep-Ergebnispuffer nicht in irgendetwas konvertieren, es gibt bereits einen speziellen Modus zum Bearbeiten der grep-Ausgabe (und natürlich zum Reflektieren der Änderungen an den Dateien).
(require 'wgrep)
in Ihrer Init-Datei.C-c C-p
und bearbeiten Sie sie!C-c C-e
Es funktioniert sogar mit ack und ag.
quelle
Diese Funktionalität ist in projectile (
projectile-replace
) enthalten. Es wird ag / ack / git grep / grep verwenden, falls verfügbar (in dieser Reihenfolge), um Vorkommen zu finden undtags-query-replace
die Abfrage zu ersetzen.quelle
M-g n C-x e
(dh indem Sienext-error
durch die Vorkommen scrollen).Hier ist ein anderer Ansatz mit Eiszapfen .
Drücken Sie in Ihrem Emacs-
*grep*
Ausgabepuffer Cc `(das ist Cc backquote), das im Icicle- Modus an*grep*
den Befehl buffer gebunden isticicle-compilation-search
. Auf diese Weise können Sie schnellgrep
in einer beliebigen Reihenfolge zwischen den von Ihnen ausgewählten Suchtreffern (den von Ihnen ausgewählten Treffern) navigieren .Eingaben, die Sie in den Minibuffer eingeben, filtern (begrenzen) dynamisch die Menge der Suchtreffer, und Sie können die progressive Vervollständigung verwenden, um die Suche einzugrenzen, indem Sie mehrere Muster (z. B. Teilzeichenfolgen, reguläre Ausdrücke) nacheinander abgleichen.
Wenn Sie zwischen den Suchtreffern navigieren, können Sie bei Bedarf einen beliebigen Treffer ersetzen - entweder den gesamten Treffer (Zeile) oder nur den Teil, der Ihrer aktuellen Minipuffereingabe entspricht.
Siehe Eiszapfensuche - Kompilieren oder Grep . Ein Intro zu Icicles Suche ist hier , und Informationen über Begegnungen während ersetzen Icicles Suche ist hier .
quelle
Ich benutze dieses Dienstprogramm, das ich xah_find.el schrieb
Ich habe es geschrieben, weil:
Dieses elisp util ist vielleicht 5- bis 10-mal langsamer als das Aufrufen von Unix grep in Emacs, hat aber bei mir funktioniert.
quelle