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.

Cthutu
sumber

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>
Matteo Riva
sumber
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

romainl
sumber
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.

Martin Beckett
sumber
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.
qed
sumber
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 .

itsnikolay
sumber
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

pemalu
sumber
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>
Eelvex
sumber
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.

Inyoka
sumber
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.

gowrath
sumber
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.

gpander
sumber
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.

ZyX
sumber
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)

Samir Sadek
sumber
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.

hel
sumber