Vim: masukkan karakter yang sama di beberapa baris

306

Terkadang saya ingin mengedit blok visual teks tertentu di beberapa baris.

Misalnya, saya akan mengambil teks yang terlihat seperti ini:

name
comment
phone
email

Dan membuatnya terlihat seperti ini

vendor_name
vendor_comment
vendor_phone
vendor_email

Saat ini cara saya akan melakukannya sekarang adalah ...

  1. Pilih semua 4 baris baris blok dengan menekan Vdan kemudian jempat kali.
  2. Indentasi dengan >.
  3. Kembali satu surat dengan h.
  4. Pergi ke blok mode visual dengan Ctrlv.
  5. Pilih empat baris dengan menekan jempat kali. Pada titik ini Anda telah memilih blok visual spasi 4x1 (empat baris dan satu kolom).
  6. Tekan C. Perhatikan ini cukup menjorok ke kiri oleh satu kolom.
  7. Ketik " vendor_"tanpa kutipan. Perhatikan ruang ekstra yang harus kami tempatkan kembali.
  8. Tekan Esc. Ini adalah salah satu dari beberapa kali saya gunakan Escuntuk keluar dari mode insert. Ctrlchanya akan mengedit baris pertama.
  9. Ulangi langkah 1.
  10. Indentasi sebaliknya <.

Saya tidak perlu indentasi jika ada setidaknya satu kolom spasi sebelum kata-kata. Saya tidak perlu spasi putih jika saya tidak harus menghapus blok visual dengan c.

Tetapi jika saya harus jelas, apakah ada cara untuk melakukan apa yang saya lakukan di atas tanpa membuat spasi yang dibutuhkan dengan lekukan?

Juga mengapa mengedit beberapa baris sekaligus hanya bekerja dengan keluar dari mode insert dengan Escover Ctrlc?


Berikut ini contoh yang lebih rumit:

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

untuk

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

Dalam contoh ini saya akan melakukan blok visual vertikal di atas ., dan kemudian masukkan kembali selama mode penyisipan, yaitu, ketik .whatever.. Semoga sekarang Anda dapat melihat kelemahan dari metode ini. Saya terbatas hanya memilih kolom teks yang semuanya sama dalam posisi vertikal .

hobbes3
sumber
9
Cara yang lebih baik: ":% s / ^ / vendor_ /"
Paul Tomblin
1
Terima kasih atas tanggapannya. Itu bekerja jika saya hanya ingin menambahkan kata ke setiap baris. Tetapi metode yang saya gunakan dapat dilakukan di posisi mana pun. Izinkan saya menambahkan contoh saya yang lain dengan contoh yang lebih rumit.
hobbes3
3
Kemudian sorot baris yang ingin Anda ubah dengan shift-V, dan ketik pencarian yang sesuai dan ganti perintah - dalam contoh kedua,:s/models\./\0whatever./
Paul Tomblin
Banyak cara untuk mencapai hal di atas. Untuk sepenuhnya menjawab semua bagian pertanyaan maka bagian 1) baik mode regex atau visual Saya mengedit esc berfungsi dengan baik seperti yang ditawarkan dalam jawaban (Saya lebih suka pemilihan visual di GVIM). Untuk bagian 2), makro mungkin paling mudah seperti yang ditawarkan oleh Brian Neal. Sumber daya terbaik yang saya tahu untuk semua jenis "hows" ini adalah Vim Praktis oleh Drew Neil. Referensi cepat dibaca dan ringan sangat baik setiap kali Anda lupa formula. Semoga rekomendasi ini membantu seseorang, akan sepadan dengan usaha banyak pengguna vim.
arcseldon
@ Paul: Dan jika Anda menghitung penekanan tombol , Anda bisa menggantinya \0dengan &.
icktoofay

Jawaban:

912
  1. Pindahkan kursor ke ndalam name.
  2. Masuk ke mode blok visual ( Ctrlv).
  3. Tekan jtiga kali (atau 3j).
  4. Tekan I( huruf kapital i).
  5. Ketikkan vendor_. Catatan: Ini hanya akan memperbarui layar di baris pertama - sampai Escditekan (6.), pada titik mana semua baris akan diperbarui.
  6. Tekan Esc.

mini-screencast mendemonstrasikan metode ini

IHuruf besar harus digunakan daripada huruf kecil i, karena huruf kecil iditafsirkan sebagai awal objek teks , yang agak berguna sendiri, misalnya untuk memilih di dalam blok tag ( it):

