Mari kita asumsikan saya sedang mengedit beberapa kode Python di vim yang agak mirip:
myobj.myfunc("Some string parameter that goes on and on and on and on and sometimes doesn't"
"split very"
"neatly over different lines so that"
"it is formatted attractively")
Saya lebih suka memformat ulang ini sehingga mencerminkan hingga yang textwidth
telah saya tetapkan:
myobj.myfunc("Some string parameter that goes on and on and "
"on and on and sometimes doesn't split very "
"neatly over different lines so that it is "
"formatted attractively")
Apakah ada cara mudah untuk melakukan ini? Jika ini adalah paragraf teks konvensional, gqipatau serupa akan berguna, tetapi ini tidak akan menangani tanda kutip yang digunakan untuk menghapus string.
Catatan : Saya bertanya secara khusus tentang Python di sini, tetapi idealnya, jawaban ini akan relevan untuk banyak jenis bahasa pemrograman yang memungkinkan kelanjutan string.
formatting
line-breaks
filetype-python
Andrew Ferrier
sumber
sumber
"""multi-line string"""
?Jawaban:
Oh, itu yang sulit. Saya pikir pendekatan terbaik mungkin adalah makro tetapi lebih mungkin sebuah plugin. Ini adalah contoh yang saya buat (saya butuh hobi yang lebih baik). Tampaknya bekerja untuk saya tetapi perlu plugin indentasi python untuk indentasi dengan benar. Cobalah.
Kemudian Anda bisa menggunakannya dengan
:call ReformatMultiLines()
dan / atau menggunakannya dalam pemetaan.sumber
Jika ini kejadian biasa, Anda sebaiknya mencari plugin atau menggunakan fungsi @Sukima. Namun, jika saya melakukan ini dengan cepat, inilah yang mungkin akan saya lakukan:
Tambahkan baris baru setelah paren pembuka dan sebelum paren penutup sehingga string berada pada garis yang terpisah.
Pilih baris dengan string dan hapus kutipan di sekitarnya:
:norm ^x$x
:set tw-=2
gvgq
:set tw+=2
gv:norm I"<Esc>A"
. Alih-alih<Esc>
Anda ingin memasukkan escape literal dengan mengetikkan ctrl-v diikuti oleh key escape. Karena saya memetakan jj untuk melarikan diri, saya biasanya ketik jj di sini.sumber
:set tw-=2
menghasilkanE487: Argument must be positive: tw-=2
. Apakah sintaksanya salah?:set tw?
. Dugaan saya adalah Anda telah mengatur lebar teks ke 0. Langkah-langkah ini mengasumsikan bahwa lebar teks dimulai sebagai jumlah karakter yang Anda inginkan per baris.s/2/3/
dan menambahkan spasi sebelum kutipan penutup, string panjang Anda tidak akan memiliki jarak antar kata yang tepat.Memisahkan dan memformat kode sulit, terutama untuk bahasa dinamis seperti Python.
Alih-alih mencoba mengurai Python dalam Vimscript, saya sarankan Anda dapat menggunakan formatter eksternal seperti yapf . Dengan jawaban saya di sini, Anda dapat menulis ini secara otomatis saat menulis dengan:
The
s:write_cmd()
fungsi dalam jawaban lain - saya tidak akan menambahkannya di sini jadi aku tidak perlu memperbaruinya di dua tempat jika saya menemukan bug :-)Anda juga dapat mengatur
formatprg
untukyapf
dan format secara manual dengangq
.sumber
yapf
sepertinya tidak dilakukan. Meskipun demikian saya setuju itu terlihat seperti alat yang berguna.Fungsi-fungsi berikut dan pemetaan yang sesuai memecahkan masalah ini untuk saya:
sumber