Tirar y pegar mientras se incrementa

14

Estoy editando un archivo .sql en Vim:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),

Lo que estoy buscando hacer es tirar de la (1, 1),línea y pegarla 137 veces; sin embargo, quiero que el segundo número entre paréntesis se incremente cada vez. La salida se vería así:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),
(1, 2),
(1, 3),
...
(1, 137),

¿Hay alguna manera de hacerlo en Vim y, de ser así, qué comando usaría?

¡Gracias!

empuñaduras lisas
fuente

Respuestas:

11

Coloque el cursor en la (1, 1),línea y luego escriba:

qaVypt)<C-a>q135@a

Explicación

qacomienza la grabación de una macro dentro del registro a (puede elegir otra letra).

Vyp duplica la línea actual, seleccionando toda la línea (V), copiándola (y) y luego pegándola debajo (p).

t) mueva el cursor justo antes del siguiente paréntesis cerrado, de modo que esté en el segundo número.

<C-a>( Ctrly a) incrementa el número.

q finaliza la grabación de la macro.

135@avuelve a reproducir la macro almacenado en el registro a 135 veces.

Editar: Peter Rincker tiene un comando más corto:

qqYpW<c-a>q135@q

Las diferencias son:

utiliza el registro q para almacenar la macro (más rápido de escribir qqque qaporque es la misma tecla),
copia la línea con solo una pulsación de tecla Y(en lugar de dos Vy),
y mueve el cursor al segundo número con solo una pulsación de tecla W(en su lugar de t)).

Saginaw
fuente
44
Campo de Vim: qqyypW<c-a>q135@q. Incluso más corto si lo usa en Ylugar de yy.
Peter Rincker
9

Vims recientes han aprendido sobre el incremento de regiones visuales seleccionadas, así como la creación de una secuencia. Entonces puede hacer esto después de pegar su línea 137 veces:

1) seleccione visualmente en bloque ( Ctrl-V) el segundo 1 a partir de la línea 3.

2) presione gCtrl-A

He grabado un elenco de pantalla aquí

Descargo de responsabilidad: esto necesita un Vim 7.4.900 más o menos.

Christian Brabandt
fuente
Probado con éxito en Vim 7.4.826 en Debian / sid.
Dubu
¡Su screencast ha desaparecido pero este método es INCREÍBLE! Gracias.
david_nash
2

La forma fácil de entender / fácil de recordar / fácil de adaptar a otras situaciones para hacerlo: use el complemento VisIncr (si prefiere usar una versión que realmente sea agradable con los administradores de paquetes de este siglo en lugar de tratar con vimballs , puedes obtenerlo de GitHub ). Con eso:

  • ve a la (1, 1),línea y tira de ella:Vy
  • pégalo 136 veces: 136p
  • vaya a la segunda columna de 1y márquelo verticalmente:C-vGf)h
  • ejecuta el incremento: :II
  • leer el manual para obtener información sobre las otras golosinas: :help visincr.
Sato Katsura
fuente
1

Jugaría con g^a.

Tratar 137i0^v137kg^a.

Moisès
fuente
1
¡Bienvenidos a Vi y Vim ! He formateado tu respuesta usando Markdown. Sería aún mejor si edita para explicar cómo esto responde la pregunta de los OP.
D. Ben Knoble