mini-screencast menunjukkan kegunaan objek teks 'it'

icktoofay
sumber
12
Saya tidak bisa menjalankan ini di Windows (karena CTRL + V dipetakan untuk tempel clipboard). Tetapi Vim juga telah memetakan ini ke Ctrl + Q untuk versi Windows.
Arnestig
2
@Ven: Vim sebenarnya tidak sibuk selama waktu itu — hanya menunggu Anda untuk menekan tombol lain, dan akhirnya mati. Dua percobaan untuk Anda: pertama, coba tekan tombol escape dan kemudian segera tekan tombol lain, seperti jatau ^L. Anda seharusnya melihat bahwa Vim tidak sibuk sama sekali; itu hanya menunggu. Kedua, coba ubah 'timeout'ke nilai yang lebih rendah, seperti 80(daripada default 1000) dan perhatikan bahwa waktu habis lebih cepat.
icktoofay
1
@icktoofay Sepertinya variabel yang Anda maksud timeoutlentidak timeout.
Juli
4
@AnjaNA: Jika di mana Anda ingin menyisipkan semuanya dalam kolom yang sama (mis. Jika angka-angkanya sama panjangnya), Anda dapat menggunakan teknik yang sama kecuali menekan Adaripada I, yang akan menyisipkan setelah blok yang dipilih daripada sebelumnya. Namun, jika garis Anda berbeda panjang, itu tidak akan berfungsi; Saya suka menggunakan substitusi yang cocok dengan akhir setiap baris untuk itu, misalnya memilih beberapa baris dan menggunakan :s/$/inserted/.
icktoofay
3
Saya harus menekan panah ke bawah setelah menekan esc untuk
mengaktifkan ini
69

Pendekatan lain adalah dengan menggunakan perintah .( dot) bersama dengan I.

  1. Pindahkan kursor ke tempat Anda ingin memulai
  2. tekan I
  3. Ketikkan awalan yang Anda inginkan (mis. vendor_)
  4. Tekan esc.
  5. Tekan juntuk turun satu baris
  6. Ketik .untuk mengulangi pengeditan terakhir, secara otomatis memasukkan awalan lagi
  7. Bergantian cepat antara jdan.

Saya menemukan teknik ini sering lebih cepat daripada mode blok visual untuk sejumlah kecil penambahan dan memiliki manfaat tambahan bahwa jika Anda tidak perlu memasukkan teks pada setiap baris dalam rentang Anda dapat dengan mudah melewati mereka dengan menekan ekstra j. .

Perhatikan bahwa untuk sejumlah besar penambahan yang berdekatan, pendekatan blok atau makro kemungkinan akan lebih unggul.

danprice
sumber
Senang melihat pendekatan lain.
Ibn Saeed
Saya lebih suka ini hanya beberapa baris. Jauh lebih mudah untuk mengeksekusi IMO.
Dan Bechard
Setelah Anda mengetikkan awalan yang Anda inginkan, tidakkah Anda perlu menekan tombol escape?
iamnotsam
41
  1. Pilih jalur yang ingin Anda modifikasi menggunakan CtrlV.
  2. Tekan:

    • I: Masukkan sebelum apa yang dipilih.
    • A: Tambahkan setelah apa yang dipilih.
    • c: Ganti apa yang dipilih.
  3. Ketikkan teks baru.

  4. Tekan Escuntuk menerapkan perubahan ke semua baris yang dipilih.
Loukan ElKadi
sumber
4
Luar biasa! Saya hanya menyoroti langkah terakhir Escuntuk nozel VIM seperti saya - butuh beberapa saat untuk mengetahui bahwa perubahan dapat disebarkan "nanti"!
Bugs Bunny
1
Bagus, tidak tahu tentang opsi "A" dan "C" juga.
hobbes3
Mengapa ini tidak berhasil v? Saya dapat melakukannya dengan Ctrl+V --> A, tetapi melakukan vuntuk memilih teks tidak berfungsi - Ahanya menambahkan ke baris itu. Bukankah keduanya seleksi? Juga, sangat aneh - Ahanya menambahkan ke ujung garis JIKA saya memperpanjang blok visual ke ujung garis; jika tidak ditambahkan di mana pun blok visual berakhir untuk setiap baris. Sepertinya tidak mengenali perbedaan antara adan A.
Alex G
1
Saya perlu menggunakan cbukan C, tapi itu berfungsi dengan baik. Terima kasih
Tarol
29

