Katakanlah saya memiliki yang berikut ini
DRAFT,
SAVED,
ARCHIVED,
DELETED;
Dan saya ingin yang berikut ini:
DRAFT("draft"),
SAVED("saved"),
ARCHIVED("archived"),
DELETED("deleted");
Bagaimana saya bisa melakukan ini dengan vim? Saya menduga bahwa saya dapat menggunakan mode blok visual?
Saya menyadari bahwa saya dapat dengan mudah melakukan ini dengan sed, tetapi saya tertarik dengan cara apa pun yang saya bisa lakukan ini tanpa meninggalkan vim.
sed
dan Vim menggunakan ekspresi reguler yang sangat mirip, jadi ... apa yang akan Anda lakukansed
?Jawaban:
tampaknya melakukan apa yang Anda minta.
\v
mengurangi jumlah garis miring terbalik(\w*)
grup pertama, sejumlah karakter "kata"([,;])
kelompok kedua,,
atau;
\1
gunakan kembali grup pertama("\L\1")
lebih rendah grup pertama antara kutipan dan tanda kurung\2
kelompok keduasumber
Ini menemukan kata
\<(w*\)\>
lalu menempatkan apa adanya\1
dan huruf kecil\L\1
sumber
s/ *\([A-Z]*\)/\1("\L\1")/
sebaliknya untuk mengabaikan spasi putih terkemuka. Atau memimpin apa pun. The\( \)
membuat capture bernomor group--\1
dalam kasus ini.Untuk orang yang lebih suka ruby:
x = $ _ [0 ..- 2] -> jangan menyimpan karakter terakhir (, atau;)
$ _ [- 1] -> "," atau ";"
sumber
Saya akan melakukan ini dengan makro, sendiri. Dengan asumsi kursor berada di awal baris pertama:
Jauh lebih sedikit mengetik dengan cara ini, dan tidak mengharuskan Anda untuk mengingat sintaks regex vim. Seringkali ini bisa berubah menjadi jauh lebih cepat untuk melakukan konversi teks semacam ini menggunakan makro daripada dengan menggunakan perintah pengganti.
Hancurkan solusi saya:
qa
mulai merekam makro ke register 'a'.ye
menarik dari posisi kursor saat ini ke akhir kata, menyimpannya ke dalam register "dan 0. (Saya hanya akan mengaksesnya melalui register 0, tetapi sebenarnya disimpan di keduanya)e
memindahkan kursor ke akhir kataa
memasuki mode sisipkan SETELAH kursor (jadi antara kata dan koma)<C-R>0
. Dalam mode penyisipan,<C-R>n
berarti "masukkan teks yang ada di register n". Jika saya melakukan tugas ini secara normal (daripada menjelaskannya kepada orang lain dalam bentuk teks), saya sebenarnya akan menggunakannya di<C-R>"
sini, tetapi0
lebih mudah untuk secara visual membedakan dari "karakter harfiah yang mengelilinginya.<ESC>
mengembalikan kita ke mode normal. Kursor sekarang berada pada penutup) yang merupakan karakter terakhir yang kita ketikkan pada mode insert.v
memasuki mode visual.%
melompat kursor kembali ke tanda kurung terbuka yang cocok dengan tanda kurung tutup saat ini, jadi pilihan visual kami sekarang mencakup string("DRAFT")
.gu
mengubah string yang dipilih secara visual menjadi huruf kecil. Ini tidak berpengaruh pada tanda kurung atau kutipan dalam pemilihan visual.+
memajukan kursor ke awal baris berikutnya, siap untuk menjalankan set perintah yang sama lagi.q
selesai merekam makro.3@a
menjalankan makro 'a' kami tiga kali, sehingga mengulang semua yang kami lakukan pada baris pertama pada tiga baris berikutnya.sumber