Ada beberapa cara untuk melakukan ini.
Di dalam Direktori Saat Ini
Jika Anda ingin melakukan pencarian / ganti di pohon proyek, Anda dapat menggunakan daftar argumen Vim .
Cukup buka Vim dan kemudian gunakan :args
perintah untuk mengisi daftar argumen. Anda dapat memasukkan beberapa nama file atau bahkan gumpalan.
Sebagai contoh, :args **/*.rb
secara rekursif akan mencari direktori file ruby saat ini. Perhatikan bahwa ini juga seperti membuka Vim dengan vim **/*.rb
. Anda bahkan dapat menggunakan perintah shell find
untuk mendapatkan daftar semua file di direktori saat ini dengan menjalankan:
:args `find . -type f`
Anda dapat melihat daftar args saat ini dengan menjalankannya :args
sendiri. Jika Anda ingin menambah atau menghapus file dari daftar, Anda dapat menggunakan perintah :argadd
atau :argdelete
masing-masing.
Setelah Anda puas dengan daftar tersebut, sekarang Anda dapat menggunakan :argdo
perintah Vim yang kuat yang menjalankan perintah untuk setiap file dalam daftar argumen::argdo %s/search/replace/g
Berikut ini beberapa kiat untuk mencari (berdasarkan beberapa komentar):
- Gunakan batas kata jika Anda ingin mencari "foo" tetapi bukan "foo_bar". Gunakan
\<
dan \>
susun di sekitar pola pencarian seperti::argdo %s/\<search\>/foobar/g
- Gunakan
/c
bendera pencarian jika Anda ingin Vim meminta konfirmasi sebelum mengganti istilah pencarian.
- Gunakan
/e
bendera pencarian jika Anda ingin melewati kesalahan "pola tidak ditemukan".
- Anda juga dapat memilih untuk menyimpan file setelah melakukan pencarian:
:argdo %s/search/replace/g | update
. Di sini, :update
digunakan karena hanya akan menyimpan file jika sudah berubah.
Buka buffer
Jika Anda sudah memiliki buffer terbuka yang ingin Anda lakukan pencarian / ganti, Anda dapat menggunakan :bufdo
, yang menjalankan perintah untuk setiap file dalam daftar buffer Anda ( :ls
).
Perintahnya sangat mirip dengan :argdo
: :bufdo %s/search/replace/g
Mirip dengan :argdo
dan :bufdo
, ada :windo
dan :tabdo
yang bertindak masing-masing pada windows dan tab. Mereka lebih jarang digunakan tetapi masih berguna untuk diketahui.
/c
bendera untuk mengkonfirmasi penggantian.\<
dan\>
sekitarsearch
untuk menghindari penggantian kata parsial.:cd %:p:h
. Opsi direktori kerja lainnya tercantum di vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Katakanlah kita memiliki struktur proyek sederhana seperti ini:
greeting.txt terlihat seperti
dan info / age.txt terlihat seperti
Katakanlah kita ingin mengganti semua kejadian Sam dengan Bob. Inilah yang akan kami lakukan:
Atur direktori kerja
Pastikan direktori kerja Vim saat ini adalah root dari proyek (tidak akan menunjukkan kepada Anda bagaimana melakukan ini di sini).
Temukan file yang mengandung 'Sam'
Gunakan perintah vimgrep Vim untuk mencari semua kejadian Sam dalam proyek (catatan:
**/*
pencarian di semua file secara rekursif)Ini akan mengisi daftar perbaikan cepat dengan semua instance Sam. Jika Anda ingin melihat daftar perbaikan cepat, Anda dapat menggunakan perintah Vim
:copen
Pengganti dalam semua file yang mengandung 'Sam'
Sekarang kami ingin menjalankan perintah pengganti Vim di dalam setiap file dalam daftar perbaikan cepat. Kita dapat melakukan ini menggunakan
:cfdo {cmd}
perintah yang mengeksekusi {cmd} di setiap file dalam daftar perbaikan cepat. {Cmd} spesifik yang ingin kita gunakan adalahsubstitute
ataus
singkatnya. Baris penuh akan terlihat seperti:Anda dapat menambahkan tanda c untuk mengonfirmasi semua penggantian jika Anda suka:
Simpan semua file
sumber
cfdo %s/Sam/Bob/g | update
memperbaikinya untuk sayahidden
opsi dengan:set hidden
jika Anda belum melakukannya.Meskipun bukan solusi VIM, jika Anda menggunakan VI / VIM Anda mungkin merasa lebih mudah untuk menggunakan solusi CLI. Untuk mengubah semua file di direktori saat ini, gunakan
perl
seperti yang dibuat untuk situasi seperti ini:Jika Anda perlu melakukannya di subdirektori juga, saya biasanya memasangkan
perl
denganfind
:Yang menyenangkan tentang ini adalah Anda dapat dengan mudah memperbaiki daftar ke tipe file tertentu. Misalnya, untuk membatasi ke file python:
sumber
Untuk mengganti frase dengan yang lain, Anda dapat menggunakan mode Vim Ex.
Misalnya (
ex
alias untukvim -E
):Secara rekursif dalam bash / zsh (dengan
globstar
set, misalnyashopt -s globstar
):Secara rekursif (menggunakan
find
dan mengabaikan file tersembunyi seperti.git
file):Catatan:
:bufdo
Perintah ini bukan POSIX .Catatan: Sintaks
-not -path '*/\.*'
digunakan untuk mengabaikan file tersembunyi (seperti.git
).sumber
Berikut adalah perintah shell using
find
danex
editor (tanpa menggunakan:bufdo
):Ini akan mengedit semua
*.rb
file di dalam folder saat ini (secara rekursif) dan menggantinyafoo
denganbar
.sumber