Vim: ¿cómo pegar un bloque de texto al final de varias líneas?


32

Digamos que tengo un bloque de texto como este:

// Comentario1
// Comentario2
// Comentario3

Y quiero agregar cada una de estas líneas al final de 3 líneas de código correspondientes:

foo = 1;
bar = 2;
baz = 3;

Para que el resultado final sea

foo = 1; // Comentario1
bar = 2; // Comentario2
baz = 3; // Comentario3

¿Hay una manera fácil de hacer esto en Vim?


@Flimzy, desafortunadamente no. De vez en cuando, comentarios como el suyo aparecen en las preguntas de Vim, pero verifique esto: meta.stackexchange.com/q/25925/160504
sidyll

La mejor comunidad para esta pregunta es vi.stackexchange.com
thinwybk

Respuestas:


36

Utilice el modo de bloque visual ( Ctrl+ v) para seleccionar un conjunto de líneas, entonces o bien yo dellos.

Luego, si seleccionó las líneas foo, bar, baz, use el modo de bloque visual nuevamente para seleccionar la primera columna de las líneas de comentarios y luego Shift+ pen su lugar (o si seleccionó las líneas de comentarios, seleccione la última columna de la barra foo líneas y pellos en su lugar.

Tener el truco de posicionamiento puede requerir un poco de práctica, pero cuando tengas la habilidad, estarás volando. Cuando haya seleccionado un bloque, también puede usar Shift+ Apara agregar, por ejemplo, espacios al bloque (al agregar, el nuevo texto solo aparecerá en la línea superior, pero cuando presione esc aparecerá mágicamente en todas las líneas seleccionadas) . Del mismo modo, Shift+ ihará lo mismo al comienzo del bloque seleccionado en cada línea.

Sin embargo, tendrás que limpiar las líneas vacías después.

También hay un gran episodio de vimcasts que muestra estas técnicas con más detalle.


1
Encuentro esta solución junto con :set ve=allser muy versátil. Yo personalmente uso el complemento UnconditionalPaste ( vim.org/scripts/script.php?script_id=3355 ) ya que se ajusta un poco mejor a mi necesidad.
Peter Rincker

1

Bueno, si es fácil o no, dime. Navegue hasta // Comment 1, presione ddpara eliminar. Navegue a la línea con foo = 1;y presione p, para pegar debajo de la línea. Mueve hacia arriba foonuevamente y presiona Jpara unirte a la fila. Tada


0

Lo siguiente hará exactamente lo que usted describe:

:%s@\(\w\s\+=\s\+\(\d\+\)\)@\=submatch(1) . " // Comment" . submatch(2)@

Dependiendo de lo que en realidad necesita hecho (en comparación con el ejemplo), en la práctica, puede ser que sea más sencillo para bloquear a seleccionar el bloque "// comment1", etc ( Ctrlv), tirón ( y), ir al final del código Bloquear y pegar.

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.