Saya memiliki yang berikut di vimrc saya:
func! AddSpaceBeforeEqual()
s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc
Saya menggunakan vint untuk lint vimrc saya, dan mendapat peringatan berikut:
ProhibitCommandWithUnintendedSideEffect Hindari perintah dengan efek samping yang tidak diinginkan. Hindari penggunaan: s [ubstitute] saat memindahkan kursor dan mencetak pesan kesalahan. Fungsi yang disukai (seperti pencarian ()) lebih cocok untuk skrip. Untuk banyak perintah vim, ada fungsi yang melakukan hal yang sama dengan efek samping yang lebih sedikit. Lihat: fungsi bantu () untuk daftar fungsi bawaan. Panduan Gaya Vimscript Google
Namun, saya tidak berpikir bahwa mereka adalah cara untuk melakukan substitusi tanpa menggunakan :s
perintah.
Misalnya, search()
fungsi memberikan garis yang cocok dengan pola, tetapi tidak ada cara untuk melakukan substitusi. The substitute()
Fungsi beroperasi pada string, dan tidak menggantikan pada seluruh file.
Haruskah saya menerapkan metode pengganti sendiri, atau apakah itu cara yang lebih cerdas untuk menulis ulang fungsi saya?
sumber
:help function-search-undo
Berikut ini adalah implementasi sederhana dari fungsi Anda, ditulis dengan
substitute()
:Sesuaikan pola pencarian sesuai selera.
sumber
The
:s
perintah adalah pendekatan Vimscript murni.Dugaan saya adalah peringatan hanya berarti, bahwa kursor kemungkinan besar akan salah posisi setelah penggunaannya (yang Anda dapat mengelak dengan menggunakan
winsaveview()
fungsi sebelum dan perintahwinrestview()
setelah penggunaannya). Anda juga harus menjaga kemungkinan kesalahan yang mungkin terjadi. Ini biasanya ditangani dengan menggunakane
bendera. Juga kita perlu mengurus beberapa pengaturan sepertigdefault
pengaturan, yang membalikkan artig
bendera.Orang perlu mengurus hal-hal spesifik itu dan itu mungkin merupakan akar penyebab dari peringatan itu. Tetapi itu tidak berarti menghindari penggunaan
:s
perintah. Tidak apa-apa menggunakan:s
perintah, jika Anda ingin mengganti sesuatu di buffer saat ini.(Catatan, seseorang tentu saja dapat mengulangi semua baris dan menggunakan pendekatan pencarian () / getline () / setline (). Tapi itu biasanya lebih lambat.)
sumber