Mengulang karakter dalam mode sisipkan VIM


141

Apakah ada cara pengulangan karakter saat dalam mode insert Vim? Sebagai contoh, katakan saya ingin memasukkan 80 tanda hubung, dalam sesuatu seperti emacs saya akan mengetik:

Ctrl+U   8 0 -

Satu-satunya cara saya tahu bagaimana melakukannya di VIM adalah keluar dari mode normal untuk argumen repeat, kemudian kembali ke mode insert untuk mengetikkan dash, kemudian keluar untuk memasukkan strip yang sebenarnya, DAN kemudian kembali ke mode insert untuk melanjutkan mengetik. Urutannya sangat panjang:

Esc 8 0 a - Esc a

Alangkah baiknya untuk tidak masuk dan keluar dari mode.

Jawaban:


20

Versi yang sedikit berbeda dari solusi Eelvex:

function! Repeat()
    let times = input("Count: ")
    let char  = input("Char: ")
    exe ":normal a" . repeat(char, times)
endfunction

imap <C-u> <C-o>:call Repeat()<cr>

259

Jika Anda OK dengan meninggalkan mode INSERT hanya sekali (di akhir), urutan ini berfungsi:

Ctrl+o 80i- Esc

  • Ctrl+ odigunakan untuk mengeluarkan perintah normal tanpa meninggalkan mode INSERT,
  • 80 pengulangan,
  • i untuk memasukkan,
  • - karakter yang ingin Anda masukkan,
  • Esc untuk meninggalkan mode INSERT.

Satu lagi tanpa PERNAH meninggalkan mode INSERT:

Ctrl+o :norm 8ia Return


6
Jawaban Anda dan jawaban OP adalah satu-satunya yang bekerja untuk saya.
twblamer

34
"<Co> digunakan untuk mengeluarkan perintah normal tanpa keluar dari mode INSERT" memenangkan penghargaan saya yang tidak dapat dipercaya - saya tidak pernah tahu tentang ini!
Stabledog

11
<C-o>adalah singkatan untuk Ctrl+ o.
Shaun Luttin

3
Ada juga :normalperintah yang memungkinkan Anda mengeluarkannya dari command prompt. Sesekali cukup bermanfaat.
Mark Reed

157

Escnic Esc Esc.

Misalnya Esc4iJEsc Escakan menampilkan JJJJ.


3
Sayangnya itu tidak berfungsi pada vim saya kecuali Anda melarikan diri kembali ke mode normal.
Cthutu

5
Tapi ini adalah jawaban terbaik dalam "cara vim".
Drasill

1
Saya selalu menemukan diri saya kembali ke mode insert ketika saya menekan i, jadi saya hanya akan memasukkan CHARACTER. Bagaimana saya mengerjakan ini?
Severo Raz

1
Ini adalah urutan tepat dari perintah yang ingin dihindari OP .
Kenny Evitt

1
Ini mungkin bukan jawaban untuk pertanyaan yang diajukan, tetapi ini adalah cara yang tepat untuk melakukannya dan itu adalah jawaban untuk pertanyaan yang saya cari.
Michael Leonard

20
<ESC> 
<the number of times you want to repeat>
i 
<the char you want to repeat> 
<ESC>

for example: <ESC>12ia<ESC> will insert 12 a's.

8
Ini adalah urutan tepat dari perintah yang ingin dihindari OP .
Kenny Evitt

13

Melalui pengulangan tunggal:

Insert mode
-
Esc
80.

Lebih detail tentang pengulangan tunggal: :help .


Terima kasih tetapi solusi ini mengharuskan Anda keluar dari mode penyisipan.
Cthutu

8

Anda juga bisa melakukannya, Escnihello there EscEsc

di mana, n adalah jumlah pengulangan.

misalnya, Esc5ihello there EscEsc


Ini terlihat seperti duplikat jawaban Martin Beckett
mkobit

Ini bukan duplikat yang tepat. Yang lain tidak bekerja untuk saya. Di sini saya menyadari bahwa saya harus menekan Escdua kali sesudahnya. Terima kasih @prashant
Sridhar Sarnobat

7

Ada banyak cara lain tetapi AFAIK yang Anda gambarkan adalah yang terpendek. Dalam vim Anda sebagian besar seharusnya menghabiskan waktu Anda dalam mode perintah, sehingga hanya akan menjadi 3 penekanan tombol + jumlah pengulangan (80-).

Namun, jika Anda sering menggunakan hal yang berulang ini, Anda bisa menjadikan diri Anda fungsi atau makro untuk tujuan itu; mungkin sesuatu seperti:

