Bagaimana cara mengulangi edit pada beberapa baris di Vim?


122

Saya sadar bahwa di Vim saya sering dapat mengulangi perintah hanya dengan menambahkan angka di depannya. Misalnya, seseorang dapat menghapus 5 baris dengan:

5dd

Seringkali juga memungkinkan untuk menentukan rentang baris untuk menerapkan perintah, misalnya

:10,20s:hello:goodbye:gc

Bagaimana cara melakukan 'edit vertikal'? Saya ingin, misalnya, menyisipkan simbol tertentu, mengatakan koma, di awal (melewatkan spasi, yaitu apa yang akan Anda dapatkan jika Anda mengetikkan koma setelah Shift-I dalam mode perintah) dari setiap baris dalam jarak. Bagaimana ini bisa dicapai (tanpa menggunakan periode-turun-periode-turun)?

Jawaban:


107

:10,20s/^/,/

Atau gunakan makro, rekam dengan:

q a i , ESC j h q

Gunakan dengan:

@ a

Penjelasan: q amulai merekam makro untuk didaftarkan a, qmengakhiri perekaman. Ada register auntuk ztersedia untuk ini.


Terima kasih. Bagaimana jika saya menginginkan yang setara dengan shift-i? Artinya, melewatkan spasi awal?
saffsd

2
Penjelasan: ^\(\s*\)menangkap whitespace awal dan menyimpannya ke dalam register, yang kemudian dapat Anda baca \1.
Svante

136

Ctrl- vmasuk ke mode visual searah jarum jam. Anda kemudian dapat memindahkan ( hjkl-wise, seperti biasa), dan jika Anda ingin memasukkan sesuatu di beberapa baris, gunakan Shift- i.

Jadi untuk teksnya:

abc123abc
def456def
ghi789ghi

jika Anda menekan Ctrl- vdengan kursor di atas 1, tekan jdua kali untuk turun ke dua kolom, lalu Shift- i,ESC, teks Anda akan terlihat seperti ini:

abc,123abc
def,456def
ghi,789ghi

(penyisipan multi-baris memiliki sedikit jeda, dan tidak akan merender hingga SETELAH Anda menekan ESC).


3
Bagus. Ctrl-V berarti huruf besar, ngomong-ngomong, Anda bisa mengatakan Ctrl-Shift-v
Svante

8
sebenarnya, CTRL-v atau CTRL-V. Vim peka huruf besar kecil untuk kode CTRL (lihat: bantuan CTRL- {char}).
rampion

2
setelah mencari sedikit mengapa metode ini tidak berfungsi karena ia menggunakan huruf besar I (shift-i) daripada i (juga, itu hanya ctrl-v, karena ctrl-shift-v memindahkan saya ke akhir)
Willyfrog

4
Saya penasaran. Mengapa mereka tidak menggunakan saja itanpa tombol shift?
off99555

1
i tanpa shift dimasukkan pada posisi saat ini. shift + i dimasukkan di awal baris
Kevin P


44

Jika Anda sudah menggunakan '.' mengulangi banyak perintah terakhir Anda, maka saya menemukan ini sebagai solusi yang paling nyaman sejauh ini. Ini memungkinkan Anda untuk mengulangi perintah terakhir Anda pada setiap baris dari blok visual dengan menggunakan

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Ini membantu tetapi juga terbatas karena .garis operasi bijaksana dalam mode visual. Saya rasa mode visual dalam kasus ini terkadang dapat memudahkan untuk memilih rentang garis. Tetapi perintah dan makro lebih fleksibel dan kuat dalam kasus ini.
Bohr

23

Saya yakin cara termudah untuk melakukannya adalah

1) merekam makro untuk satu baris, sebut saja 'a'; dalam hal ini satu jenis

qa I, ESC jq

2) pilih blok garis yang ingin Anda terapkan makro

3) gunakan fungsi 'norm' untuk mengeksekusi makro 'a' di atas blok baris ini, yaitu,

:'<,'>norm@a

17

Menurut saya yang paling mudah adalah merekam makro, lalu ulangi makro sebanyak yang Anda inginkan. Misalnya untuk menambahkan koma di awal setiap baris, Anda mengetik:

q a I , ESC j q

untuk mengulanginya 5 kali, Anda masuk

5 @ a


2

Dengan suntingan Anda sudah disimpan di .operator, lakukan hal berikut:

  1. Pilih teks yang ingin Anda terapkan operator untuk menggunakan mode visual
  2. Lalu jalankan perintahnya :norm .

1

Terlepas dari makro, seperti yang telah dijawab, untuk kasus spesifik memasukkan koma dalam rentang baris (katakanlah dari baris 10 hingga 20), Anda mungkin melakukan sesuatu seperti:

:10,20s/\(.*\)/,\1

Artinya, Anda dapat membuat pertandingan grup bernomor dengan \ (dan \), dan menggunakan \ 1 di string pengganti untuk mengatakan "ganti dengan konten yang cocok".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.