Im Anschluss an diese Frage wird versucht herauszufinden, wie so etwas zu tun ist, was einfach sein sollte. Dies hindert mich insbesondere daran, mich mehr an die Verwendung von Emacs zu gewöhnen und stattdessen den Editor zu starten, mit dem ich bereits vertraut bin. Ich verwende das Beispiel hier ziemlich oft beim Bearbeiten mehrerer Dateien.
In Ultraedit würde ich Alt + s und dann p drücken, um ein Dialogfeld mit den folgenden Optionen anzuzeigen: Suchen (einschließlich der Verwendung regulärer Ausdrücke über mehrere Zeilen hinweg), Ersetzen durch, In Dateien / Typen, Verzeichnis, Übereinstimmungsfall, Nur ganzes Wort abgleichen, Liste Geänderte Dateien und Unterverzeichnisse durchsuchen. Normalerweise benutze ich zuerst die Maus, um per Mausklick den Text auszuwählen, den ich ersetzen möchte.
Verwenden Sie nur Emacs selbst (unter Windows XP), ohne ein externes Dienstprogramm aufzurufen. So ersetzen Sie alle foo \ nbar durch bar \ nbaz in *.c
und *.h
Dateien in einem Ordner und allen darunter liegenden Ordnern. Vielleicht ist Emacs nicht das beste Werkzeug, um dies zu tun, aber wie kann es einfach mit einem minimalen Befehl gemacht werden?
C-x s !
um alle Dateien auf einmal zu speichern.M-,
um die Suche und das Ersetzen fortzusetzen (z. B. nach der Eingabeaufforderung "Datei zurücksetzen", wenn die Datei auf der Festplatte geändert wurde).M-x find-name-dired RET
M->
), bis "find finished
" angezeigt wird, um sicherzustellen, dass alle geladen wurdent
auf „Toggle - Marke“ für alle Dateien gefundenQ
für "Query-Ersetzen in Dateien ...": Sie werden für die Abfrage / Substitution regexps gefragt.y
zum Ersetzen und Verschieben zum nächsten Spiel, n zum Überspringen eines Spiels usw.N
überspringen Sie alle möglichen Ersetzungen für den Rest der aktuellen Datei. (N
ist nur Emacs 23+)Y
.C-x C-b
falls an ibuffer gebunden oderM-x ibuffer RET
), um alle geöffneten Dateien aufzulisten .* u
, um alle nicht gespeicherten Dateien zu markieren. Geben Sie ein,S
um alle markierten Dateien zu speichern* * RET
um alle Markierungen aufzuheben, oder geben Sie einD
, um alle markierten Dateien zu schließenDiese Antwort wird aus dieser Antwort , von dieser Site und aus meinen eigenen Notizen kombiniert . Verwenden von Emacs 23+.
quelle
ibuffer
ist nichtC-x C-b
standardmäßig gebunden .C-x C-b
zu bindenibuffer
, weil es so viel besser ist als die Standardbindung. Fügen Sie einfach(global-set-key (kbd "C-x C-b") 'ibuffer)
in Ihre .emacs - Datei. Andernfalls verwenden SieM-x ibuffer RET
die obigen Anweisungen.bla-bla-bla
wird schreibgeschützt besucht und die Suche wird beendet. Wie kann man das vermeiden / ignorieren und weiter ersetzen? Vielen Dank.ibuffer
wenn SieC-x s
(save-some-buffers
) und tippen können!
? Ich will nicht schimpfen, nur neugierig. PS Plus für die Beschreibung!
,N
undY
.Die Antworten sind großartig, aber ich dachte, ich würde einen etwas anderen Ansatz hinzufügen.
Es ist ein interaktives Verfahren und erfordert
wgrep
,rgrep
undiedit
. Beideiedit
undwgrep
müssen über MELPA oder Marmelade installiert werden (mitM-x package-list-packages
)Führen
M-x rgrep
Sie zuerst die Zeichenfolge aus, nach der Sie suchen.Sie können Dateitypen / Muster und den zu rekursierenden Ordner angeben.
Als nächstes müssen Sie es
wgrep
startenC-s C-p
.Mit Wgrep können Sie die
rgrep
Ergebnisse bearbeiten. Legen Sie daher einen Bereich in der Zeichenfolge fest, der übereinstimmt undiedit-mode
mitC-;
dem Sie beginnen (abhängig von Ihrem Terminal müssen Sie diesen möglicherweise erneut binden).Alle Vorkommen können sofort bearbeitet werden.
C-x C-s
begehenwgrep
. DannC-x s !
die geänderten Dateien zu speichern.Der Hauptvorteil dieser Methode besteht darin, dass Sie
iedit-mode
bestimmte Übereinstimmungen deaktivieren könnenM-;
. Sie können die Ergebnisse auch verwenden,rgrep
um in die Dateien zu springen, z. B. wenn Sie eine unerwartete Übereinstimmung haben.Ich finde es sehr nützlich, um Quellbearbeitungen durchzuführen und Symbole (Variablen, Funktionsnamen usw.) in einem Projekt umzubenennen.
Wenn Sie den iedit-Modus noch nicht kennen / verwenden, ist er ein sehr praktisches Tool. Ich empfehle Ihnen dringend, ihn sich anzusehen.
quelle
wgrep
istC-c C-p
übrigens.Projectile ist wirklich nett: Cc pr führt den Befehl projectile-replace aus
quelle
Ich verwende im Allgemeinen andere Tools, um diese Aufgabe auszuführen, und es scheint, als ob viele der Ansätze, die in EmacsWikis Eintrags- Shell zum Suchen und Ersetzen über Dateien hinweg erwähnt wurden, herauskommen, aber das Findr-Paket sieht sehr vielversprechend aus.
Teil der Quelldatei stehlen :
quelle
Informationsquelle: 1
Für Benutzer von emacs pro:
Schritt-für-Schritt-Anleitung für Emacs-Anfänger
Wählen Sie Zieldateien
Starten Sie emacs, indem Sie in der Eingabeaufforderung der Befehlszeilenschnittstelle "emacs" eingeben. (Oder doppelklicken Sie auf das Emacs-Symbol, wenn Sie sich in einer Grafikbenutzeroberfläche befinden.)
Dateien in einem Verzeichnis auswählen
Zuerst müssen Sie die Dateien auswählen, die Sie ersetzen möchten. Verwenden Sie das grafische Menü 〖Datei ▸ Verzeichnis öffnen〗. Emacs fragt Sie nach einem Verzeichnispfad. Geben Sie den Verzeichnispfad ein und drücken Sie die Eingabetaste.
Jetzt wird Ihnen die Liste der Dateien angezeigt, und jetzt müssen Sie die Dateien markieren, an denen das Regex-Suchen / Ersetzen arbeiten soll. Sie markieren eine Datei, indem Sie den Cursor auf die gewünschte Datei bewegen und dann m drücken. Heben Sie die Markierung auf, indem Sie u drücken. (Um Unterverzeichnisse aufzulisten, bewegen Sie den Cursor in das Verzeichnis und drücken Sie i. Der Inhalt des Unterverzeichnisses wird unten aufgelistet.) Um alle Dateien mit einem regulären Ausdruck zu markieren, geben Sie 【% m】 ein und geben Sie dann Ihr reguläres Verzeichnis ein. Wenn Sie beispielsweise alle HTML-Dateien markieren möchten, geben Sie 【% m】 und dann .html $ ein. (Eine Liste der Markierungsbefehle finden Sie im grafischen Menü „Markieren“ (dieses Menü wird angezeigt, wenn Sie sich im Dired-Modus befinden).)
Auswählen von Dateien in einem Verzeichnis und allen seinen Unterverzeichnissen
Wenn Sie Dateien in einem Verzeichnis suchen / ersetzen möchten, einschließlich Hunderten von Unterverzeichnissen, finden Sie hier eine Methode zum Auswählen aller dieser Dateien.
Rufen Sie find-dired an. (Sie rufen einen Befehl auf, indem Sie 【Alt + x】 drücken.) Geben Sie dann den Verzeichnisnamen ⁖ / Users / mary / myfiles ein
Hinweis: Wenn Sie Emacs auf einem nicht grafischen Unix-Textterminal verwenden und 【Alt + x】 nicht funktioniert, lautet der entsprechende Tastendruck 【Esc x】.
Emacs fragt Sie mit der Aufforderung "Find ausführen (mit Argumenten):". Wenn Sie alle HTML-Dateien ersetzen müssen, geben Sie -name "* html" ein. Wenn Sie sich nicht für die Art der Datei interessieren, sondern nur für alle Dateien unter diesem Verzeichnis, geben Sie "-type f" ein.
Markieren Sie nun die Dateien wie oben beschrieben.
Interaktives Suchen / Ersetzen
Jetzt können Sie die interaktive Suche ersetzen. Nehmen wir zur Vereinfachung an, Sie möchten nur das Wort "schnell" durch "super" ersetzen. Rufen Sie jetzt dired-do-query-replace-regexp auf. Sie werden aufgefordert, die Regex-Zeichenfolge und die Ersatzzeichenfolge einzugeben. Geben Sie "quick" ein, geben Sie "super" ein.
Jetzt verwendet Emacs Ihr Muster und überprüft die Dateien und stoppt und zeigt Ihnen, wann immer eine Übereinstimmung aufgetreten ist. In diesem Fall werden Sie von emacs aufgefordert, die Änderung vorzunehmen oder die Änderung zu überspringen. Geben Sie y ein, um die Änderung vorzunehmen. Geben Sie zum Überspringen n ein. Wenn Sie einfach möchten, dass Emacs alle derartigen Änderungen an der aktuellen Datei vornehmen, geben Sie! Ein.
Wenn Sie den gesamten Vorgang abbrechen möchten, ohne die von Ihnen vorgenommenen Änderungen zu speichern, geben Sie tr Strg + g】 ein und beenden Sie Emacs über das Menü ▸ Datei ac Emacs beenden〗.
Speichern der geänderten Dateien
Nachdem Sie die obige Prüfung durchlaufen haben, müssen Sie noch einen weiteren Schritt ausführen, nämlich das Speichern der geänderten Dateien.
Wenn Sie Emacs Version 22 oder höher verwenden, rufen Sie ibuffer auf, um in einen Pufferlistenmodus zu wechseln. Geben Sie dann 【* u】 ein, um alle nicht gespeicherten Dateien zu markieren, und geben Sie S ein, um alle zu speichern. (das ist Schicht-s)
Wenn Sie eine Emacs-Version 21 verwenden, können Sie dies tun: Listenpuffer aufrufen, dann den Cursor auf die Datei bewegen, die Sie speichern möchten, und s eingeben. Die Datei wird für eine spätere Speicheraktion markiert. Geben Sie u ein, um die Markierung aufzuheben. Wenn Sie fertig sind, geben Sie x ein, um das Speichern aller zum Speichern markierten Dateien auszuführen. (In Emacs wird die geöffnete Datei als "Puffer" bezeichnet. Ignorieren Sie dort andere Dinge.)
Alternativ zu den oben genannten Optionen können Sie auch Save-Some-Puffer (Strg + xs) aufrufen. Dann zeigt emacs jede nicht gespeicherte Datei an und fragt, ob Sie sie speichern möchten.
Hinweis: Der reguläre Ausdruck von emacs ist nicht der gleiche wie der von Perl oder Python, aber ähnlich. Eine Zusammenfassung und allgemeine Muster finden Sie unter: Emacs Regex.
quelle
Die Verwendung von dired zum Wiederherstellen eines tiefen Verzeichnisbaums wird für diese Aufgabe etwas langsam sein. Sie könnten die Verwendung von Tags-Abfrage-Ersetzen in Betracht ziehen . Dies bedeutet, dass Sie eine Tags-Tabelle erstellen müssen, aber das ist oft trotzdem nützlich und schnell.
quelle
Für offene Puffer mache ich Folgendes:
quelle
M-X Dired
, und t, um alle Dateien zu markieren undQ
Ersatztext in allen abzufragen. Sie können ein Unterverzeichnis erweitern, indem Sie deni
Befehl vor dem Ersetzen der Abfrage verwenden. Die wichtigsten Informationen, die ich hinzufüge, sind, dass wenn Sie dem i-Befehl ein Präfix (control-u) geben, Sie zur Eingabe von arg aufgefordert werden und das Argument -R rekursiv allesubdirs
in dendired
Puffer erweitert. Jetzt können Sie jede Datei in einem gesamten Verzeichnis abfragen und durchsuchen.quelle
Eine andere Möglichkeit ist die Verwendung der Eiszapfensuche . Dies ist eine andere Art der inkrementellen Suche, bei der die Minibuffer-Eingabe für Suchtreffer abgeschlossen wird. Während Sie Ihre aktuelle Eingabe ändern, wird der Satz übereinstimmender Treffer im Puffer aktualisiert
*Completions*
.Sie können eine beliebige Anzahl von Dateien, Puffern oder mit Lesezeichen versehenen Speicherorten durchsuchen, die Sie mithilfe des Minibuffer-Patterns (z. B. Regexp) auswählen können.
Wenn Sie einen Suchtreffer besuchen, können Sie Suchtreffer bei Bedarf entweder den gesamten Treffer oder nur den Teil davon ersetzen , der Ihrer aktuellen Minibuffer-Eingabe entspricht. Ersatz bei Bedarf bedeutet, dass Sie nicht nacheinander nach jedem Suchtreffer gefragt werden. Sie greifen in beliebiger Reihenfolge direkt auf die gewünschten Treffer zu. Dieser Ansatz kann effektiver sein als das Ersetzen von Abfragen, wenn Sie nur eine begrenzte Anzahl von Ersetzungen vornehmen müssen: Sie überspringen die ausführliche
y/n
Eingabeaufforderung.Suche ist über Suche Suchkontexte , die Sie definieren. Sie sind nicht darauf beschränkt, den gesamten Text in den Zieldateien zu durchsuchen (z. B. können Sie Kommentare oder bestimmte Arten von Programmabschnitten überspringen). Ein einfaches Beispiel für einen Suchkontext ist eine Zeile wie in
grep
, aber ein Kontext kann ein beliebiger musterangepasster Textblock sein, den Sie mögen. Normalerweise definieren Sie die Suchkontexte mithilfe eines regulären Ausdrucks, können jedoch stattdessen eine Funktion verwenden. Zusätzlich zur Definition Ihrer eigenen gibt es vordefinierte Icicles-Suchbefehle für verschiedene Arten von Kontexten: Blöcke mit Texteigenschaften oder Überlagerungseigenschaften, Dinge, die auf den Punkt gebracht werden usw.Sie können auch sortieren die Suchtreffer in verschiedenen Sortierungen für einen leichteren Zugang / Navigation.
quelle
find-name-dired
ist OK, aber:find-dired
ist in dieser Hinsicht flexibler, aber es ist auch für die Verwendung allgemeiner Regeln vorgesehen (auch wenn sie beliebig komplex sein können). Und hat natürlichfind
eine eigene, komplexe Sprache.find(-name)-dired
Puffer gesammelt wurden , müssen Sie diese entweder markieren oder die Zeilen derjenigen löschen / weglassen, auf die Sie nicht reagieren möchten.Eine Alternative besteht darin, Dired + -Befehle zu verwenden, die auf (a) die markierten Dateien und (b) alle markierten Dateien (oder alle Dateien, falls keine markiert sind) in den markierten Unterverzeichnissen ... rekursiv gefunden werden . Dies gibt Ihnen sowohl Allgemeingültigkeit als auch einfache Kontrolle über die Dateiauswahl. Diese "hier und unten" -Befehle befinden sich alle im Präfix-
M-+
Modus auf Präfixschlüssel.Zum Beispiel
M-+ Q
ist es dasselbe wieQ
--- query-replace, aber die Zieldateien sind alle diejenigen, die im aktuellen Verzeichnis und in allen markierten Unterverzeichnissen markiert sind, down, down, down ...Ja, eine Alternative zur Verwendung solcher Befehle hier und unten besteht darin , alle Unterverzeichnisse und ihre Unterverzeichnisse rekursiv einzufügen und dann einen Befehl der obersten Ebene wie z
Q
. Oft kann es jedoch zweckmäßig sein, sich nicht mit eingefügten Unterverzeichnissen zu beschäftigen.Und dazu benötigen Sie ohnehin eine schnelle Möglichkeit, alle diese Unterverzeichnisse rekursiv einzufügen . Auch hier kann Dired + helfen.
M-+ M-i
fügt rekursiv alle markierten Unterverzeichnisse und ihre eigenen markierten Unterverzeichnisse ein. Das heißt, es ist wieM-i
(was die markierten Unterverzeichnisse in Dired + einfügt ), aber es wirkt rekursiv auf Unterverzeichnisse.(Alle diese "hier und unten" Dired + -Befehle befinden sich im Menü Multiple > Hier und unten markiert .)
Sie können Dired-Vorgänge auch für eine Emacs- Dateigruppe ausführen. Hierbei handelt es sich um einen gespeicherten Satz von Namen von Dateien, die sich an einer beliebigen Stelle befinden. Wenn Sie Eiszapfen verwenden , können Sie einen Dired-Puffer nur für die Dateien in einer Dateigruppe oder für andere Arten gespeicherter Dateilisten öffnen.
Sie können auch einen beliebigen Dired-Puffer mit einem Lesezeichen versehen , einschließlich eines Puffers, den Sie mit erstellen
find(-name)-dired
. Auf diese Weise können Sie später schnell zu einem solchen Satz (z. B. einem Projektsatz) zurückkehren. Wenn Sie Lesezeichen + verwenden, werden mit einem Lesezeichen für einen Dired-Puffer (a) seinels
Schalter, (b) welche Dateien markiert, (c) welche Unterverzeichnisse eingefügt und (d) welche (Unter-) Verzeichnisse ausgeblendet werden. All dies wird wiederhergestellt, wenn Sie zum Lesezeichen "springen". Mit Lesezeichen + können Sie auch einen ganzen Baum von Dired-Puffern mit einem Lesezeichen versehen. Wenn Sie zum Lesezeichen springen, werden alle Puffer im Baum wiederhergestellt.quelle
Ich möchte ein weiteres großartiges Werkzeug vorschlagen, das noch nicht erwähnt wurde, nämlich Helm .
Es ist ein großartiger Ersatz für viele Standard-Emacs-Vorgänge, die das Abschließen, Suchen usw. umfassen. Insbesondere
helm-find-files
ermöglicht es das Ersetzen von Abfragen (einschließlich regulärer Ausdrücke) in mehreren ausgewählten Dateien.Öffnen Sie einfach
helm-find-files
, markieren Sie die relevanten Dateien mitM-SPC
und verwenden SieF6
oderF7
, um Abfrage ersetzen oder Abfrage ersetzen regulären Ausdruck in den ausgewählten Dateien auszuführen.quelle
helm-find-files
mit regexp statt markierenM-SPC
?Es ist nicht Emacs, aber xxdiff wird mit einem Tool namens xx-rename geliefert, das dies für mehrere Zeichenfolgen gleichzeitig (z. B. Von Von Von Von Von Bis) mit interaktiver Eingabeaufforderung ausführt, Sicherungen aller geänderten Dateien speichert und einen Kurzfilm erstellt Protokoll der mit dem Kontext vorgenommenen Änderungen. Das ist es, was ich normalerweise benutze, wenn ich große / globale Umbenennungen mache.
quelle