Cukup sering saya merasa perlu melakukan substitusi yang akan memiliki kecocokan tersebar di seluruh file besar dan dengan pencarian non-sepele dan ekspresi pengganti.
Sebagai contoh, katakan saya memiliki beberapa panggilan fungsi seperti okFunction(arg1, arg2 arg3)
. Args akan berbeda dengan setiap pemanggilan fungsi, tentu saja. Sekarang katakan saya telah menemukan fungsi yang lebih baik yang tidak perlu arg2
. Saya dapat dengan mudah mengatur seluruh file dengan
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Meskipun secara konsep sederhana, saya tidak yakin saya sudah mendapatkan sintaks yang tepat dalam pola yang agak panjang ini. The c
flag benar-benar membantu di sini, tapi masalahnya adalah bahwa ketika meminta konfirmasi, vim tidak akan menunjukkan apa pertandingan akan diganti dengan. Maksud saya, ini akan menunjukkan ekspresi pengganti, tetapi bukan hasil yang dievaluasi. Jika saya mengkonfirmasi penggantian dengan y
, vim akan segera melompat ke pertandingan berikutnya dan saya tidak akan dapat melihat apakah saya melakukan kesalahan.
Saya telah menemukan plugin vim-over yang sebagian menyelesaikan masalah, tetapi hanya jika semua matematika terlihat di layar saat Anda mengetik perintah. Setelah Anda menekan enter, perilaku adalah sama persis seperti yang saya jelaskan di atas dan saya tidak mendapatkan pratinjau.
Jadi, apakah ada cara untuk mendapatkan vim untuk mengevaluasi ekspresi pengganti ketika meminta konfirmasi tentang perintah pengganti?
sumber
%
, periksa hasilnya adalah apa yang saya harapkan dan kemudian gunakan substitusi dengan%
(hanya beberapa penekanan tombol:):<up><c-b>%
. Jelas opsi pratinjau akan jauh lebih efisien dari itu. Meskipun tidak ada tambalan yang tersedia, mungkin orang dapat membungkus substitusi dalam fungsi vimscript dengan opsi semacam ini tetapi kedengarannya seperti banyak pekerjaan ...Jawaban:
Satu solusi adalah makro. Sorot semua bidang masalah dan lakukan penggantian pada satu baris sekaligus. Kemudian putuskan apakah Anda menginginkannya atau tidak. Setelah selesai
n
ke area berikutnya.Khusus untuk kasus Anda:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
) atau buka hasil pencarian berikutnya (n
).@q
.Jelas tidak cukup apa yang Anda cari, tetapi ini biasanya apa yang saya lakukan.
sumber
/
itu juga berperilaku sebagai pilihan visual - bagus./
... berperilaku sebagai pilihan visual." Sebenarnya tidak. Alasan mengapa ini bekerja adalah karena:s//
bertindak pada baris saat ini dan menggunakann
membawa Anda ke kejadian berikutnya.:s/pattern/replacement
itu akan menggunakan string pencarian terakhir, jadi pada langkah 3 Anda benar-benar dapat menerapkan:s//betterFunction(\1, \3)/g
untuk menyimpan beberapa pengetikan.:vimgrep /pattern/ ##
kemudian menerapkan makro , dengan cara itu jika ternyata pola saya benar-benar cocok secara konsisten dan hal makro terlalu membosankan, saya kemudian dapat dengan cepat kembali ke:argdo %s/.../..../gc
dan mulai terbang melalui operasi