Saya mencari cara terbaik untuk melakukan pencarian dan penggantian (dengan konfirmasi) di semua file proyek di Vim. Yang saya maksud dengan "file proyek" adalah file di direktori saat ini, beberapa di antaranya tidak harus dibuka.
Salah satu cara untuk melakukannya adalah dengan membuka semua file di direktori saat ini:
:args ./**
lalu lakukan pencarian dan ganti pada semua file yang terbuka:
:argdo %s/Search/Replace/gce
Namun, ketika saya melakukan ini, penggunaan memori Vim melonjak dari beberapa lusin MB menjadi lebih dari 2 GB, yang tidak berfungsi untuk saya.
Saya juga menginstal plugin EasyGrep , tetapi hampir tidak pernah berfungsi — baik plugin tidak menemukan semua kemunculannya, atau hanya hang sampai saya menekan CtrlC. Sejauh ini cara yang saya sukai untuk menyelesaikan tugas ini adalah ack-grep untuk istilah pencarian, dengan menggunakan jendela perbaikan cepat buka file apa pun yang berisi istilah dan tidak dibuka sebelumnya, dan akhirnya :bufdo %s/Search/Replace/gce
.
Saya sedang mencari plugin yang bagus dan berfungsi yang dapat digunakan untuk ini, atau alternatif perintah / urutan perintah yang akan lebih mudah daripada yang saya gunakan sekarang.
Jawaban:
Greplace bekerja dengan baik untukku.
Ada juga versi siap patogen di github.
sumber
:Gsearch
dan:Gbuffersearch
ada, tetapi ketika saya mengetik:Greplace
saya mendapatkanNot an editor command: Greplace
.:Gsearch [<grep-option(s)>] [[<pattern>] [<filename(s)>]]
jadi Anda bisa melakukan pencarian rekursif menggunakan, misalnya::Gsearch -r pattern dir/
Opsi besar lainnya di sini adalah tidak menggunakan vim:
atau jika Anda memiliki beberapa cara untuk membuat daftar file, mungkin sesuatu seperti ini:
dan seterusnya!
sumber
sed
regex, yang pada dasarnya adalah ekspresi reguler dasar POSIX.2, tetapi tidak persis (ini ada di halaman manual) - mereka membiarkan\n
baris baru cocok, dan beberapa hal serupa lainnya. Oleh karena itu, mereka hampir sama dengangrep
ekspresi reguler.find . -type f | LANG=C xargs sed -i '' 's/SEARCH/REPLACE/g'
EDIT: Gunakan
cfdo
perintah alih-alihcdo
untuk secara signifikan mengurangi jumlah perintah yang akan dijalankan untuk mencapai ini (karenacdo
menjalankan perintah pada setiap elemen saatcfdo
menjalankan perintah pada setiap file)Berkat
cdo
perintah yang baru saja ditambahkan , Anda sekarang dapat melakukan ini dalam dua perintah sederhana menggunakangrep
alat apa pun yang telah Anda instal. Tidak diperlukan plugin tambahan !:(
cdo
menjalankan perintah yang diberikan ke setiap istilah dalam daftar quickfix, yanggrep
diisi oleh perintah Anda .)(Hapus
c
di akhir perintah ke-2 jika Anda ingin mengganti setiap istilah pencarian tanpa mengonfirmasi setiap kali)sumber
:cdo update
untuk menyimpan perubahan di semua file.c
di akhir perintah kedua (cukup gunakang
) untuk membuatnya mencari dan mengganti tanpa meminta konfirmasiupdate
, saya harus:cdo %s/<search term>/<replace term>/g | update
Saya telah memutuskan untuk menggunakan ack dan Perl untuk memecahkan masalah ini untuk memanfaatkan ekspresi reguler Perl yang lebih kuat daripada subset GNU.
Penjelasan
ack
Jack adalah alat baris perintah mengagumkan yang merupakan campuran
grep
,find
dan penuh Perl ekspresi reguler (bukan hanya GNU bagian). Ini ditulis dalam Perl murni, cepat, memiliki penyorotan sintaks, bekerja pada Windows dan lebih ramah bagi pemrogram daripada alat baris perintah tradisional. Instal di Ubuntu dengansudo apt-get install ack-grep
.xargs
Xargs adalah alat baris perintah unix lama. Itu membaca item dari input standar dan menjalankan perintah yang ditentukan diikuti dengan item yang dibaca untuk input standar. Jadi pada dasarnya daftar file yang dihasilkan oleh ack akan ditambahkan ke akhir
perl -pi -E 's/pattern/replacemnt/g'
perintah.perl -pi
Perl adalah bahasa pemrograman. Opsi -p menyebabkan Perl membuat loop di sekitar program Anda yang mengiterasi argumen nama file. Opsi -i menyebabkan Perl mengedit file di tempatnya. Anda dapat memodifikasi ini untuk membuat cadangan. Opsi -E menyebabkan Perl untuk mengeksekusi satu baris kode yang ditentukan sebagai program. Dalam kasus kami, program ini hanyalah substitusi regex Perl. Untuk informasi lebih lanjut tentang opsi baris perintah Perl
perldoc perlrun
. Untuk informasi lebih lanjut tentang Perl lihat http://www.perl.org/ .sumber
mungkin melakukan ini:
Penjelasan:
:noautocmd vim /Search/ **/*
⇒ lookup (vim
adalah singkatan darivimgrep
) pola di semua file di semua subdirektori cwd tanpa memicu autocmds (:noautocmd
), demi kecepatan.:set hidden
⇒ biarkan buffer yang dimodifikasi tidak ditampilkan di jendela (bisa di vimrc Anda):cfirst
⇒ lompat ke hasil pencarian pertamaqa
⇒ mulai merekam makro ke register a:%s//Replace/gce
⇒ ganti semua kemunculan pola pencarian terakhir (masih/Search/
pada saat itu) denganReplace
:g
bendera)c
bendera)e
bendera):cnf
⇒ lompat ke file berikutnya dalam daftar yang dibuat olehvim
perintahq
⇒ berhenti merekam makro1000@a
⇒ bermain makro disimpan dalam daftar 1000 kali:wa
⇒ simpan semua buffer yang dimodifikasi* EDIT * Vim 8 cara:
Dimulai dengan Vim 8, ada cara yang lebih baik untuk melakukannya, karena
:cfdo
mengulangi semua file di daftar quickfix:sumber
vim
telah memenangkan saya untuk banyak hal, saya pikir saya akan tetap menggunakan PowerGrep dengan ini.Mengisi
:args
dari perintah shellDimungkinkan (pada beberapa sistem operasi 1 )) untuk menyediakan file
:args
melalui perintah shell.Misalnya, jika Anda menginstal ack 2 ,
akan meminta ack untuk mengembalikan daftar file yang berisi 'pola' dan meletakkannya di daftar argumen.
Atau dengan ol 'grep biasa saya kira itu akan menjadi:
Anda kemudian dapat menggunakan
:argdo
seperti yang dijelaskan oleh OP:Isi
:args
dari daftar quickfixJuga periksa jawaban nelstrom untuk pertanyaan terkait yang menjelaskan perintah sederhana yang ditentukan pengguna yang mengisi arglist dari daftar quickfix saat ini. Ini berfungsi dengan baik dengan banyak perintah dan plugin yang outputnya berakhir di daftar quickfix (
:vimgrep
,:Ack
3 ,:Ggrep
4 ).Urutan untuk melakukan pencarian luas proyek kemudian dapat dilakukan dengan:
di mana
:Qargs
panggilan ke perintah yang ditentukan pengguna yang mengisi arglist dari daftar quickfix.Anda juga akan menemukan tautan dalam diskusi berikutnya ke plugin sederhana yang membuat alur kerja ini turun menjadi 2 atau 3 perintah.
Tautan
sumber
Satu lagi opsi di 2016, plugin far.vim :
sumber
Jika Anda tidak keberatan memperkenalkan ketergantungan eksternal, saya telah membuat plugin ctrlsf.vim (tergantung pada ack atau ag ) untuk melakukan pekerjaan itu.
Itu dapat memformat dan menampilkan hasil pencarian dari ack / ag, dan menyinkronkan perubahan Anda dalam buffer hasil ke file aktual pada disk.
Mungkin demo berikut menjelaskan lebih lanjut
sumber
Langkah 1 mengisi daftar quickfix dengan item yang Anda inginkan. Dalam hal ini, ini disebarkan dengan istilah penelusuran yang ingin Anda ubah
grep
.cfdo
menjalankan perintah berikut pada setiap file di daftar quickfix. Ketik:help cfdo
untuk detailnya.s/<search term>/<replace term>/g
menggantikan setiap istilah./g
berarti mengganti setiap kejadian dalam file.| update
menyimpan file setelah setiap penggantian.Saya mengumpulkan ini berdasarkan jawaban ini dan komentarnya, tetapi merasa itu pantas mendapatkan jawabannya sendiri karena semuanya ada di satu tempat.
sumber
2. :cfdo %s/<search term>/<replace term>/g | update
Tanpa%
, hanya pola kemunculan pertama yang diganti.%s
bekerja pada vim biasa juga.Pada dasarnya, saya ingin mengganti dalam satu perintah dan yang lebih penting dalam vim itu sendiri
Berdasarkan jawaban oleh @Jefromi saya telah membuat pintasan keyboard, yang telah saya atur di file .vimrc saya seperti ini
sekarang dari vim, dengan stroke pemimpin + r saya mendapatkan perintah dimuat di vim, yang saya edit seperti di bawah ini,
Oleh karena itu, saya melakukan penggantian dengan satu perintah dan yang lebih penting dalam vim itu sendiri
sumber