Hierfür gibt es verschiedene Möglichkeiten.
Im aktuellen Verzeichnis
Wenn Sie das Suchen / Ersetzen in einem Projektbaum ausführen möchten, können Sie die Argumentliste von Vim verwenden .
Öffnen Sie einfach Vim und :args
füllen Sie die Argumentliste mit dem Befehl aus. Sie können mehrere Dateinamen oder sogar Globs übergeben.
:args **/*.rb
Sucht beispielsweise rekursiv im aktuellen Verzeichnis nach Ruby-Dateien. Beachten Sie, dass dies auch wie das Öffnen von Vim mit ist vim **/*.rb
. Sie können sogar den find
Befehl der Shell verwenden , um eine Liste aller Dateien im aktuellen Verzeichnis abzurufen, indem Sie Folgendes ausführen:
:args `find . -type f`
Sie können die aktuelle Argumentliste anzeigen, :args
indem Sie sie selbst ausführen . Wenn Sie Dateien zur Liste hinzufügen oder daraus löschen möchten, können Sie :argadd
den :argdelete
Befehl oder verwenden.
Wenn Sie mit der Liste zufrieden sind, können Sie jetzt den leistungsstarken :argdo
Befehl von Vim verwenden, der für jede Datei in der Argumentliste einen Befehl ausführt::argdo %s/search/replace/g
Hier sind einige Tipps für die Suche (basierend auf einigen Kommentaren):
- Verwenden Sie eine Wortgrenze, wenn Sie nach "foo", aber nicht nach "foo_bar" suchen möchten. Verwenden Sie die
\<
und \>
-Konstrukte um das Suchmuster wie folgt::argdo %s/\<search\>/foobar/g
- Verwenden Sie ein
/c
Suchflag, wenn Vim vor dem Ersetzen eines Suchbegriffs eine Bestätigung anfordern soll.
- Verwenden Sie ein
/e
Suchflag, wenn Sie die Fehler "Muster nicht gefunden" überspringen möchten.
- Sie können auch die Datei speichern nach der Durchführung der Suche wählen:
:argdo %s/search/replace/g | update
. Hier :update
wird verwendet, weil die Datei nur gespeichert wird, wenn sie geändert wurde.
Puffer öffnen
Wenn Sie bereits Puffer geöffnet haben, für die Sie suchen / ersetzen möchten, können Sie verwenden :bufdo
, dass für jede Datei in Ihrer Pufferliste ein Befehl ausgeführt wird ( :ls
).
Der Befehl ist sehr ähnlich zu :argdo
: :bufdo %s/search/replace/g
Ähnlich wie :argdo
und :bufdo
gibt es :windo
und :tabdo
wirkt sich auf Fenster bzw. Registerkarten aus. Sie werden seltener verwendet, sind aber dennoch nützlich zu wissen.
/c
Flag zur Bestätigung von Substitutionen zu verwenden.\<
und\>
um diesearch
Teilwort - Ersatz zu vermeiden.:cd %:p:h
. Weitere Optionen für das Arbeitsverzeichnis finden Sie in vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Nehmen wir an, wir haben eine einfache Projektstruktur wie diese:
gruss.txt sieht aus wie
und info / age.txt sieht aus wie
Angenommen, wir möchten alle Vorkommen von Sam durch Bob ersetzen. Folgendes würden wir tun:
Arbeitsverzeichnis festlegen
Stellen Sie sicher, dass das aktuelle Arbeitsverzeichnis von Vim das Stammverzeichnis des Projekts ist (hier erfahren Sie nicht, wie Sie dies tun).
Dateien suchen, die 'Sam' enthalten
Verwenden Sie den Befehl vimgrep von Vim, um nach allen Vorkommen von Sam im Projekt zu suchen (Hinweis: Die
**/*
Suche in allen Dateien erfolgt rekursiv).Dadurch wird die Quickfix-Liste mit allen Instanzen von Sam gefüllt. Wenn Sie die Quickfix-Liste anzeigen möchten, können Sie den Befehl Vim verwenden
:copen
Ersetzen Sie in allen Dateien, die "Sam" enthalten
Jetzt wollen wir Vims Ersatzbefehl in jeder Datei in der Quickfix-Liste ausführen. Wir können dies mit dem
:cfdo {cmd}
Befehl tun, der in jeder Datei in der Quickfix-Liste {cmd} ausführt. Das spezifische {cmd}, das wir verwenden möchten, istsubstitute
oders
kurz. Die vollständige Zeile würde folgendermaßen aussehen:Sie können das c-Flag hinzufügen, um alle Ersetzungen zu bestätigen, wenn Sie möchten:
Speichern Sie alle Dateien
quelle
cfdo %s/Sam/Bob/g | update
was für michhidden
Option mit festzulegen,:set hidden
wenn Sie dies noch nicht getan haben.Obwohl dies keine VIM-Lösung ist, ist es für Sie unter Umständen einfacher, eine CLI-Lösung zu verwenden, wenn Sie VI / VIM verwenden. Um alle Dateien im aktuellen Verzeichnis zu ändern, verwenden
perl
Sie die folgenden Einstellungen:Wenn Sie es auch in Unterverzeichnissen tun müssen, paare ich normalerweise
perl
mitfind
:Das Schöne daran ist, dass Sie die Liste problemlos auf bestimmte Dateitypen verfeinern können. So beschränken Sie sich beispielsweise auf Python-Dateien:
quelle
Um eine Phrase durch eine andere zu ersetzen, können Sie den Vim Ex-Modus verwenden.
Zum Beispiel (
ex
ist ein Alias fürvim -E
):Rekursiv in bash / zsh (mit
globstar
set, zBshopt -s globstar
):Rekursiv (Verwenden
find
und Ignorieren von versteckten Dateien wie.git
Dateien):Hinweis: Der
:bufdo
Befehl ist nicht POSIX .Hinweis: Mit der Syntax
-not -path '*/\.*'
werden versteckte Dateien (z. B..git
) ignoriert .quelle
Hier ist der Shell-Befehl using
find
undex
editor (ohne using:bufdo
):Dies wird bearbeiten in-legen Sie alle
*.rb
Dateien im aktuellen Ordner (rekursiv) und ersetzenfoo
mitbar
.quelle