2012-07-03 28 views
61

En Vim, tengo el siguiente texto.¿Cómo agregar texto al final de cada línea en Vim?

key => value1 
key => value2 
key => value1111 
key => value12 
key => value1122222 

Me gustaría agregar "," al final de cada línea. El texto anterior será el siguiente:

key => value1, 
key => value2, 
key => value1111, 
key => value12, 
key => value1122222, 

¿Alguien sabe cómo hacer esto? ¿Es posible usar bloque visual para lograr esto?

+0

pregunta similares [aquí] (http://stackoverflow.com/questions/594448/how-can-i-add-to-the-end-of-each-line-in-vim). – glts

+0

Una de las razones por las que me encanta vim ... Más de una forma de hacer las cosas, y todas estas son efectivas y se ven elegantes. – 0xc0de

Respuesta

103

Esto lo hará a cada línea en el archivo:

:%s/$/,/ 

Si desea haga un subconjunto de líneas en lugar de todo el archivo, puede especificarlas en lugar del %.

Una forma es hacer una selección visual y luego escribir :. Se llenará en :'<,'> para usted, a continuación, escribir el resto de la misma (nótese que sólo tendrá que añadir s/$ /, /)

:'<,'>s/$/,/ 
+4

La última fila tiene un '' 'extra, debe ser': '<,'> s/$ /,/'. – cjg

16

modo ex es más fácil:

:%s/$/, 

: - enter command mode 
% - for every line 
s/ - substitute 
$ - the end of the line 
/- and change it to 
, - a comma 
1
:%s/$/,/g 

$ coincide final de la línea

+2

Eso agregará '$' a la línea también, no solo ','. – ZyX

+2

'/ g' se usa para realizar la sustitución en cada aparición en una línea. Como solo hay un '$' en una línea, puede soltarlo con seguridad. – romainl

+0

Sí, mi error en el, $. y el/g es de habbit, y sí es opcional. – kalhartt

10

El comando sustituto se puede aplicar a una selección visual. Haga un bloqueo visual sobre las líneas que desea cambiar, y escriba :, y observe que la línea de comandos se inicializa así: :'<,'>. Esto significa que el comando sustituto funcionará en la selección visual, así:

:'<,'>s/$/,/ 

Y esto es un cambio que debe trabajar por su ejemplo, suponiendo que realmente desea la coma al al final de cada línea de como has mencionado Si hay espacios finales, entonces puede que tenga que ajustar el comando en consecuencia:

:'<,'>s/\s*$/,/ 

Esto reemplazará cualquier cantidad de espacio en blanco que precede al final de la línea con una coma, eliminando de forma eficaz las espacios en blanco.

Los mismos comandos pueden operar en un rango de líneas, p. para las siguientes 5 líneas: :,+5s/$/,/, o para todo el buffer: :%s/$/,/.

34

Otra solución, usando otra gran característica:

:'<,'>norm A, 

Ver :help :normal.

+6

Me gustan estas respuestas que demuestran una característica menos conocida de vim. – Swiss

+0

@Swiss, le gustará [este comentario] (http://stackoverflow.com/questions/11303032/how-to-add-text-at-the-end-of-the-each-line-in-vim/ 11305004 # comment14879144_11306510), entonces. – romainl

+0

@Swiss, es posible que también le guste [exposición de udioca] (http://www.reddit.com/r/vimgolf/comments/wmtep/abusing_macros_part_1_normal/) en ': normal'. ¡Lo encontré informativo! – Conner

3

Si desea agregar '' al final de las líneas que comienzan con 'clave', utilice:

:%s/key.*$/&, 
+0

O ': g/key/s/$ /,'. Ver ': ayuda: global'. – romainl

102

De hecho, hay una manera de hacer esto utilizando el modo de bloque visual. Simplemente presionando $A en modo Bloque Visual se agrega al final de todas las líneas en la selección. El texto adjunto aparecerá en todas las líneas tan pronto como presione Esc.

Así que esta es una solución posible:

vip<C-V>$A,<Esc> 

Es decir, en el modo Normal, Visual seleccionar un párrafo vip, cambiar al modo de bloque Visual CTRLV, anexados para todas las líneas $A una coma ,, luego presione Esc para confirmar.

La documentación está en :h v_b_A. Incluso hay una ilustración de cómo funciona en la sección de ejemplos: :h v_b_A_example.

+0

Huh, no funciona para mí ... ¿Nueva función en una versión más nueva que la 7.2? Suena bien. – weronika

+1

No, esto es Vim estándar: Seleccione algunas líneas en el modo de bloque Visual (con 'C-V') luego mueva el cursor al final de la línea' $ 'y añádalas a todas' A'. Te encantará [': h v_b_A'] (http://vimdoc.sourceforge.net/htmldoc/visual.html#v_b_A), que es muy completo. – glts

+1

¡Oh, ya veo lo que está pasando! Usualmente uso Ctrl-C en lugar de para salir del modo de inserción, y aparentemente con Ctrl-C esto no funciona. Que extraño. – weronika

1

Tengo <M-DOWN> (flecha arriba y abajo) mapeado a <DOWN>. para poder repetir el último comando en una serie de líneas muy rápidamente. con este mapeo puedo:

A,<ESC> 

Y a continuación, mantenga la tecla ALT mientras presiona hacia abajo varias veces para anexar la coma al final de cada línea.
Esto funciona bien para mí porque permite un muy buen control sobre qué líneas no obtienen el cambio.
(También tengo las otras flechas asignada de manera similar para permitir la fácil repetición de .)

Aquí está la línea de mapeo para pegar en su vimrc:

map <M-DOWN> <DOWN>. 
Cuestiones relacionadas