Repetir caracteres en modo de inserción VIM


141

¿Hay alguna manera de repetir un personaje mientras está en el modo de inserción de Vim? Por ejemplo, digamos que me gustaría insertar 80 guiones, en algo como emacs escribiría:

Ctrl+U   8 0 -

La única forma en que sé cómo hacerlo en VIM es salir del modo normal para el argumento de repetición, luego volver al modo de inserción para escribir el guión, luego salir para insertar los guiones reales, Y luego volver al modo de inserción para continuar mecanografía. La secuencia es muy larga:

Esc 8 0 a - Esc a

Sería bueno no entrar y salir de los modos.

Respuestas:


20

Versión ligeramente diferente de la solución de 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

Si está de acuerdo en salir del modo INSERTAR solo una vez (al final), esta secuencia funciona:

Ctrl+o 80i- Esc

  • Ctrl+ ose usa para emitir comandos normales sin salir del modo INSERT,
  • 80 la repetición,
  • i para insertar,
  • - el personaje que quieres insertar,
  • Esc para salir del modo INSERTAR.

Otro sin salir del modo INSERTAR:

Ctrl+o :norm 8ia Return


66
Su respuesta y la respuesta del OP son las únicas que funcionan para mí.
twblamer

34
"<Co> se usa para emitir comandos normales sin salir del modo INSERT" ¡gana mi premio no puedo creer que nunca supe de este premio!
Stabledog

11
<C-o>es la abreviatura de Ctrl+ o.
Shaun Luttin

3
También está el :normalcomando que le permite emitirlos desde el símbolo del sistema. Ocasionalmente bastante útil.
Mark Reed

157

Escnic Esc Esc.

Por ejemplo, Esc4iJEsc Escsaldrá JJJJ.


3
Desafortunadamente, eso no funciona en mi vim a menos que escapes al modo normal.
Cthutu

55
Pero esta es la mejor respuesta en la "forma vim".
Drasill

1
Siempre vuelvo al modo de inserción cuando presiono la i, por lo que solo insertaré CARACTER. ¿Cómo trabajo esto?
Severo Raz

1
Esta es la secuencia exacta de comandos que el OP quería evitar .
Kenny Evitt

1
Puede que esta no sea la respuesta a la pregunta que se hizo, pero es la forma más rápida de hacerlo y es la respuesta a la pregunta que estaba buscando.
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
Esta es la secuencia exacta de comandos que el OP quería evitar .
Kenny Evitt

13

A través de una sola repetición:

Insert mode
-
Esc
80.

Más detalles sobre la repetición única: :help .


Gracias, pero esta solución requiere que salgas del modo de inserción.
Cthutu

8

También puedes hacer, Escnihello there EscEsc

donde, n es el número de repeticiones.

p.ej, Esc5ihello there EscEsc


Esto parece un duplicado exacto de la respuesta
mkobit

No es un duplicado exacto. El otro no funcionó para mí. Aquí me di cuenta de que tengo que presionar Escdos veces después. Gracias @prashant
Sridhar Sarnobat

7

Hay muchas otras formas, pero AFAIK, la que usted describe es la más corta. En vim , se supone que debes pasar tu tiempo en modo comando, por lo que serían solo 3 pulsaciones de teclas + el número de repeticiones (80i-).

Sin embargo, si descubres que a menudo utilizas esta repetición, puedes convertirte en una función o macro para ese fin; tal vez algo como:

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

No funcionó para mí, pero gracias por la respuesta. Mi conocimiento del lenguaje de programación vim no es lo suficientemente bueno para entender por qué.
Cthutu

6

Dijiste que sería 'agradable' permanecer en el modo 'Insertar', sin embargo, en el Modo Comando, el siguiente método evitaría tu segundo ESC:

Si bien sé que esta publicación es antigua, parece una pena perderse la obvia opción 'Cortar / Copiar y Pegar' ...

x ...cortar

80 ...número de copias

p Pegar

Nota: Esto es similar al método sugerido por Martin Beckett, sin embargo, recibo un retraso al emitir ese comando, tal vez porque cambia de modo varias veces, este comando se ejecuta instantáneamente.


1
Tuve que usar v ypara ingresar al modo visual, luego tirar, luego 80 ppegarlo 80 veces. ¿Me estoy perdiendo algo o olvidaste un paso?
alexanderbird

Bien visto, debería haber usado 'x' para cortar, luego pegar. Gracias, he modificado mi respuesta.
Inyoka

1
bueno, ya que esto es realmente más rápido que el método de repetición típico.
Auxiliar

3

Respuesta tardía, pero para lo que vale, si quieres enviarle correo no deseado, puedes usar el comando "repetir último comando": .

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).

Esto me resulta especialmente útil cuando no sé exactamente cuántas repeticiones quiero hacer, pero sé visualmente cuánto tiempo quiero que sea. Básicamente explotar .hasta que mis ojos estén contentos.


3

Me sorprende que nadie haya sugerido esto todavía:

En el modo Insertar, use <C-r>=repeat('-', 80)<CR>

Es decir:

  • prensa Ctrl-r=
  • En el indicador resultante, ingrese repeat('-', 80)
  • prensa Enter

Funciona para repetir cualquier personaje cualquier cantidad de veces.

Esto usa más teclas que la respuesta de @ romainl, pero no deja el modo Insertar en absoluto.


2

Además de la función de escritura que repetirá el texto varias veces, puede usar <C-x><C-l>: si ya tiene una línea que contiene 80 guiones, escribir algunos guiones al comienzo de la nueva línea y luego presionar <C-x><C-l>completará las líneas que comienzan con estos pocos guiones que Es probable que la línea con 80 guiones. Solía ​​escribir líneas horizontales (78 guiones) en los archivos de ayuda de esa manera.


1

Para una tarea tan fácil abbreviationdebería hacer el truco. Agregue lo siguiente a su.vimrc

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

y a partir de ahora, cuando escribe --seguido de un espacio (mientras está en modo de inserción), --se convertirá automáticamente a -80 veces.

Al usar la función repeat , puede repetir la cadena tantas veces como lo desee.

Tenga en cuenta que puede probarlo antes de actualizar .vimrcingresando en commandmodo y luego emitiendo lo siguiente:iab <expr> -- repeat('-', 80)


1

Hice esto sin salir del modo INSERTAR usando los pasos a continuación.

  1. Habilite el modo INSERTAR.
  2. Escriba un guión "-".
  3. Ctrl + O
  4. 'v' en minúscula (para ingresar al -- (insert) VISUAL --modo)
  5. minúscula 'y' (para copiar)
  6. Ctrl + O
  7. Tipo 80
  8. Luego, seguido de minúscula 'p' (para pegar).

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

Esto imprimirá todos los guiones horizontalmente en una sola línea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.