Bagaimana cara mendapatkan preview untuk perintah substitusi?

9

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 cflag 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?

Vitor Eiji
sumber
2
itu adalah item whishlist di pelacak vim-bug (maaf tidak menemukannya saat ini)
Christian Brabandt
2
Untuk apa nilainya saya biasanya menggunakan substitusi pada baris pertama untuk mengganti tanpa %, 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 ...
statox
2
@ChristianBrabandt menemukannya . Sampai sekarang ini belum diprioritaskan ...
Vitor Eiji
2
@VitorEiji bukan itu yang saya pikirkan. Tetapi sebenarnya tidak masalah, karena saat ini tidak mungkin. Neovim menyediakan opsi 'inccommand', yang mungkin berhasil (atau tidak, saya tidak benar-benar sekarang)
Christian Brabandt
Jahat melihat subtitusi; Saya tidak tahu bagaimana cara melakukannya.
Geremia

Jawaban:

2

Satu solusi adalah makro. Sorot semua bidang masalah dan lakukan penggantian pada satu baris sekaligus. Kemudian putuskan apakah Anda menginginkannya atau tidak. Setelah selesai nke area berikutnya.

Khusus untuk kasus Anda:

  1. Cari area: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Mulai merekam makro qq.
  3. Menerapkan :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Hentikan merekam makro q
  5. Baik batalkan ( u) atau buka hasil pencarian berikutnya ( n).
  6. Terapkan makro @q.
  7. Ulangi langkah 5 dan 6 sesuai kebutuhan.

Jelas tidak cukup apa yang Anda cari, tetapi ini biasanya apa yang saya lakukan.

Tumbler41
sumber
itu keren! Saya tidak pernah menyadari bahwa ketika Anda melakukan pencarian dengan /itu juga berperilaku sebagai pilihan visual - bagus.
the_velour_fog
@the_velour_fog " /... berperilaku sebagai pilihan visual." Sebenarnya tidak. Alasan mengapa ini bekerja adalah karena :s//bertindak pada baris saat ini dan menggunakan nmembawa Anda ke kejadian berikutnya.
Tumbler41
1
Jika Anda tidak menentukan pola untuk :s/pattern/replacementitu akan menggunakan string pencarian terakhir, jadi pada langkah 3 Anda benar-benar dapat menerapkan :s//betterFunction(\1, \3)/guntuk menyimpan beberapa pengetikan.
Haegin
@ Tumbler41 ah, terima kasih telah menjelaskan. Ya saya juga melakukan teknik pencarian dasar ini , kemudian menerapkan makro , saya biasanya mengisi argumen terlebih dahulu dan menggunakan :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/.../..../gcdan mulai terbang melalui operasi
the_velour_fog