Saya mencoba membaca banyak kode C / Perl melalui Vim yang berisi banyak nama variabel huruf tunggal.
Alangkah baiknya memiliki beberapa perintah yang dapat membantu saya mengubah nama variabel menjadi sesuatu yang lebih bermakna saat saya dalam proses membaca kode sehingga saya dapat membaca sisanya dengan lebih cepat.
Apakah ada perintah di Vim yang memungkinkan saya melakukan ini dengan cepat?
Saya tidak berpikir regex akan berfungsi karena:
nama satu huruf yang sama mungkin memiliki tujuan yang berbeda di blok cakupan yang berbeda
kombinasi huruf yang sama dapat menjadi bagian dari nama var lain yang lebih besar, atau dalam string atau komentar ... tidak ingin mengubahnya
Ada solusi yang diketahui?
sumber
:
) dua kali. Pertama kali saya menekannya, saya melihat:'<,'>
. Jika saya hanya mengetiks/
dari sana, itu tidak berhasil; Saya harus mengetikkan titik dua lain sebelums/
.<C-R>
menggunakan perintah pengganti, cukup menghilangkan pencarian akan menyebabkan vim menggunakan pola pencarian terakhir, yang dalam hal ini dibuat darigd
perintah. Jadi, melakukan saja:s//<newname>/gc
sudah cukup.AFAIK, sebenarnya tidak ada dukungan refactoring di VIM. Saat melakukan penggantian nama dengan maksud refactor, saya biasanya melakukan tindakan pencegahan berikut:
Perubahan akhir saya terlihat seperti ini
Saya ingin sekali jika salah tentang tidak adanya alat refactoring untuk VIM tetapi saya belum melihatnya.
sumber
Saya tahu itu pertanyaan lama, dan cara @ mykola-golubyev jelas ADALAH jawaban terbaik untuk kasus tertentu dalam pertanyaan OP (yang, saya asumsikan akan melalui kode yang dikaburkan di mana Anda cenderung memiliki beberapa blok dengan nama var yang sama) ; tetapi dengan nama pertanyaan seperti itu, banyak orang yang datang ke sini dari penelusuran google mungkin mencari cara yang tidak terlalu spesifik untuk situasi tertentu untuk mengganti nama variabel di VIM - dan itu bisa lebih ringkas
Saya terkejut tidak ada yang menyarankan seperti ini:
Ini
*
sama dengangn
- ini mencari kemunculan berikutnya dari kata di bawah kursor DAN itu menjadi pola pencarian terakhir, jadi ketika Anda menghilangkan pola pencarian dalam perintah pengganti, VIM menganggap ini adalah pola yang akan dicari.Untuk sejumlah kecil salinan var, bahkan lebih cepat:
Cari kejadian,
cw
adalah perintah untuk mengubah kata ,n
pergi ke kejadian berikutnya dari istilah yang dicari terakhir dan.
mengulangi perintah terakhir (yaitu mengubah kata menjadi NEWNAME )(Penghargaan untuk saya mengetahui semua ini masuk ke @doomedbunnies di Reddit )
Trik keren lainnya adalah ini: ( kredit untuk @ nobe4 )
cgn
adalah "mengubah apa pun hasil dari (temukan kejadian berikutnya)". Sekarang ini adalah perintah terakhir , Anda tidak perlun
pergi ke kejadian berikutnya, jadi lebih sedikit pukulan lagi, dan, yang lebih penting, tidak perlu bergantiann
dan.
. Tapi, jelas, yang satu ini memiliki kelemahan karena tidak memiliki cara untuk melewatkan kejadian.Berikut beberapa manfaatnya:
*
ataugn
untuk pemilihan kata sangat cepat - hanya satu penekanan tombol (yah, katakanlah 1,5)*
ataugn
memastikan Anda tidak mendapatkan kecocokan di dalam kata lain, seperti:%s/<C-R>//gc
halnya. Ketukan mengetik:%s/\<OLDNAME\>/NEWNAME/gc
dengan tangan: Saya pribadi cenderung lupa menggunakan\<
hal - hal untuk membatasi kecocokan hanya untuk seluruh kata.n
untuk melewati pertandingan yang tidak diinginkan - bahkan mungkin lebih sedikit dari pukulan ekstra yang diperlukan untuk membatasi cakupan. Dalam keadaan normal, variabel Anda kemungkinan besar agak dilokalkan ke blok kode tertentu.sumber
Taruh ini di .vimrc Anda
Sebut saja dengan
:call Rnvar()
expand("<cword>")
mendapatkan kata di bawah kursor. String pencarian menggunakan%
untuk file-scope, dan\(\W\)
polanya mencari karakter non-kata di batas kata yang akan diganti, dan menyimpannya dalam variabel\1
dan\2
untuk dimasukkan kembali ke dalam pola penggantian.sumber
Anda dapat menggunakan pengubah 'c' dalam pencarian global dan mengganti yang akan meminta Anda untuk konfirmasi untuk setiap penggantian. Ini akan memakan waktu lebih lama tetapi mungkin berfungsi untuk file kode yang tidak besar:
C berarti konfirmasi.
sumber
Di c, Anda mungkin dapat membuat beberapa kemajuan menggunakan cscope. Itu membuat upaya untuk memahami sintaks, jadi akan memiliki kesempatan untuk mengetahui kapan surat itu variabel.
sumber
Jika ini ada di beberapa file, Anda dapat mempertimbangkan untuk melihat sed. Gunakan find untuk mengambil file dan xargs plus sed Anda untuk diganti. Katakanlah Anda ingin mengganti a dengan a_better_name di semua file yang cocok dengan * .c, Anda bisa melakukannya
Temukan . -nama "* .c" | xargs sed -i -e 's / a / a_better_name / g'
Ingatlah bahwa ini akan menggantikan SEMUA kemunculan a, jadi Anda mungkin menginginkan regex yang lebih kuat.
sumber