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.

Cthutu
fuente

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

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

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

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

prashant
fuente
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>
Eelvex
fuente
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.

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

Gowrath
fuente
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.

gpanders
fuente
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.

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

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

hola
fuente