2010-04-20 14 views
9

Hola en Gvim Necesito insertar una línea en blanco o dos antes de cada comentario en el archivo.¿Cómo inserto una línea en blanco antes de cada comentario (por ejemplo, "#") en VIM?

Ej

#comment 1 
#comment 2 
statement 1 
statement 2 
#comment 3 

Después de ejecutar el comamnd debe ser

#comment 1 

#comment 2 
statement 1 
statement 2 

#comment 3 

¿Cómo puedo hacer esto?

Gracias

Actualización: Gracias por las respuestas

Pero si los comentarios son continuas, no quiero salto de línea que se añade entre ellos. ¿Hay alguna forma de hacer esto?

por ejemplo

#comment 1 
#comment 2 

yo no quiera que sea

#comment 1 

#comment 2 

Respuesta

20

También puede utilizar este comando: :g/^#/norm O

Ok, aquí es una explicación:

Este es un atajo de :global/^#/normal O que significa:

  • para cada línea que comienza con '#' (:global/^#/)
  • hacer comando 'O' en 'modo normal' (normal O) - lo que significa que hacer qué hace una tecla 'O' en el modo VIM 'normal' (no insertar y no: comando). Y 'O' inserta una nueva línea.
+0

Creo que esta es la mejor respuesta hasta el momento ya que es el más intuitivo, pero tal vez deberías explicar cómo y por qué funciona. – matias

+0

explicación agregada –

+0

': g [lobal]' triunfos ': s [ubstitute]' +1 por usted señor –

0

Use este comando: :%s/^\ze\s*#/\r/

1

No afecta a la primera línea

La salida de ejemplo se ve como no debería haber ningún salto de línea antes de la primera línea del archivo. Puede agregar lookbehind comprobar para lograr eso.

:%s/^\n\@<=\ze\s*#/\r/

\n\@<= Partidos sólo si hay un salto de línea antes de la posición actual, por lo que la primera línea no coincidirá. Para obtener más información, consulte :h \@<=

que también se puede hacer con una verificación de línea . La siguiente expresión regular coincide solo con aquellas líneas que no son la primera línea.

:%s/^\%>1l\ze\s*#/\r/

\%>1 Partidos debajo de la línea 1.Ver :h \%>l


Aquí hay algo que debería funcionar con la pregunta actualizado, es decir, solamente añadir un salto de línea antes de la línea actual, si hay ninguna línea de comentario antes de.

:g/^\%^\@<!\(^\s*#.*\n\)\@<!\s*#/norm O

^\%^\@<! no coinciden con esta línea si el principio del archivo es antes de ella. :h \%^ y: h \@<!

\(^\s*#.*\n\)\@<! Solo coincida con esta línea si el primer carácter que no está en blanco en la línea anterior no es #.

Esta expresión regular cambiará

 
#comment 1 
#comment 2 
statement 1 
statement 2 
#comment 3 

a

 
#comment 1 
#comment 2 
statement 1 
statement 2 

#comment 3 
2

hay una solución, que trabaja en el "VI no mejorada", así:

: 2, $ g/^ [ TAB] * #/s/^/^ M/

donde debe ingresar TAB y^M como el caracter de control correspondiente.

Espero que esto ayude - y quiero dar las gracias a Heikki por señalar en la primera línea problema

0

embargo, otra forma (que funciona para primera línea demasiado)

:s/^[ TAB]*#-1s/^/\r/ 
Cuestiones relacionadas