Bagaimana cara menambahkan teks di akhir setiap baris di Vim?

116

Di Vim, saya memiliki teks berikut:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Saya ingin menambahkan "," di akhir setiap baris. Teks sebelumnya akan menjadi berikut:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Apakah ada yang tahu bagaimana melakukan ini? Apakah mungkin menggunakan mode blok visual untuk melakukannya?

Grace Shao
sumber
Pertanyaan serupa di sini .
glts

Jawaban:

163

Ini akan melakukannya ke setiap baris di file:

:%s/$/,/

Jika Anda ingin membuat subset baris alih-alih seluruh file, Anda dapat menentukannya sebagai pengganti %.

Salah satu caranya adalah dengan melakukan pemilihan visual dan kemudian ketik :. Ini akan mengisi :'<,'>untuk Anda, lalu Anda mengetik sisanya (Perhatikan Anda hanya perlu menambahkan s/$/,/)

:'<,'>s/$/,/
Alan Curry
sumber
4
Baris terakhir memiliki ekstra ', seharusnya :'<,'>s/$/,/.
cjg
mengapa tidak perlu g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen karena tetap /$/cocok hanya sekali.
Bubaya
156

Sebenarnya ada cara untuk melakukan ini menggunakan mode blok Visual. Cukup menekan $Adalam mode blok Visual menambahkan ke akhir semua baris dalam pemilihan. Teks yang ditambahkan akan muncul di semua baris segera setelah Anda menekan Esc.

Jadi ini adalah solusi yang mungkin:

vip<C-V>$A,<Esc>

Yaitu, dalam mode Normal, Visual pilih paragraf vip, alihkan ke mode blok Visual CTRLV, tambahkan $Akoma ke semua baris ,, lalu tekan Escuntuk mengonfirmasi.

Dokumentasi ada di :h v_b_A. Bahkan ada sebuah ilustrasi tentang cara kerjanya di bagian contoh: :h v_b_A_example.

glts
sumber
1
Tidak, ini standar Vim: Pilih beberapa baris dalam mode blok Visual (dengan C-V) lalu pindahkan kursor ke akhir baris $dan tambahkan ke semuanya A. Anda akan menyukai :h v_b_A, yang sangat teliti.
glts
1
Oh, saya mengerti apa yang terjadi! Saya biasanya menggunakan Ctrl-C daripada <Esc> untuk keluar dari mode penyisipan, dan tampaknya dengan Ctrl-C ini tidak berfungsi! Aneh sekali.
weronika
3
Anda dapat menyimpan keystroke dengan menggunakan <C-V>ipsebagai ganti vip<C-V>.
Aaron Thoma
1
@accolade, tidak masuk ke mode blok visual seperti itu, dan tidak akan berfungsi. <CV> perlu terjadi setelahnya jika Anda melakukannya seperti itu.
Imagineer Itu
@imagineerThat, aneh - ini bekerja untuk saya - pasti karena beberapa opsi non-default. (Tidak 'virtualedit'- Saya mengujinya.) Saya mengonfirmasi bahwa itu tidak berfungsi di vim yang bersih. Terima kasih atas catatannya!
Aaron Thoma
44

Solusi lain, menggunakan fitur hebat lainnya:

:'<,'>norm A,

Lihat :help :normal.

romainl
sumber
1
@Swiss, Anda akan menyukai komentar ini .
romainl
1
@Swiss, Anda mungkin juga seperti udioca Paparan di :normal. Saya merasa informatif!
Conner
1
Tidak tahu tentang subreddit ini. Terima kasih.
romainl
33

mode ex paling mudah:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Ned Batchelder
sumber
10

Perintah pengganti dapat diterapkan ke pilihan visual. Membuat blok visual selama garis yang Anda ingin perubahan, dan ketik :, dan pemberitahuan bahwa baris perintah diinisialisasi seperti ini: :'<,'>. Ini berarti bahwa perintah pengganti akan beroperasi pada pemilihan visual, seperti:

:'<,'>s/$/,/

Dan ini adalah substitusi yang seharusnya bekerja untuk contoh Anda, dengan asumsi Anda benar-benar menginginkan koma di akhir setiap baris seperti yang Anda sebutkan. Jika ada spasi tambahan, Anda mungkin perlu menyesuaikan perintah sesuai:

:'<,'>s/\s*$/,/

Ini akan menggantikan spasi kosong yang ada sebelum akhir baris dengan koma, yang secara efektif menghapus spasi kosong.

Perintah yang sama dapat beroperasi pada berbagai jalur, misalnya untuk 5 baris berikutnya: :,+5s/$/,/, atau untuk seluruh buffer: :%s/$/,/.

pb2q
sumber
3

Jika Anda ingin menambahkan ',' di akhir baris yang dimulai dengan 'key', gunakan:

:%s/key.*$/&,
kiddorails
sumber
Atau :g/key/s/$/,. Lihat :help :global.
romainl
2

Saya memiliki <M-DOWN>(panah bawah alt) yang dipetakan <DOWN>.sehingga saya dapat mengulangi perintah terakhir pada serangkaian baris dengan sangat cepat. dengan pemetaan ini saya bisa:

A,<ESC>

Dan kemudian tahan alt sambil menekan berulang kali untuk menambahkan koma ke akhir setiap baris.
Ini bekerja dengan baik untuk saya karena memungkinkan kontrol yang sangat baik atas apa yang dilakukan dan tidak mendapatkan perubahan.
(Saya juga memiliki panah lain yang dipetakan dengan cara yang sama untuk memungkinkan pengulangan yang mudah .)

Berikut garis pemetaan untuk ditempelkan ke vimrc Anda:

map <M-DOWN> <DOWN>.
Sam Brinck
sumber
1
:%s/$/,/g

$ cocok dengan akhir baris

kalhartt.dll
sumber
2
Itu juga akan menambah $garis, bukan hanya ,.
ZyX
2
/gdigunakan untuk melakukan substitusi pada setiap kemunculan dalam satu baris. Karena hanya ada satu $baris yang dapat Anda jatuhkan dengan aman.
romainl
Ya, kesalahan saya pada, $. dan / g berasal dari habbit, dan ya itu opsional.
kalhartt
1

Mengikuti Makro juga dapat digunakan untuk menyelesaikan tugas Anda.

qqA,^[0jq4@q
dvk317960.dll
sumber