:function Repeat(char)
: let counter = input("How many times?: ")
: call feedkeys("i")
: call feedkeys(repeat(a:char,counter))
:endfunction
:imap <C-U> <ESC>h"ryl :call Repeat(@r)<CR>

Itu tidak berhasil untuk saya tetapi terima kasih atas jawabannya. Pengetahuan saya tentang bahasa pemrograman vim tidak cukup baik untuk mencari tahu mengapa.
Cthutu

6

Anda bilang akan 'menyenangkan' untuk tetap dalam mode 'Sisipkan', namun dalam Mode Perintah metode berikut ini akan menghindari ke-2 Anda ESC: -

Meskipun saya tahu posting ini sudah tua, sepertinya sayang untuk melewatkan opsi 'Potong / Salin dan Tempel' yang jelas ...

x ...memotong

80 ...jumlah salinan

p Tempel

Catatan: Ini mirip dengan metode yang disarankan oleh Martin Beckett, namun saya mendapatkan penundaan saat mengeluarkan perintah itu, mungkin karena ia mengganti mode beberapa kali, perintah ini dijalankan secara instan.


1
Saya harus menggunakan v yuntuk masuk ke mode visual, lalu menarik, lalu 80 pmenempelkannya 80 kali. Apakah saya melewatkan sesuatu, atau apakah Anda lupa langkah?
alexanderbird

Terlihat dengan baik, saya seharusnya menggunakan 'x' untuk memotong, lalu tempel. Terima kasih, saya telah mengubah jawaban saya.
Inyoka

1
bagus karena ini sebenarnya lebih cepat daripada metode pengulangan yang khas.
Auxiliary

3

Jawaban terlambat tetapi untuk apa nilainya, jika Anda ingin mengirimnya dengan spam, Anda dapat menggunakan perintah "repeat last command": .

i"Frase" Esc -i to insert, enter phrase/character, esc to go normal mode

. - Spam till you are satisfied. Will repeatedly input the phrase you typed (it repeats your last command).

Saya menemukan ini sangat berguna ketika saya tidak tahu persis berapa banyak pengulangan yang ingin saya lakukan, tetapi tahu secara visual berapa lama saya inginkan. Pada dasarnya ledakan .sampai mataku puas.


3

Saya terkejut belum ada yang menyarankan ini:

Dalam mode Sisipkan, gunakan <C-r>=repeat('-', 80)<CR>

Itu adalah:

  • tekan Ctrl-r=
  • Pada prompt yang dihasilkan, masukkan repeat('-', 80)
  • tekan Enter

Berfungsi untuk mengulang karakter apa saja beberapa kali.

Ini menggunakan lebih banyak penekanan tombol daripada jawaban @ romainl, tetapi tidak meninggalkan mode Sisipkan sama sekali.


2

Selain fungsi menulis yang akan mengulangi teks beberapa kali, Anda dapat menggunakan <C-x><C-l>: jika Anda sudah memiliki garis yang berisi 80 tanda hubung, menulis beberapa tanda hubung di awal baris baru dan kemudian menekan <C-x><C-l>akan menyelesaikan garis yang dimulai dengan beberapa tanda hubung yang akan mungkin garis itu dengan 80 garis. Saya biasa menulis garis horizontal (78 tanda hubung) dalam file bantuan sedemikian rupa.


1

Untuk tugas semudah abbreviationitu, lakukan triknya. Tambahkan berikut ini ke.vimrc

iab <expr> -- repeat('-', 80)

dan mulai sekarang, ketika Anda mengetik --diikuti oleh spasi (saat Anda dalam mode memasukkan), itu --akan secara otomatis dikonversi ke -80 kali.

Dengan menggunakan fungsi ini repeatAnda dapat mengulangi string sebanyak yang Anda inginkan.

Perhatikan bahwa Anda dapat mengujinya sebelum memperbarui .vimrcdengan masuk ke commandmode lalu mengeluarkan yang berikut ini:iab <expr> -- repeat('-', 80)


1

Saya melakukan ini tanpa keluar dari mode INSERT menggunakan langkah-langkah di bawah ini.

  1. Aktifkan mode INSERT.
  2. Ketikkan satu tanda hubung "-".
  3. Ctrl + O
  4. huruf kecil 'v' (untuk masuk ke -- (insert) VISUAL --mode)
  5. huruf kecil 'y' (untuk menyalin)
  6. Ctrl + O
  7. Tipe 80
  8. Kemudian, diikuti dengan huruf kecil 'p' (untuk tempel).

i - Ctrl+o v y Ctrl+o 80 p

Ini akan mencetak semua strip secara horizontal dalam satu baris.

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.