Anteponer solo líneas con texto en vim

3

Tengo una lista como la siguiente:

words
more words
here's more

skip space
words here
bananza!


D: look
more spaces
and words!

¿Cómo puedo insertar cosas al principio de solo esas líneas con texto? :%norm 0i*se pondrá *bien, pero como hace todas las líneas, también obtiene las líneas vacías. ¿Hay alguna manera de hacer esto sin tener que regresar y limpiar esos espacios en blanco (sé que serían solo *, por lo que no debería ser difícil de hacer, pero es un trabajo adicional)

Robar
fuente

Respuestas:

6

Algo como esto debería funcionar:

:%s/^\(.*[^\n]\)$/* \1/

EDITAR Dado que solicitó un desglose de la expresión regular:

:% Todas las lineas

s/Comienzo del comando sustituto; comenzar patrón

^ Comienzo de linea

\(Comienzo del grupo que queremos preservar. Esto será importante más adelante.

.* Cualquier cantidad de caracteres

[^\n] Algún personaje además de nueva línea

\) Fin de grupo

$ Fin de la línea

/ Fin del patrón, comienzo de la sustitución.

* \1Insertar *, luego el primer grupo que seleccionamos a la izquierda.

/ Fin de la sustitución y comando

objetivado
fuente
Esto funcionó! : D ¿Puede explicar cómo funciona? No soy bueno en expresiones regulares (léase, no sé nada), pero me gustaría poder 'obtener' esto. ¡Gracias!
Rob
En realidad, toma la primera de las líneas dobles en blanco. D: Veré si eso es solo culpa mía. EDITAR: no, aparentemente una línea en blanco que tiene una línea en blanco debajo no está en blanco. D:
Rob
s // está basado en líneas; ¿No podrías simplemente hacer s/^\(.\+\)$/* \1/?
Christian Mann
44
Eso es demasiado complicado, esto funciona:% s /^./* & /
Heptita
1
@Heptite, las líneas en blanco que consisten en un carácter de espacio también coincidirían. Probablemente la mejor manera de especificar sólo las líneas que contienen un carácter no en blanco mediante el uso/.*\S.*/
Firstrock
3

Tratar

:g/\S/s/^/* /

g/\S/es un operador de rango (análogo a %excepto que selecciona todas las líneas con un carácter no en blanco).

s/^/* / inserta "*" al comienzo de cada línea seleccionada.

Esto evita el problema con la respuesta de @ objectified de colocar el prefijo en la primera línea de una secuencia de doble línea en blanco.

A continuación se agrega "*" al final de cada línea seleccionada.

:g/\S/s/$/ */
Firstrock
fuente
¡Gracias! ¡Estos son geniales y he descubierto algunas cosas jugando con ellos!
Rob el