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 ...
- Pilih semua 4 baris baris blok dengan menekan Vdan kemudian jempat kali.
- Indentasi dengan >.
- Kembali satu surat dengan h.
- Pergi ke blok mode visual dengan Ctrlv.
- Pilih empat baris dengan menekan jempat kali. Pada titik ini Anda telah memilih blok visual spasi 4x1 (empat baris dan satu kolom).
- Tekan C. Perhatikan ini cukup menjorok ke kiri oleh satu kolom.
- Ketik
" vendor_"
tanpa kutipan. Perhatikan ruang ekstra yang harus kami tempatkan kembali. - Tekan Esc. Ini adalah salah satu dari beberapa kali saya gunakan Escuntuk keluar dari mode insert. Ctrlchanya akan mengedit baris pertama.
- Ulangi langkah 1.
- 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 .
:s/models\./\0whatever./
\0
dengan&
.Jawaban:
n
dalamname
.I
( huruf kapital i).vendor_
. Catatan: Ini hanya akan memperbarui layar di baris pertama - sampai Escditekan (6.), pada titik mana semua baris akan diperbarui.I
Huruf besar harus digunakan daripada huruf kecili
, karena huruf kecili
ditafsirkan sebagai awal objek teks , yang agak berguna sendiri, misalnya untuk memilih di dalam blok tag (it
):sumber
j
atau^L
. Anda seharusnya melihat bahwa Vim tidak sibuk sama sekali; itu hanya menunggu. Kedua, coba ubah'timeout'
ke nilai yang lebih rendah, seperti80
(daripada default1000
) dan perhatikan bahwa waktu habis lebih cepat.timeoutlen
tidaktimeout
.A
daripadaI
, 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/
.Pendekatan lain adalah dengan menggunakan perintah .(
dot
) bersama dengan I.vendor_
)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.
sumber
Tekan:
Ketikkan teks baru.
sumber
Esc
untuk nozel VIM seperti saya - butuh beberapa saat untuk mengetahui bahwa perubahan dapat disebarkan "nanti"!v
? Saya dapat melakukannya denganCtrl+V --> A
, tetapi melakukanv
untuk memilih teks tidak berfungsi -A
hanya menambahkan ke baris itu. Bukankah keduanya seleksi? Juga, sangat aneh -A
hanya 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 antaraa
danA
.c
bukanC
, tapi itu berfungsi dengan baik. Terima kasihSaya akan menggunakan makro untuk merekam tindakan saya dan kemudian akan mengulanginya.
Anda sekarang memiliki makro yang bagus.
Ketik 3@quntuk mengeksekusi makro Anda tiga kali untuk melakukan sisa baris.
sumber
atau aku melewatkan sesuatu?
sumber
vender_
awalan tidak diinginkan.1,4s/^/vendor_/
V
dan ketik:
. Ini akan:'<,'>
:'<,'>s/^/vendor_/
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.
n
dalamname
.I
.vendor_
.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.
sumber
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.
vi file
:set number!
atau:set number
: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:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-number-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
sumber
Anda mungkin juga memiliki kasus penggunaan di mana Anda ingin menghapus blok teks dan menggantinya.
Seperti ini
Untuk
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.
sumber
Misalkan Anda memiliki file ini:
Anda ingin menambahkan "vendor_" di depan "nama", "komentar", "telepon", dan "email", terlepas dari di mana mereka muncul dalam file .
The
c
bendera akan meminta Anda untuk konfirmasi. Anda dapat membatalkannya jika Anda tidak menginginkan prompt.sumber
Alternatif yang bisa lebih fleksibel:
Contoh: Untuk memasukkan teks XYZ di awal baris
Apa yang sedang terjadi disini?
%
== Jalankan di setiap barisnorm
== Jalankan kunci berikut dalam mode normalI
== Masukkan di awal barisXYZ
== Teks yang ingin Anda masukkanLalu Anda menekan Enter, dan itu dijalankan.
Khusus untuk permintaan Anda:
Anda juga dapat memilih rentang tertentu:
Atau jalankan melalui rentang visual yang dipilih:
sumber
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.sumber
sumber