¿Cómo agregar texto al final de cada línea en Vim?

116

En Vim, tengo el siguiente texto:

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

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

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

¿Alguien sabe como hacer esto? ¿Es posible usar el modo de bloque visual para lograr esto?

Grace Shao
fuente
Pregunta similar aquí .
glts

Respuestas:

163

Esto lo hará con cada línea del archivo:

:%s/$/,/

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

Una forma es hacer una selección visual y luego escribir :. Se completará :'<,'>por usted, luego escriba el resto (tenga en cuenta que solo necesita agregar s/$/,/)

:'<,'>s/$/,/
Alan Curry
fuente
4
La última fila tiene un extra ', debería ser :'<,'>s/$/,/.
cjg
¿Por qué no es necesario un g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen
@ ThorbjørnE.K.Christensen porque de /$/todos modos solo coincide una vez.
Bubaya
156

De hecho, hay una forma de hacer esto usando el modo de bloque Visual. Simplemente presionando $Aen el modo de 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.

Entonces esta es una posible solución:

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

Es decir, en el modo Normal, Visual seleccione un párrafo vip, cambie al modo de bloque Visual CTRLV, agregue a todas las líneas $Auna coma ,, luego presione Escpara confirmar.

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

glts
fuente
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 agréguelas a todas A. Te encantará :h v_b_A, que es realmente completo.
glts
1
¡Oh, ya veo lo que está pasando! Normalmente uso Ctrl-C en lugar de <Esc> para salir del modo de inserción, y aparentemente con Ctrl-C esto no funciona. Que extraño.
weronika
3
Puede guardar una pulsación de tecla utilizando <C-V>ipen lugar de vip<C-V>.
Aaron Thoma
1
@accolade, no entra en modo de bloqueo visual de esa manera y no funcionará. <CV> debe volver a suceder después si lo hace de esa manera.
imagineerThat
@imagineer Eso, raro, funciona para mí, debe deberse a alguna opción no predeterminada. (No 'virtualedit', lo probé). Confirmo que no funciona en un vim limpio. ¡Gracias por la nota!
Aaron Thoma
44

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

:'<,'>norm A,

Ver :help :normal.

romainl
fuente
1
@Swiss, entonces te gustará este comentario .
romainl
1
@Swiss, puede que también como udioca de exposé en :normal. ¡Lo encontré informativo!
Conner
1
No sabía nada de este subreddit. Gracias.
romainl
33

el modo ex es el más fácil:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma
Ned Batchelder
fuente
10

El comando sustituto se puede aplicar a una selección visual. Hacer un bloque visual sobre las líneas que desea cambiar y escriba :, y el aviso de que la línea de comandos se inicia de esta manera: :'<,'>. Esto significa que el comando sustituto operará en la selección visual, así:

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

Y esta es una sustitución que debería funcionar para su ejemplo, asumiendo que realmente desea la coma al final de cada línea como lo mencionó. Si hay espacios finales, es posible que deba ajustar el comando en consecuencia:

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

Esto reemplazará cualquier cantidad de espacio en blanco que preceda al final de la línea con una coma, eliminando efectivamente los espacios en blanco finales.

Los mismos comandos pueden operar en un rango de líneas, por ejemplo, para los próximos 5 líneas: :,+5s/$/,/, o para todo el buffer: :%s/$/,/.

pb2q
fuente
3

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

:%s/key.*$/&,
kiddorails
fuente
O :g/key/s/$/,. Ver :help :global.
romainl
2

He <M-DOWN>asignado (flecha hacia abajo alt) para <DOWN>.poder repetir el último comando en una serie de líneas muy rápidamente. con este mapeo puedo:

A,<ESC>

Y luego mantenga presionada la tecla alt mientras presiona hacia abajo repetidamente para agregar la coma al final de cada línea.
Esto funciona bien para mí porque permite un muy buen control sobre qué líneas hacen y qué no reciben el cambio.
(También tengo las otras flechas mapeadas de manera similar para permitir una fácil repetición .)

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

map <M-DOWN> <DOWN>.
Sam Brinck
fuente
1
:%s/$/,/g

$ coincide con el final de la línea

Kalhartt
fuente
2
Eso se sumará $a la línea también, no solo ,.
ZyX
2
/gse utiliza para realizar la sustitución en cada aparición en una línea. Debido a que solo hay uno $en una línea, puede soltarlo con seguridad.
romainl
Sí, mi error en el $. y la / g es de habbit, y sí, es opcional.
Kalhartt
1

La siguiente macro también se puede utilizar para realizar su tarea.

qqA,^[0jq4@q
dvk317960
fuente