Można to zrobić na kilka sposobów.
Wewnątrz bieżącego katalogu
Jeśli chcesz przeprowadzić wyszukiwanie / zamianę w drzewie projektu, możesz użyć listy argumentów Vima .
Po prostu otwórz Vima, a następnie użyj :args
polecenia, aby wypełnić listę argumentów. Możesz przekazać wiele nazw plików, a nawet globów.
Na przykład :args **/*.rb
będzie rekurencyjnie przeszukiwał bieżący katalog w poszukiwaniu plików ruby. Zauważ, że jest to również otwarcie Vima za pomocą vim **/*.rb
. Możesz nawet użyć polecenia powłoki, find
aby uzyskać listę wszystkich plików w bieżącym katalogu, uruchamiając:
:args `find . -type f`
Możesz wyświetlić bieżącą listę argumentów, uruchamiając :args
się samodzielnie. Jeśli chcesz dodać lub usunąć pliki z listy, można użyć :argadd
albo z :argdelete
polecenia odpowiednio.
Gdy jesteś zadowolony z listy, możesz teraz użyć potężnego :argdo
polecenia Vima, które uruchamia polecenie dla każdego pliku na liście argumentów::argdo %s/search/replace/g
Oto kilka wskazówek dotyczących wyszukiwania (na podstawie niektórych komentarzy):
- Użyj granicy słowa, jeśli chcesz wyszukać „foo”, ale nie „foo_bar”. Użyj konstrukcji
\<
i \>
wokół wzorca wyszukiwania w następujący sposób::argdo %s/\<search\>/foobar/g
- Użyj
/c
flagi wyszukiwania, jeśli chcesz, aby Vim poprosił o potwierdzenie przed zamianą wyszukiwanego hasła.
- Użyj
/e
flagi wyszukiwania, jeśli chcesz pominąć błędy „wzorzec nie znaleziony”.
- Można również zdecydować się na zapisanie pliku po wykonaniu wyszukiwania:
:argdo %s/search/replace/g | update
. Tutaj :update
jest używany, ponieważ zapisze plik tylko, jeśli został zmieniony.
Otwórz bufory
Jeśli masz już otwarte bufory, które chcesz przeszukać / zamienić, możesz użyć :bufdo
, który uruchamia polecenie dla każdego pliku na liście buforów ( :ls
).
Polecenie jest bardzo podobne do :argdo
: :bufdo %s/search/replace/g
Podobnie jak :argdo
i :bufdo
istnieje :windo
i :tabdo
działa odpowiednio na okna i karty. Są rzadziej używane, ale nadal warto je znać.
/c
flagi do potwierdzenia zamiany.\<
i\>
ichsearch
unikanie, aby uniknąć częściowej zamiany słów.:cd %:p:h
. Inne opcje katalogu roboczego są wymienione w vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Powiedzmy, że mamy prostą strukturę projektu:
pozdrowienia.txt wygląda
i wygląda na info / age.txt
Powiedzmy, że chcemy zastąpić wszystkie wystąpienia Sama Bobem. Oto, co byśmy zrobili:
Ustaw katalog roboczy
Upewnij się, że bieżący katalog roboczy Vima jest katalogiem głównym projektu (nie pokażę ci, jak to zrobić tutaj).
Znajdź pliki zawierające „Sam”
Użyj komendy vimgrep Vima, aby wyszukać wszystkie wystąpienia Sama w projekcie (uwaga:
**/*
rekursywnie wyszukiwania we wszystkich plikach)Spowoduje to zapełnienie listy poprawek wszystkimi instancjami Sama. Jeśli chcesz wyświetlić listę poprawek, możesz użyć polecenia Vim
:copen
Zastępuj we wszystkich plikach zawierających „Sam”
Teraz chcemy uruchomić polecenie zastępcze Vima w każdym pliku na liście szybkich poprawek. Możemy to zrobić za pomocą
:cfdo {cmd}
polecenia, które wykonuje {cmd} w każdym pliku na liście szybkich poprawek. Specyficzny {cmd} Chcemy wykorzystać tosubstitute
albos
za krótki. Pełna linia wyglądałaby następująco:Możesz dodać flagę c, aby potwierdzić wszystkie zamiany, jeśli chcesz:
Zapisz wszystkie pliki
źródło
cfdo %s/Sam/Bob/g | update
hidden
opcji,:set hidden
jeśli jeszcze tego nie zrobiłeś.Chociaż nie jest to rozwiązanie VIM, jeśli używasz VI / VIM, łatwiejsze może być użycie rozwiązania CLI. Aby zmienić wszystkie pliki w bieżącym katalogu, użyj tego,
perl
co zostało zrobione dla takich sytuacji:Jeśli musisz to zrobić również w podkatalogach, zwykle łączę się
perl
zfind
:Zaletą tego jest to, że możesz łatwo zawęzić listę do określonych typów plików. Na przykład, aby ograniczyć się do plików python:
źródło
Aby zamienić frazę na inną, możesz użyć trybu Vim Ex.
Na przykład (
ex
jest alias dovim -E
):Rekurencyjnie w bash / zsh (z
globstar
zestawem, np.shopt -s globstar
):Rekurencyjnie (używając
find
i ignoruj ukryte pliki, takie jak.git
pliki):Uwaga:
:bufdo
Polecenie to nie POSIX .Uwaga: Składnia
-not -path '*/\.*'
służy do ignorowania ukrytych plików (takich jak.git
).źródło
Oto polecenie powłoki przy użyciu
find
iex
edytora (bez użycia:bufdo
):Będzie to edycja na miejscu wszystkie
*.rb
pliki w bieżącym katalogu (rekurencyjnie) i wymienićfoo
zbar
.źródło