Wie kann ich eine bestimmte Zeichenfolge im gesamten Projekt mit Emacs suchen und ersetzen?
- Vorbereitung: Puffer und Projekt öffnen
- Einfaches projektweites Suchen mit grep/rg/ag
- Projektweites Ersetzen: grep + query-replace oder dired-marks
- Automatisches projektweites Ersetzen: xargs + shell oder find + sed
- Verwendung von replace-regexp in dired oder mit multi-occur
- Versionskontrolle und Rückgängig
- Tipps zur Sicherheit
Vorbereitung: Puffer und Projekt öffnen
Stellen Sie sicher, dass Ihr Projekt in Emacs geöffnet ist und die relevanten Dateien in einem Projektbaum oder VCS-Repository liegen. Viele Anwender nutzen Projectile oder Built-in Emacs-Project (project) zur Projektverwaltung; das ist nicht zwingend, macht aber die Auswahl der Dateien einfacher. Speichern Sie wichtige Änderungen oder arbeiten Sie in einem Branch, falls Sie Rückgängig machen oder vergleichen möchten.
Einfaches projektweites Suchen mit grep/rg/ag
Emacs kann externe Werkzeuge wie grep, ripgrep (rg) oder the_silver_searcher (ag) verwenden. Mit C-u M-x grep oder M-x rgrep können Sie ein Suchmuster und ein Dateimuster angeben; ripgrep ist schneller und liefert bessere Ergebnisse, wenn installiert. Beispiel: M-x rgrep RET meineZeichenfolge RET *.py RET ./ RET. Die Treffer erscheinen in einem *grep*-Buffer; mit F4(compile next) oder C-c C-c in manchen *grep*-Buffern springen Sie zur Datei, bearbeiten und speichern dort.
Projektweites Ersetzen: grep + query-replace oder dired-marks
Ein bewährter Ablauf ist: zuerst Treffer mit rgrep ermitteln, dann die betroffenen Dateien nacheinander bearbeiten. Aus dem *grep*-Buffer springen Sie zur ersten Datei, führen dort M-% (query-replace) oder M-x query-replace-regexp aus, prüfen jede Ersetzung manuell und speichern. Alternativ können Sie im *grep*-Buffer alle Fundstellen markieren und M-x wgrep-change-to-wgrep-mode nutzen (erfordert wgrep-Package). In wgrep können Sie direkt im Ergebnisbuffer die Ersetzungen vornehmen; anschließend C-c C-c übernimmt die Änderungen zurück in die Dateien.
Automatisches projektweites Ersetzen: xargs + shell oder find + sed
Wenn Sie sehr sicher sind und viele Dateien gleichzeitig ersetzen wollen, können Sie auch externe Befehle aus Emacs heraus nutzen: M-! (shell-command) mit einem Befehl wie rg -l "alte" | xargs sed -i "s/alte/neue/g" – Vorsicht: keine Rückfrage, Risiko von unerwünschten Änderungen. Testen Sie vorher mit rg -n oder sed ohne -i.
Verwendung von replace-regexp in dired oder mit multi-occur
Dired bietet M-x dired-do-query-replace-regexp für markierte Dateien. Markieren Sie Dateien mit m, dann Q (oder M-x dired-do-query-replace-regexp) und geben reguläre Ausdrücke für Suche und Ersetzung ein. Für geöffnete Puffer können Sie M-x multi-occur-in-matching-buffers benutzen, Treffer prüfen und dann manuell ersetzen.
Versionskontrolle und Rückgängig
Nutzen Sie Versionskontrolle (git). Vor großen Ersetzungen empfiehlt sich ein Commit oder ein temporärer Branch. Nach Änderungen können Sie git diff prüfen und bei Bedarf mit git checkout --
Tipps zur Sicherheit
Testen Sie Suchmuster mit grep/ripgrep zuerst. Verwenden Sie reguläre Ausdrücke vorsichtig und quote/escape Metazeichen. Für komplexe Refactorings sind Sprache-spezifische Tools (ctags, LSP-Refactorings, grep -P, tree-sitter-based tools) oft sicherer als blindes Textersetzen.
