Gibt es eine Möglichkeit, das Ersetzen von Abfragen in den Ausgabemodi grep / ack / ag zu verwenden?

31

Mir ist bewusst find-grep-dired, dass ich die entsprechenden Dateien markiere und dann drücke Q, um dired-do-query-replace-regexpdie markierten Dateien auszuführen . Leider erfordert dies einen Neustart von grep und die Nichtverwendung von git-grep, ack oder ag sowie den Wechsel zu find-grepeiner anderen Suchsyntax.

Mir ist auch bewusst , dass multi-occurund occur-edit-mode, aber das erfordert einen Neustart der Suche mit auftreten. Schließlich ag-diredscheint der Dateiname zu stimmen, nicht der Inhalt der Datei.

Mein aktueller Ansatz ist es, eine Grep-Ausgabe zu generieren und dann ein Makro auszuführen, das im Grep-Puffer startet und jede Übereinstimmung aufruft und ändert. Ich würde es vorziehen, die query-replacegefundenen Übereinstimmungen direkt zu verwenden .

Was ich möchte , ist zu tun , entweder , um schnell einen dired Puffer aus bestehenden grep Ausgabe zu bauen , damit ich die entsprechenden Dateien markiert und Call - Abfrage-regexp auf sie, oder verwandelt grep Ausgabe in eine Liste von Puffern für multi-occurso dass ich verwenden kann , occur-edit-modeum Bearbeiten Sie es an Ort und Stelle und führen Sie es query-replacein diesem Puffer aus.

Existiert diese Funktionalität oder gibt es einen anderen Workflow, der dieses Problem löst?

dgtized
quelle

Antworten:

28

@Malabarba erwähnte die Verwendung von wgreppackage zur Bearbeitung von grep / ack / ag-Ergebnissen.

Ich möchte eine detaillierte Einführung in die Verwendung des agPakets und der wgrep-agPakete schreiben , um die Bearbeitung von Ergebnissen zu erreichen, die mit dem multiple-cursorsPaket erzielt wurden .

Diese Pakete sind über Melpa erhältlich. Sie müssen auch agaka 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 agauf Ihrem System und den oben genannten Emacs-Paketen.

  • agunterstützt das Durchsuchen von Dateien mit Inhalten, die Ihrem angegebenen regulären Ausdruck entsprechen. Die einfachste Möglichkeit, festzustellen, agwo sich der Projektstamm befindet, besteht darin, dort einen leeren .gitOrdner 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-modeverwenden Sie die wgrepStandardbindung 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-editdie Standardbindung ausführen oder verwenden C-c C-e. Sie können query-replace-regexpdiese Suche auch verwenden , um zu ersetzen.

  • Ich bevorzuge die multiple-cursorsschnelle 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-thisund 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-edie Ä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-mapto bind-to-my-mapin my ~/.emacs.d/.

Wenn ich bind-to-modi-mapin meinem Emacs-Installationsordner nach suche, erhalte ich das folgende Ergebnis:ag ergebnisse, unverändert

Dieser Puffer ist schreibgeschützt.

Nachdem M-x wgrep-change-to-wgrep-modeich -modi-mapalle Instanzen dieser Auswahl mit M-x mc/mark-all-like-thisund nach dem Bearbeiten dieser Auswahl mit ausgewählt habe -my-map, sieht es wie folgt aus: ag-Ergebnisse, die mit mehreren Cursorn modifiziert wurden

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-eSie die Änderung in der aktuellen Datei in diesem Screenshot: ag Ergebnisse nach Abschluss der Bearbeitungen

Ich würde dann alle geänderten Dateien mit speichern C-x s !.

Kaushal Modi
quelle
Dies ist wirklich der beste Weg, um Zeichenfolgen zu ersetzen. Eingeschlossen in ein Projekt, ohne Rücksicht auf Ag-Exclude, einfach zu stapeln und dennoch in der Lage zu sein, zu überprüfen, ob Sie das richtige Ding ersetzen.
PascalVKooten
13

Was ich tun möchte, ist, entweder schnell einen dired-Puffer aus der vorhandenen [...] grep-Ausgabe zu erstellen oder die grep-Ausgabe in eine Liste von Puffern für Mehrfachvorkommnisse [...] umzuwandeln.

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).

  1. Installieren Sie das wgrep- Paket von Melpa.
  2. (require 'wgrep) in Ihrer Init-Datei.
  3. Nachdem Sie eine Grep-Suche durchgeführt haben, drücken Sie C-c C-pund bearbeiten Sie sie!
  4. Speichern Sie Ihre Änderungen mit C-c C-e

Es funktioniert sogar mit ack und ag.

Malabarba
quelle
2
Das ist was ich mache (mit ag.el). Zusammen mit Magnars Multicursor-Bearbeitung sind einfache Refactorings wirklich einfach.
Tom Regner
4

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 und tags-query-replacedie Abfrage zu ersetzen.

Shosti
quelle
Das hat die gleichen Probleme wie find-grep-dired. Es wird nicht die vorhandene grep-Ausgabe verwendet. Es gibt ähnliche Probleme mit Projektil-Multi-Vorkommen. Ich würde es vorziehen, die Abfrage zu ersetzen, nachdem ich mir die Trefferliste angesehen habe, und die Methode der zugrunde liegenden Suche nicht zu ändern. Es ist jedoch ein alternativer Workflow.
24.
Was Sie beschreiben, hört sich so an, als ob es leicht zu bewerkstelligen wäre, indem Sie ein sehr schnelles Makro erstellen, um den Text zu ersetzen und wiederholt aufzurufen M-g n C-x e(dh indem Sie next-errordurch die Vorkommen scrollen).
Shosti
1

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 ist icicle-compilation-search. Auf diese Weise können Sie schnell grepin 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 .

Drew
quelle
0

Ich benutze dieses Dienstprogramm, das ich xah_find.el schrieb

Ich habe es geschrieben, weil:

  • Pures Elisp. Machen Sie sich keine Gedanken mehr über die Windows- oder Unicode-Übertragung zwischen Emacs und dem Betriebssystem. emacs grep problem
  • Wenn Sie ein schwerer Unicode-Benutzer sind, haben die Unix-Tools einige Semi-Bugs. Linux Uniq Problem
  • Ich finde / ersetze jede Woche auf 5k Akten. Ich habe jahrelang dired-do-query-replace-regexp verwendet. Ich finde, dass die interaktive Natur meine Zeit wirklich verkürzt hat, aber ich muss die Ergebnisse der Änderungen überprüfen. Also, meine Lösung wird jetzt Batch ausgeführt, aber ich habe einen netten Bericht, mit dem ich überhaupt Ergebnisse suchen / ersetzen kann, mit der Option, in eine Datei zu schreiben.

Dieses elisp util ist vielleicht 5- bis 10-mal langsamer als das Aufrufen von Unix grep in Emacs, hat aber bei mir funktioniert.

Xah Lee
quelle