2012-04-03 12 views
18

Actualmente tengo un gran archivo HTML que no tiene saltos de línea y simplemente aparece en una sola línea.Formato y sangría HTML en Vim

Quiero formatearlo en vim (macvim en particular). Probé las siguientes opciones, pero ninguna de ellas me funcionó.

  • Seleccionado el texto y presionado =. Esto solo intentará automáticamente el código. Pero como todo el código está presente en una línea, no hace nada
  • Intenté este complemento http://www.vim.org/scripts/script.php?script_id=3613 Este tipo de trabajo funciona pero solo insertará saltos de línea para la etiqueta actual. Quiero que se formatee todo el archivo

¿Hay alguna manera de hacerlo mediante un complemento o de otro modo?

Gracias!

+2

posible duplicado de [¿Cómo puedo ordenar la sangría de un archivo HTML en VI?] (Http://stackoverflow.com/questions/815548/how-do-i-tidy-up-an-html-files-indentation -in-vi) –

Respuesta

37

Una forma de iniciarlo es dividir todas las etiquetas en sus propias líneas.

:s/<[^>]*>/\r&\r/g 
:g/^$/d 

Si han flotando < o > símbolos (por ejemplo, HTML válido, operadores de comparación de JavaScript, CSS directo parte del selector descendiente), esto no funcionará correctamente y podría cambiar a algo así como acaba de hacer etiquetas de final - <\/[^>]*> . Proporciona un comienzo sólido, de todos modos.

Demostración:

Con un documento idealizada como este,

<!DOCTYPE html><html><head><title>hello</title></head><body>world</body></html> 

Esto produce esto:

<!DOCTYPE html> 
<html> 
<head> 
<title> 
hello 
</title> 
</head> 
<body> 
world 
</body> 
</html> 

Entonces, = producirá lo que quiere:

<!DOCTYPE html> 
<html> 
    <head> 
     <title> 
      hello 
     </title> 
    </head> 
    <body> 
     world 
    </body> 
</html> 
+0

Me gusta su enfoque. Pero hay un problema. El comando ': s/<[^>] *>/\ r & \ r/g' put es solo la primera etiqueta en la nueva línea. ¿Es posible hacer que funcione de forma recursiva? – Sudar

+0

Supongo que dejó el '/ g' al final. –

+0

No, no he omitido la/g al final. Supongo que como el número de líneas cambia después del primer reemplazo, no continúa. Incluso lo intenté en el html de muestra que tiene – Sudar

0

Sería mejor utilizar la utilidad de ordenado, as described in this answer.

buenas herramientas ya se han escrito para este trabajo

+0

Desafortunadamente, tidy does _not_ no pone cada etiqueta en una nueva línea, ni puede configurarse para hacer eso. Por ejemplo, '' no se dividirá (pero, de hecho, se condensará si se dividió en el documento original). – cemper93

+0

Eso es genial en principio, pero en la práctica hay muchos problemas de validación de HTML que probablemente enfrentará aquí. Usar Tidy como base aún huele como la ruta correcta. Formateo e indentación desde allí. –

3

Para un mejor resultado, se debe utilizar programas especializados de formato externos.

Puede integrar ambos tidy y html-beautify automáticamente instalando el complemento vim-autoformat. Después de eso, puede ejecutar cualquier formateador instalado con una sola pulsación de tecla.

+0

Estoy usando el complemento vim-autoformat que mencionó en estos días. – Sudar

Cuestiones relacionadas