Saya akan menggunakan makro untuk merekam tindakan saya dan kemudian akan mengulanginya.

  1. Letakkan kursor Anda pada huruf pertama dalam nama .
  2. Tekan qquntuk mulai merekam ke dalam buffer q.
  3. Tekan iuntuk masuk ke mode sisipkan, ketik vector_ , lalu tekan Escuntuk meninggalkan mode sisipkan.
  4. Sekarang tekan 0untuk kembali ke awal baris.
  5. Sekarang tekan juntuk turun.
  6. Sekarang tekan qlagi untuk berhenti merekam.

Anda sekarang memiliki makro yang bagus.

Ketik 3@quntuk mengeksekusi makro Anda tiga kali untuk melakukan sisa baris.

Brian Neal
sumber
Apakah "q" istimewa (untuk "makro cepat"?)?
Peter Mortensen
Bagaimana makro dibuat persisten (bekerja di beberapa sesi)?
Peter Mortensen
@PeterMortensen Vim memiliki fitur yang disebut sesi yang akan bertahan buffer (dan banyak hal lainnya) yang dapat Anda lihat.
Brian Neal
27
:%s/^/vendor_/

atau aku melewatkan sesuatu?

srini.venigalla
sumber
Anda kehilangan fakta bahwa itu kemungkinan subteks dalam file dengan banyak baris lain di mana vender_awalan tidak diinginkan.
Dan Bechard
9
@dan Jika hanya subteks yang diperlukan, Anda dapat membatasi pencarian ke serangkaian nomor baris, misalnya1,4s/^/vendor_/
Brad Koch
1
@BradKoch Menarik. Saya tidak mengetahui batasan nomor baris, terima kasih untuk itu.
Dan Bechard
8
itu menarik, tapi apa yang lebih praktis adalah untuk visual memblokir pilih dengan Vdan ketik :. Ini akan :'<,'>:'<,'>s/^/vendor_/
mengawali
12

Diperbarui Januari 2016

Sementara jawaban yang diterima adalah solusi yang bagus, ini sebenarnya sedikit lebih sedikit penekanan tombol, dan skala lebih baik berdasarkan prinsip pada jawaban yang diterima.

  1. Pindahkan kursor ke ndalam name.
  2. Masuk ke mode blok visual ( ctrlv).
  3. tekan 3j
  4. Tekan I.
  5. Ketikkan vendor_.
  6. Tekan esc.

ilustrasi visual

Catatan, ini memiliki penekanan tombol yang lebih sedikit daripada jawaban yang diterima yang disediakan (bandingkan Langkah 3). Kami hanya menghitung jumlah tindakan yang harus dilakukan.

Jika Anda memiliki nomor baris yang diaktifkan (seperti yang diilustrasikan di atas), dan tahu nomor baris yang ingin Anda pindahkan, maka langkah 3 dapat diubah ke # di Gmana # adalah nomor baris yang diinginkan.

Dalam contoh kita di atas, ini akan menjadi 4G. Namun ketika berurusan dengan hanya beberapa nomor baris, penghitungan eksplisit berfungsi dengan baik.

arcseldon
sumber
7

Saya ingin mengomentari banyak baris dalam beberapa file konfigurasi pada server yang hanya memiliki vi (tidak ada nano), jadi metode visualnya rumit juga. Begini caranya.

  1. Membuka file vi file
  2. Tampilkan nomor baris :set number!atau:set number
  3. Kemudian gunakan nomor baris untuk mengganti awal dengan "#", bagaimana?

:35,77s/^/#/

Catatan: angkanya inklusif, garis dari 35 hingga 77, keduanya termasuk akan dimodifikasi.

Untuk menghapus komentar / membatalkannya, cukup gunakan :35,77s/^#//

Jika Anda ingin menambahkan kata teks sebagai komentar setelah setiap baris kode, Anda juga dapat menggunakan:

:35,77s/$/#test/ (untuk bahasa seperti Python)

:35,77s/;$/;\/\/test/ (untuk bahasa seperti Java)

kredit / referensi:

  1. /unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-number-using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once

komputasifreak
sumber
Ini adalah solusi sempurna bagi saya karena saya sering hanya menggunakan vim-tiny.
JSON C11
7

