VIM ekleme modunda tekrarlanan karakterler


141

Vim'in ekleme modundayken bir karakteri tekrarlamanın bir yolu var mı? Örneğin, 80 tire eklemek istiyorum, emacs gibi bir şeye yazarım:

Ctrl+U   8 0 -

VIM'de nasıl yapacağımı bilmemin tek yolu, tekrarlama argümanı için normal moddan çıkmak, sonra tire yazmak için ekleme moduna geri dönmek, ardından gerçek tire eklemek için çıkmak ve devam etmek için ekleme moduna geri dönmek yazıyor. Dizi gerçekten uzun:

Esc 8 0 a - Esc a

Modlara girip çıkmamak güzel olurdu.

Yanıtlar:


20

Eelvex'in çözümünün biraz farklı versiyonu:

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

INSERT modundan yalnızca bir kez (sonunda) çıkma konusunda sorun yaşıyorsanız, bu sıra çalışır:

Ctrl+o 80i- Esc

  • Ctrl+ oINSERT modundan çıkmadan normal komutlar vermek için kullanılır,
  • 80 tekrar,
  • i eklemek için,
  • - eklemek istediğiniz karakter,
  • Esc INSERT modundan çıkmak için.

INSERT modundan hiç çıkmadan başka bir tane daha:

Ctrl+o :norm 8ia Return


6
Cevabınız ve OP'nin yanıtı benim için çalışanlar.
twblamer

34
"<Co> INSERT modundan çıkmadan normal komutlar vermek için kullanılıyor" bu ödülle inanamıyorum, asla bilmiyordum!
Stabledog

11
<C-o>Ctrl+ için kısayol o.
Shaun Luttin

3
:normalBunları komut isteminden yayınlamanızı sağlayan bir komut da vardır . Bazen oldukça faydalı.
Mark Reed

157

Escnic Esc Esc.

Örneğin Esc4iJEsc Escçıktı alır JJJJ.


3
Ne yazık ki normal moda geri dönmezseniz bu benim vim üzerinde çalışmaz.
Cthutu

5
Ama bu "vim yolunda" en iyi cevap.
Drasill

1
Kendime her zaman i tuşuna bastığımda ekleme moduna geri döndüğümü görüyorum, bu yüzden sadece KARAKTER ekleyeceğim. Bunu nasıl yapabilirim?
Severo Raz

1
Bu OP'nin kaçınmak istediği komutların tam sırasıdır .
Kenny Evitt

1
Bu, sorulan sorunun cevabı olmayabilir, ancak bunu yapmanın vim yolu ve aradığım sorunun cevabı.
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
Bu OP'nin kaçınmak istediği komutların tam sırasıdır .
Kenny Evitt

13

Tek tekrar ile:

Insert mode
-
Esc
80.

Tek tekrar hakkında daha fazla bilgi: :help .


Teşekkürler, ancak bu çözüm ekleme modundan çıkmanızı gerektirir.
Cthutu


7

Başka birçok yol var ama tanımladığınız AFAIK en kısa olanı. In vim sadece 3 tuş vuruşlarını + tekrarların sayısı (80i-) olurdu böylece çoğunlukla, komut modunda zaman harcamak gerekiyor.

Bununla birlikte, bu tekrarlanan şeyi çok sık kullandığınızı fark ederseniz, kendinizi bu amaçla bir işlev veya makro yapabilirsiniz; belki şöyle bir şey:

: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>

Benim için işe yaramadı ama cevap için teşekkürler. Vim programlama dili hakkındaki bilgim, nedenini anlamaya yetecek kadar iyi değil.
Cthutu

6

'Ekle' modunda kalmanın 'iyi' olacağını söylediniz, ancak Komut Modunda aşağıdaki yöntem 2. ESC : -

Bu yazının eski olduğunu bilsem de, belirgin 'Kes / Kopyala ve Yapıştır' seçeneğini kaçırmak utanç verici görünüyor ...

x ...kesmek

80 ...kopya sayısı

p Yapıştırmak

Not: Bu, Martin Beckett tarafından önerilen yönteme benzer, ancak bu komutu verirken gecikme alıyorum, belki de modları birkaç kez değiştirdiği için bu komut anında yürütülür.


1
v yGörsel moda girmek, sonra çekilmek, sonra 80 p80 kez yapıştırmak için kullanmak zorunda kaldım . Bir şey mi kaçırıyorum yoksa bir adımı unuttun mu?
alexanderbird

İyi gördüm, kesmek için 'x' kullanmalı, sonra yapıştırmalıydım. Teşekkürler cevabımı değiştirdim.
Inyoka

1
güzel çünkü bu tipik tekrar yönteminden daha hızlı.
Yardımcı

3

Geç cevap, ancak değerine göre, spam göndermek istiyorsanız, "son komutu tekrarla" komutunu kullanabilirsiniz: .

i"Sıralı" 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).

Ne kadar tekrar yapmak istediğimi tam olarak bilmediğimde, ancak ne kadar sürmek istediğimi görsel olarak bildiğimde bunu yararlı buluyorum. Temelde .gözlerim memnun olana kadar patla.


3

Henüz kimse bunu önermedi şaşırdım:

Ekle modunda şunu kullanın: <C-r>=repeat('-', 80)<CR>

Yani:

  • Basın Ctrl-r=
  • Ortaya çıkan istemde şunu girin: repeat('-', 80)
  • Basın Enter

Herhangi bir karakteri istediğiniz kadar tekrarlamak için çalışır.

Bu, @ romainl'in cevabından daha fazla tuş vuruşu kullanır, ancak Ekle modundan hiç çıkmaz.


2

Metni birden çok kez tekrarlayan yazma işlevine ek olarak, şunları kullanabilirsiniz <C-x><C-l>: 80 çizgi içeren bir satırınız varsa, yeni satırın başlangıcında birkaç çizgi yazma ve ardından düğmesine basma <C-x><C-l>, bu birkaç çizgi ile başlayan satırları tamamlar. 80 çizgi ile bu çizgi olabilir. Yardım dosyalarına bu şekilde yatay çizgiler (78 tire) yazardım.


1

Böyle kolay bir iş abbreviationiçin hile yapmalı. Aşağıdakileri.vimrc

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

ve bundan --sonra, boşluk ekledikten sonra (ekleme modundayken), --otomatik olarak -80 kata dönüştürülecektir .

İşlevi kullanarak, repeatdizeyi istediğiniz kadar tekrarlayabilirsiniz.

Moduna girip aşağıdakileri .vimrcyaparak güncellemeden önce test edebileceğinizi unutmayın.command:iab <expr> -- repeat('-', 80)


1

Bunu aşağıdaki adımları kullanarak INSERT modundan çıkmadan yaptım.

  1. INSERT modunu etkinleştirin.
  2. Bir tire işareti "-" yazın.
  3. Ctrl + O
  4. küçük harf 'v' ( -- (insert) VISUAL --moda girmek için )
  5. küçük 'y' (kopyalamak için)
  6. Ctrl + O
  7. 80 Tipi
  8. Ardından, küçük harf 'p' (yapıştırmak için).

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

Bu, tüm çizgileri tek bir satıra yatay olarak yazdıracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.