166 votes

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

Est-il un moyen de la répétition d'un caractère tout dans Vim du mode d'insertion? Par exemple, disons que je voudrais insérer 80 tirets, dans quelque chose comme emacs, je voudrais type:

Ctrl+U 8 0 -

La seule façon que je sais comment le faire dans VIM est pour quitter le mode normal pour la répétition de l'argument, puis revenir en mode d'insertion de type le tableau de bord, puis la sortie pour insérer le réel tirets, puis revenez en mode d'insertion à réaliser sur le typage. La séquence est d'une très longue:

<ESC> 8 0 a - <ESC> a

Il serait agréable de ne pas basculer dans et hors des modes.

Merci

304voto

romainl Points 55506

Si vous êtes OK avec quitter le mode INSERTION qu'une seule fois (à la fin), cette séquence oeuvres <C-o>8ia<Esc>.

  • <C-o> est utilisé pour émettre des commandes habituelles sans quitter le mode INSERTION.
  • 8 de la répétition.
  • i pour l'insérer.
  • a la lettre que vous voulez taper.
  • <Esc> pour quitter le mode INSERTION

Un autre, sans JAMAIS quitter le mode INSERTION: <C-o>:norm 8ia<CR>.

189voto

Martin Beckett Points 60406

EscnicEsc.

E. g. Esc4iJEsc sortie JJJJ.

24voto

qed Points 1769
<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.

24voto

Matteo Riva Points 14340

Version légèrement différente de Eelvex de la solution:

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>

8voto

Eelvex Points 4331

Il existe de nombreuses autres façons, mais autant que je sache, celui que vous décrivez est le plus court. Dans vim, vous êtes surtout supposé passer votre temps en mode commande, alors que ce serait seulement 3 touches + le nombre de répétitions (80i-).

Toutefois, si vous trouvez que vous avez très souvent recours à cette répétition chose, vous pouvez faire 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X