Vim menyisipkan karakter sebelum koma pada beberapa baris

0

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.

yah sebenarnya
sumber
Yah, seddan Vim menggunakan ekspresi reguler yang sangat mirip, jadi ... apa yang akan Anda lakukan sed?
romainl

Jawaban:

3
:%s/\v(\w*)([,;])/\1("\L\1")\2

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 kedua
romainl
sumber
2
:1,$s/\<\(\w*\)\>/\1("\L\1")/

Ini menemukan kata \<(w*\)\>lalu menempatkan apa adanya \1dan huruf kecil\L\1

parkydr
sumber
Ini sepertinya tidak berhasil. Sepertinya tidak bisa mencocokkan kata-kata. Mungkin karena mereka mulai dengan spasi putih. Saya seharusnya menyebutkan itu. Sebagai gantinya, perintah diawali ("") pada awal setiap baris dan tidak menghapus kata-kata yang sebenarnya.
sebenarnya
Jika saya memodifikasinya sedikit untuk menambahkan karakter spasi, itu semakin dekat tetapi tidak cukup. : 16,20s / \ s * [AZ] * / & ("\ L &") / Bagaimana saya bisa memodifikasi ini sehingga spasi putih diabaikan ketika kita memasukkan kata dalam kurung?
yah sebenarnya
Gunakan [^ ,;] bukan [AZ] pada perintah asli saya
parkydr
Gunakan s/ *\([A-Z]*\)/\1("\L\1")/sebaliknya untuk mengabaikan spasi putih terkemuka. Atau memimpin apa pun. The \( \)membuat capture bernomor group-- \1dalam kasus ini.
jpaugh
Coba jawaban saya yang diperbarui
parkydr
0

Untuk orang yang lebih suka ruby:

:rubydo x = $_[0..-2] ; $_ = "#{x}(\"#{x.downcase}\")#{$_[-1]}"

x = $ _ [0 ..- 2] -> jangan menyimpan karakter terakhir (, atau;)

$ _ [- 1] -> "," atau ";"

Hettomei
sumber
0

Saya akan melakukan ini dengan makro, sendiri. Dengan asumsi kursor berada di awal baris pertama:

qqyeea("<C-R>0")<ESC>v%gu+q3@a

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 kata
  • a memasuki mode sisipkan SETELAH kursor (jadi antara kata dan koma)
  • Selanjutnya saya memasukkan beberapa teks standar. Yang menarik adalah <C-R>0. Dalam mode penyisipan, <C-R>nberarti "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, tetapi 0lebih 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").
  • gumengubah 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.
Trevor Powell
sumber