Anda mungkin juga memiliki kasus penggunaan di mana Anda ingin menghapus blok teks dan menggantinya.

Seperti ini

Hello World

Hello World

Untuk

Hello Cool

Hello Cool

Anda bisa hanya visual blok pilih "Dunia" di kedua baris.

Ketik cuntuk perubahan - sekarang Anda akan berada dalam mode insert.

Masukkan barang yang Anda inginkan dan tekan escape.

Keduanya tercermin secara vertikal. Ini berfungsi seperti 'I', kecuali itu menggantikan blok dengan teks baru alih-alih menyisipkannya.

Nishant
sumber
6

Misalkan Anda memiliki file ini:

something

name
comment
phone
email

something else
and more ...

Anda ingin menambahkan "vendor_" di depan "nama", "komentar", "telepon", dan "email", terlepas dari di mana mereka muncul dalam file .

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

The cbendera akan meminta Anda untuk konfirmasi. Anda dapat membatalkannya jika Anda tidak menginginkan prompt.

Manish
sumber
5

Alternatif yang bisa lebih fleksibel:

Contoh: Untuk memasukkan teks XYZ di awal baris

:%norm IXYZ

Apa yang sedang terjadi disini?

  • % == Jalankan di setiap baris
  • norm == Jalankan kunci berikut dalam mode normal
  • I == Masukkan di awal baris
  • XYZ == Teks yang ingin Anda masukkan

Lalu Anda menekan Enter, dan itu dijalankan.

Khusus untuk permintaan Anda:

:%norm Ivendor_

Anda juga dapat memilih rentang tertentu:

:2,4norm Ivendor_

Atau jalankan melalui rentang visual yang dipilih:

:'<,'>norm Ivendor_
Aubrey Lavigne
sumber
1
apakah mungkin untuk mengirim urutan kunci seperti <Esc> saat dalam mode insert (norm Iabc <ESC>) untuk melakukan hal-hal yang lebih menarik?
batbrat
1
@batbrat Saya baru saja mengetahui hal ini! Anda dapat menekan ctrl-v ctrl-[untuk memasukkan "escaped Esc", yang menarik Anda kembali ke "mode normal" untuk tujuan perintah normal Anda. Saya baru saja menguji ini dengan '<,'>norm Iaa^[ysiw", di mana ^[Esc melarikan diri.
Aubrey Lavigne
4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line
Arpan Saini
sumber
apakah metode ini berfungsi untuk semua versi vim atau memerlukan plugin vim? alasan mengapa saya bertanya adalah b / c kadang-kadang berfungsi pada beberapa mesin, tetapi kadang tidak. saya tidak tahu perbedaannya. vim yang datang dengan git di windows - saya tidak bisa membuatnya bekerja. pada beberapa mesin ubuntu dan centos linux, saya tidak bisa membuatnya berfungsi. Saya telah sukses dalam beberapa kasus yang jarang, tetapi saya tidak dapat mereproduksi keberhasilan. itu adalah misteri. sepertinya tidak ada yang terjadi setelah saya menekan ESC.
davidj411
anehnya, ini TIDAK bekerja untuk saya sekarang. tidak ada yang berubah, kecuali mungkin bintang-bintang :) sambil mencari solusi untuk masalah saya, saya memang menemukan sesuatu di halaman ini yang menyebutkan sesuatu untuk dicari di vim vim.wikia.com/wiki/Inserting_text_in_multiple_lines Di Vim, periksa apakah Anda memiliki fitur blockwise-operator (I, A, dan lainnya) dengan memasukkan perintah: version. Outputnya harus mencakup + visualextra.
davidj411
Saya bermaksud menambahkan komentar secara umum, bukan jawaban Anda. Sebagian besar jawaban ini mengatakan hal yang sama tetapi menggunakan kata-kata yang berbeda. Milik saya memiliki sesuatu yang berbeda untuk ditawarkan dan termasuk tautan.
davidj411
2
  1. Ctrl + v untuk menuju ke mode blok visual
  2. Pilih garis menggunakan panah atas dan bawah
  3. Masukkan huruf kecil 3i(tekan huruf kecil I tiga kali)
  4. I(tekan modal I. Itu akan membawa Anda ke mode penyisipan.)
  5. Tulis teks yang ingin Anda tambahkan
  6. Esc
  7. Tekan panah bawah
Arpan Saini
sumber