Edit
Dimungkinkan untuk melakukan ini dalam satu ekspresi jika kita menggunakan "sub-ganti-ekspresi." Lihat bawah untuk info tentang itu.
/ Edit
Masalahnya di sini adalah Anda ingin melakukan dua hal yang berbeda.
Beroperasi pada pertandingan secara keseluruhan (mis. Mengelilinginya dengan []
)
Operasikan pada setiap item dalam pertandingan (mis. Mengelilingi dengan '',
)
Anda dapat dengan mudah melakukan keduanya:
:s/\(.\+\n\)\+/[&]/
:%s/\(.\+\)\n/'\1', /
tetapi sejauh yang saya tahu tidak ada cara untuk melakukan keduanya dalam satu operasi. Saya memang mencoba untuk mendapatkan output yang tepat dengan sesuatu seperti:
:s/\(\(.\+\)\n\)\+/[\2]/
Tapi tentu saja masalah dengan ini adalah bahwa \2
pertandingan hanya pertandingan terakhir dari set kedua kurung memori \(\)
dan tidak "mengingat" apa pun sebelumnya. Jadi Anda berakhir hanya dengan baris terakhir.
Saya akan merekomendasikan melakukan beberapa pemrosesan pra / pasca dengan tambahan :s///
perintah untuk menyingkirkan baris baru sebelum / setelah fakta. Inilah yang saya pikirkan
function! FormatExpression()
.,/\n^$/s/\(.*\)\n/'\1', /
s/\(.*\), /[\1]/
endfunction
Baris 1 (Hapus baris baru)
.,/\n^$/
Ini adalah pengubah rentang untuk pencarian dan penggantian. Tanpa ini, perintah akan melanjutkan untuk memutilasi seluruh file Anda. Saat ini ia beralih dari baris saat ini .
, ke baris kosong berikutnya\n^$
. Saya tidak yakin bagaimana Anda berniat untuk berpisah, tetapi Anda perlu cara untuk menghentikannya.
s/
Awal pencarian dan ganti perintah
\(.*\)\n
Cocokkan seluruh baris, tetapi hanya simpan bagian tanpa baris baru.
'\1',
Ganti baris dengan pertandingan yang dikelilingi oleh tanda kutip tunggal dan tambahkan koma.
Baris 2 (Surround in kurung)
\(.*\),
Cocokkan seluruh baris tetapi bukan koma dan ruang terakhir
[\1]
Dikelilingi dengan tanda kurung dan juga menghapus koma dan ruang berakhir berlebihan.
Saya akan terus mencari ke dalam ini, tetapi saat ini saya tidak berpikir itu mungkin dengan satu ekspresi. :(
EDIT:
Saya telah menemukan cara untuk melakukan ini dengan satu ekspresi! Internal ini sebenarnya adalah dua pergantian pemain, tetapi adalah teknis satu ekspresi. Inilah yang saya pikirkan:
:s/\v((.+\n)*.+)\n/\= "['" . substitute(submatch(1), '\n', "', '", 'g') . "']" /
:s///
: Lakukan substitusi
\v((.+\n)*.+)\n
: Pada dasarnya kumpulkan semua baris non-kosong berikutnya dan simpan semuanya kecuali untuk final \n
\=
Mengizinkan kami menggunakan ekspresi dalam penggantian (lihat :h sub-replace-expression
)
substitute(submatch(1)...)
: Mengganti semua yang tersimpan \n
dengan', '
"['" . ... . "']"
: Prepends ['
dan append']
Ini akan mulai pada posisi kursor dan pergi sampai menemukan garis kosong ( ^\n
). Tidak meraih yang terakhir\n
adalah penting karena tanpa bagian itu kita memiliki tambahan ',
yang tidak kita inginkan pada akhirnya.
Beberapa orang mungkin menganggap ini lebih kompleks daripada jawaban dua ekspresi sebelumnya. Tetapi saya pikir saya akan melanjutkan dan menambahkan ini karena sebenarnya mungkin untuk melakukannya dengan satu ekspresi. :)
:'<,'>s/\v(.*)\n/'\1', / | s/\v(.*), /[\1]/
Anda bisa mengubah ini menjadi pemetaan visual:xnoremap ,x :s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>
dan mungkin menjadi pemetaan normal jika ekspresi ada di dalam paragraf:nnoremap ,x :'{+1,'}-1s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>
Di sini pemetaan akan,x
.