Pliage de la syntaxe HTML dans VIM?

9

Je me demandais quelle est la meilleure façon d'utiliser le pliage de syntaxe pour les fichiers HTML. Surtout s'il peut reconnaître le code javascript dans les <script>balises.

J'ai tapé set foldmethod=syntaxmais il ne semble pas faire de pliage. Dois-je ajouter autre chose à mon .vimrc?

Je sais que pour javascript, par exemple, je dois ajouter let javaScript_fold=1mais je ne sais pas si je dois ajouter quelque chose de similaire pour HTML.

Merci!

Sergio
la source
5
Oui, le script de syntaxe HTML par défaut permet le pliage. À moins que vous n'utilisiez un autre script, c'est la façon de faire le pliage de la syntaxe. Peut-il reconnaître JavaScript? Pourquoi n'essayez-vous pas simplement? Alors, quelle est votre question?!
Ingo Karkat
Tu as raison. J'ai édité la question, je veux activer le pliage de la syntaxe HTML par défaut. Suis-je en train de manquer quelque chose?
Sergio

Réponses:

10

L' 'foldmethod'option est une fenêtre locale; le définir à partir de votre ~/.vimrcn'a pas nécessairement le bon effet.

Étant donné que le pliage de la syntaxe est lié au type de html fichier , ces paramètres appartiennent à ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Cela dépend de l'avoir filetype plugin ondans votre ~/.vimrc, ce que vous avez probablement. Vous pouvez également y configurer d'autres options connexes, par exemple foldcolumn=4.


Notez également que jusqu'à présent (à partir de Vim 7.4.1830), le script de syntaxe HTML par défaut ne plie qu'une balise multiligne elle-même, pas le texte entre la balise d'ouverture et de fermeture .

Donc, cela se replie:

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

Mais cela ne veut pas:

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

Pour cela, vous devez étendre le script de syntaxe, par exemple via ce qui suit, le mieux placé dans ~/.vim/after/syntax/html.vim:

Alternative 1

Le pliage est effectué entre tous les éléments html sauf vides (ceux qui n'ont pas de frère de fermeture, comme <br>). Contribué par @zanona; Merci!

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

Alternative 2

Le pliage est effectué entre certains de structure explicitement nommé (par exemple <head>), l' alinéa niveau (par exemple <p>, <li>) et accessoires (par exemple <script>) des balises HTML.

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
la source
Hey Ingo, je ne sais pas si je fais quelque chose de mal, mais il n'y a aucun moyen d'obtenir un pliage HTML basé sur la méthode de syntaxe, rien ne se passe? J'ai une exprméthode personnalisée que j'utilise, mais qui désactive le pliage de la syntaxe pour CSS et Javascript. Lorsque vous utilisez syntaxjavascript et css ont des plis comme prévu, mais aucune des balises HTML ne le font? Des idées?
zanona
1
@zanona: Les balises HTML sont-elles correctement colorées? Parfois, un mauvais élément CSS ou JavaScript rompt la syntaxe pour le reste du document. Le SyntaxAttr.vim - Afficher la syntaxe mettant en évidence les attributs de caractère sous le plug-in de curseur aide au dépannage. Vérifiez le groupe de syntaxe de la balise HTML (qui ne se replie pas), puis vérifiez que la règle de syntaxe correspondante folds'y trouve.
Ingo Karkat
Merci Ingo! Je vais essayer ça. J'ai essayé de nombreuses variantes pour commencer avec un nouveau fichier html, supprimer tous les plugins, etc. mais je n'ai toujours pas de pliage sous HTML. Je vais voir le plugin que vous avez envoyé. J'espère que cela pourra aider au débogage. Merci encore pour votre aide.
zanona
1
@zanona: Merci pour l'analyse détaillée; Je pense que je sais maintenant quel est le problème. La syntaxe HTML par défaut ne fait que le pliage des balises multi-lignes lui-même, mais vous voulez plier les trucs entre les balises d'ouverture et de fermeture. Cela nécessite une simple extension du script de syntaxe; voir mon montage. J'avais en fait ça dans ma configuration Vim depuis si longtemps que je l'ai oublié!
Ingo Karkat
1
@zanona: Merci! Votre idée d'inverser les critères de sélection des balises HTML ajoute une touche agréable. J'ai ajouté cela à la réponse comme une (meilleure) alternative.
Ingo Karkat du