Sintaxis HTML plegado en VIM?

9

Me preguntaba cuál es la mejor manera de usar el plegado de sintaxis para archivos HTML. Especialmente si puede reconocer el código JavaScript dentro de las <script>etiquetas.

Escribí set foldmethod=syntaxpero parece que no se dobla. ¿Tengo que agregar algo más a mi .vimrc?

Sé que para JavaScript, por ejemplo, necesito agregar let javaScript_fold=1pero no estoy seguro de si tengo que agregar algo similar para HTML.

¡Gracias!

Sergio
fuente
55
Sí, el script de sintaxis HTML predeterminado proporciona plegado. A menos que use un script alternativo, esa es la forma de plegar la sintaxis. ¿Puede reconocer JavaScript? ¿Por qué no lo intentas simplemente? Entonces, ¿cuál es tu pregunta?
Ingo Karkat
Tienes razón. Edité la pregunta, quiero habilitar el plegado de sintaxis HTML predeterminado. ¿Me estoy perdiendo de algo?
Sergio

Respuestas:

10

La 'foldmethod'es una opción de ventana local; configurarlo desde su ~/.vimrcno necesariamente tiene el efecto correcto.

Debido a que el plegado de sintaxis está vinculado al tipo de html archivo , estas configuraciones pertenecen a ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Esto depende de tener filetype plugin onen tu ~/.vimrc, lo que probablemente tengas. También puede configurar otras opciones relacionadas allí, por ejemplo foldcolumn=4.


También tenga en cuenta que hasta ahora (a partir de Vim 7.4.1830), el script de sintaxis HTML predeterminado solo pliega una etiqueta de varias líneas, no el texto entre la etiqueta de apertura y la de cierre .

Entonces, esto se dobla:

<div
    class="foo"
    style="width: 100"
>

Pero esto no:

<div>
    <b>stuff in between</b>
</div>

Para obtener esto, debe extender el script de sintaxis, por ejemplo, a través de lo siguiente, mejor ubicado en ~/.vim/after/syntax/html.vim:

Alternativa 1

El plegado se realiza entre todos los elementos html, excepto los nulos (aquellos que no tienen un hermano de cierre, como <br>). Contribuido por @zanona; ¡Gracias!

syntax region htmlFold start="<\z(\<\(area\|base\|br\|col\|command\|embed\|hr\|img\|input\|keygen\|link\|meta\|para\|source\|track\|wbr\>\)\@![a-z-]\+\>\)\%(\_s*\_[^/]\?>\|\_s\_[^>]*\_[^>/]>\)" end="</\z1\_s*>" fold transparent keepend extend containedin=htmlHead,htmlH\d

Alternativa 2

El plegado se realiza entre ciertas etiquetas HTML estructurales (p <head>. Ej. ), De nivel de párrafo (p <p>. Ej . <li>) Y auxiliares (p <script>. Ej. ).

syntax region htmlFold start="<\z(p\|h\d\|i\?frame\|table\|colgroup\|thead\|tfoot\|tbody\|t[dhr]\|pre\|[diou]l\|li\|span\|div\|head\|script\|style\|blockquote\|form\)\%(\_s*\_[^/]\?>\|\_s\_[^>]*\_[^>/]>\)" end="</\z1\_s*>" fold transparent keepend extend containedin=htmlHead,htmlH\d
Ingo Karkat
fuente
Hola Ingo, no estoy seguro de si estoy haciendo algo mal, pero no hay forma de que pueda obtener ningún plegado HTML basado en el método de sintaxis, ¿no pasa nada? Tengo un exprmétodo personalizado que uso, sin embargo, deshabilité el plegado de sintaxis para css y javascript. Al usar syntaxjavascript y css tienen pliegues como se esperaba pero ninguna de las etiquetas HTML lo hace? ¿Algunas ideas?
zanona
1
@zanona: ¿Están las etiquetas HTML correctamente coloreadas? A veces, un elemento CSS o JavaScript incorrecto rompe la sintaxis para el resto del documento. El SyntaxAttr.vim - Mostrar resaltado de sintaxis atributos del carácter bajo el cursor plugin de ayuda a la resolución de problemas. Verifique el grupo de sintaxis de la etiqueta HTML (no se pliega), luego verifique que tenga la regla de sintaxis correspondiente fold.
Ingo Karkat
Gracias Ingo! Lo intentaré He intentado muchas variaciones de comenzar con un archivo html nuevo, eliminar todos los complementos, etc. pero todavía no tengo plegado en HTML. Echaré un vistazo al plugin que enviaste. Esperemos que eso pueda ayudar a la depuración. De nuevo, gracias por tu ayuda.
zanona
1
@zanona: Gracias por el análisis detallado; Creo que ahora sé cuál es el problema. La sintaxis HTML predeterminada solo dobla las etiquetas de varias líneas, pero desea plegar las cosas entre las etiquetas de apertura y cierre. Eso necesita una extensión simple del script de sintaxis; mira mi edición ¡De hecho, tuve esto en mi configuración de Vim durante tanto tiempo que lo olvidé!
Ingo Karkat
1
@zanona: ¡Gracias! Su idea de invertir los criterios de selección para las etiquetas HTML agrega un toque agradable. He agregado eso a la respuesta como una (mejor) alternativa.
Ingo Karkat