Répétition de caractères en mode d'insertion VIM

141

Existe-t-il un moyen de répéter un caractère en mode insertion de Vim? Par exemple, disons que je voudrais insérer 80 tirets, dans quelque chose comme emacs, je taperais:

Ctrl+U   8 0 -

La seule façon dont je sais comment le faire dans VIM est de quitter le mode normal pour l'argument de répétition, puis de revenir en mode insertion pour taper le tiret, puis de quitter pour insérer les tirets réels, ET puis de revenir en mode insertion pour continuer dactylographie. La séquence est vraiment longue:

Esc 8 0 a - Esc a

Ce serait bien de ne pas basculer entre les modes.

Cthutu
la source

Réponses:

20

Version légèrement différente de la solution d'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
la source
259

Si vous êtes d'accord pour quitter le mode INSERT une seule fois (à la fin), cette séquence fonctionne:

Ctrl+o 80i- Esc

  • Ctrl+ oest utilisé pour émettre des commandes normales sans quitter le mode INSERT,
  • 80 la répétition,
  • i insérer,
  • - le caractère que vous souhaitez insérer,
  • Esc pour quitter le mode INSERT.

Un autre sans JAMAIS quitter le mode INSERT:

Ctrl+o :norm 8ia Return

romainl
la source
6
Votre réponse et la réponse du PO sont les seules qui fonctionnent pour moi.
twblamer
34
"<Co> est utilisé pour émettre des commandes normales sans quitter le mode INSERT" remporte mon prix ne peux pas croire que je n'ai jamais su ce prix!
Stabledog
11
<C-o>est un raccourci pour Ctrl+ o.
Shaun Luttin
3
Il y a aussi la :normalcommande qui vous permet de les émettre à partir de l'invite de commande. Parfois très utile.
Mark Reed
157

Escnic Esc Esc.

Par exemple, Esc4iJEsc Escsortira JJJJ.

Martin Beckett
la source
3
Malheureusement, cela ne fonctionne pas sur mon vim à moins que vous ne reveniez en mode normal.
Cthutu
5
Mais c'est la meilleure réponse de la "manière vim".
Drasill
1
Je me retrouve toujours à retourner en mode insertion lorsque j'appuie sur le i, donc je n'insérerai que CARACTER. Comment est-ce que je travaille cela?
Severo Raz
1
C'est la séquence exacte de commandes que l'OP voulait éviter .
Kenny Evitt
1
Ce n'est peut-être pas la réponse à la question qui a été posée, mais c'est la façon vim de le faire et c'est la réponse à la question que je cherchais.
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
la source
8
C'est la séquence exacte de commandes que l'OP voulait éviter .
Kenny Evitt
13

Par répétition unique:

Insert mode
-
Esc
80.

Plus de détails sur la répétition unique: :help .

Itsnikolay
la source
Merci mais cette solution vous oblige à sortir du mode insertion.
Cthutu
8

Vous pouvez aussi faire, Escnihello there EscEsc

où, n est le nombre de répétitions.

par exemple, Esc5ihello there EscEsc

prashant
la source
Cela ressemble à une copie exacte de la réponse
mkobit
Ce n'est pas une copie exacte. L'autre n'a pas fonctionné pour moi. Ici, j'ai réalisé que je devais appuyer Escdeux fois après. Merci @prashant
Sridhar Sarnobat
7

Il existe de nombreux autres moyens mais AFAIK celui que vous décrivez est le plus court. Dans vim, vous êtes principalement censé passer votre temps en mode commande, donc ce serait juste 3 frappes + le nombre de répétitions (80i-).

Cependant, si vous constatez que vous utilisez très souvent cette répétition, vous pouvez créer vous-même une fonction ou une macro à cette fin; peut-être quelque chose comme:

: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
la source
Cela n'a pas fonctionné pour moi mais merci pour la réponse. Ma connaissance du langage de programmation vim n'est pas suffisante pour comprendre pourquoi.
Cthutu
6

Vous avez dit qu'il serait `` bien '' de rester en mode `` Insertion '', mais en mode Commande, la méthode suivante éviterait votre 2ème ESC: -

Bien que je sache que cet article est ancien, il semble dommage de manquer l'option évidente `` Couper / Copier et coller '' ...

x ...Couper

80 ...nombre de copies

p Pâte

Remarque: Ceci est similaire à la méthode suggérée par Martin Beckett, mais j'obtiens un délai lors de l'émission de cette commande, peut-être parce qu'elle change de mode plusieurs fois, cette commande s'exécute instantanément.

Inyoka
la source
1
J'ai dû utiliser v ypour entrer en mode visuel, puis tirer, puis 80 ple coller 80 fois. Est-ce que je manque quelque chose ou avez-vous oublié une étape?
alexanderbird
Bien repéré, j'aurais dû utiliser «x» pour couper, puis coller. Merci, j'ai modifié ma réponse.
Inyoka
1
bien car c'est en fait plus rapide que la méthode de répétition typique.
Auxiliaire du
3

Réponse tardive mais pour ce que ça vaut, si vous voulez le spammer, vous pouvez utiliser la commande "répéter la dernière commande": .

i"Phrase" 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).

Je trouve cela particulièrement utile lorsque je ne sais pas exactement combien de répétitions je veux faire, mais que je sais visuellement combien de temps je veux que cela dure. Fondamentalement, faites exploser .jusqu'à ce que mes yeux soient satisfaits.

Gowrath
la source
3

Je suis surpris que personne n'ait encore suggéré cela:

En mode Insertion, utilisez <C-r>=repeat('-', 80)<CR>

C'est:

  • presse Ctrl-r=
  • À l'invite résultante, entrez repeat('-', 80)
  • presse Enter

Fonctionne pour répéter n'importe quel caractère un nombre illimité de fois.

Cela utilise plus de frappes que la réponse de @ romainl, mais ne quitte pas du tout le mode Insertion.

gpanders
la source
2

En plus de la fonction d'écriture qui répétera le texte plusieurs fois, vous pouvez utiliser <C-x><C-l>: si vous avez déjà une ligne qui contient 80 tirets, écrire quelques tirets au début de la nouvelle ligne puis appuyer sur <C-x><C-l>va compléter les lignes qui commencent par ces quelques tirets qui être probablement cette ligne avec 80 tirets. J'écrivais des lignes horizontales (78 tirets) dans les fichiers d'aide de cette manière.

ZyX
la source
1

Pour une tâche aussi facile abbreviationdevrait faire l'affaire. Ajoutez ce qui suit à votre.vimrc

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

et à partir de maintenant, lorsque vous tapez --suivi d'un espace (pendant que vous êtes en mode insertion), le --sera automatiquement converti en- 80 fois.

En utilisant la fonction repeat vous pouvez répéter la chaîne autant de fois que vous le souhaitez.

Notez que vous pouvez le tester avant de mettre à jour le .vimrcen entrant en commandmode puis en émettant ce qui suit:iab <expr> -- repeat('-', 80)

Samir Sadek
la source
1

Je l'ai fait sans quitter le mode INSERT en suivant les étapes ci-dessous.

  1. Activez le mode INSERT.
  2. Tapez un tiret "-".
  3. Ctrl + O
  4. 'v' minuscule (pour entrer en -- (insert) VISUAL --mode)
  5. 'y' minuscule (à copier)
  6. Ctrl + O
  7. Type 80
  8. Ensuite, suivi de 'p' minuscule (pour coller).

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

Cela imprimera tous les tirets horizontalement sur une seule ligne.

hel
la source