HTML-Syntaxfaltung in VIM?

9

Ich habe mich gefragt, wie Syntaxfaltung am besten für HTML-Dateien verwendet werden kann. Insbesondere, wenn Javascript-Code in <script>Tags erkannt werden kann .

Ich habe getippt, set foldmethod=syntaxaber es scheint nicht zu falten. Muss ich meiner .vimrc noch etwas hinzufügen?

Ich weiß, dass ich zum Beispiel Javascript hinzufügen muss let javaScript_fold=1, bin mir aber nicht sicher, ob ich etwas Ähnliches für HTML hinzufügen muss.

Vielen Dank!

Sergio
quelle
5
Ja, das Standard-HTML-Syntaxskript bietet Faltung. Sofern Sie eine alternative Skript verwenden, das ist die Art und Weise Syntax Falten zu tun. Kann es JavaScript erkennen? Warum versuchst du es nicht einfach? Also, was ist deine Frage?!
Ingo Karkat
Du hast recht. Ich habe die Frage bearbeitet und möchte die Standard-HTML-Syntaxfaltung aktivieren. Vermisse ich etwas
Sergio

Antworten:

10

Dies 'foldmethod'ist eine fensterlokale Option. Das Einstellen von Ihrem ~/.vimrchat nicht unbedingt den richtigen Effekt.

Da die html Syntaxfaltung an den Dateityp gebunden ist , gehören diese Einstellungen zu ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Dies hängt davon filetype plugin onab ~/.vimrc, was Sie wahrscheinlich in Ihrem haben. Sie können dort auch andere verwandte Optionen konfigurieren, z foldcolumn=4.


Beachten Sie auch, dass das Standard-HTML-Syntax-Skript (ab Vim 7.4.1830) bisher nur ein mehrzeiliges Tag selbst faltet, nicht den Text zwischen dem öffnenden und dem schließenden Tag .

Also, das wird gefaltet:

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

Das geht aber nicht:

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

Um dies zu erreichen, müssen Sie das Syntax-Skript erweitern, z. B. über Folgendes, das am besten in ~/.vim/after/syntax/html.vim:

Alternative 1

Das Falten wird zwischen allen außer leeren HTML-Elementen durchgeführt (solchen, die kein schließendes Geschwister haben, wie <br>). Beigetragen von @zanona; Vielen Dank!

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

Folding erfolgt zwischen bestimmten ausdrücklich Struktur benannt (zB <head>), Absatzebene (zB <p>, <li>) und Zusatz (zB <script>) HTML - Tags.

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
quelle
Hey Ingo, ich bin mir nicht sicher, ob ich etwas falsch mache, aber es gibt keine Möglichkeit, eine HTML-Faltung basierend auf der Syntaxmethode zu erhalten. Nichts passiert? Ich habe eine exprbenutzerdefinierte Methode, die ich verwende, jedoch die Syntaxfaltung für CSS und Javascript deaktiviert. Wenn Sie syntaxJavascript und CSS verwenden, haben Sie erwartungsgemäß Falten, aber keines der HTML-Tags? Irgendwelche Ideen?
Zanona
1
@zanona: Sind die HTML-Tags richtig gefärbt? Manchmal bricht ein schlechtes CSS- oder JavaScript-Element die Syntax für den Rest des Dokuments. Die SyntaxAttr.vim - Syntax-Hervorhebungsattribute des Zeichens unter dem Cursor- Plugin anzeigen hilft bei der Fehlerbehebung. Überprüfen Sie die Syntaxgruppe des HTML-Tags (das nicht gefaltet werden kann), und überprüfen Sie, ob die entsprechende Syntaxregel enthalten ist fold.
Ingo Karkat
Danke Ingo! Ich werde das ausprobieren. Ich habe viele Variationen versucht, mit einer neuen HTML-Datei zu beginnen, alle Plugins zu entfernen usw., aber ich habe immer noch keine Faltung unter HTML. Ich werde mir das Plugin ansehen, das Sie gesendet haben. Hoffentlich kann das beim Debuggen helfen. Danke nochmal für deine Hilfe.
Zanona
1
@zanona: Danke für die detaillierte Analyse; Ich glaube ich weiß jetzt was das Problem ist. Die Standard-HTML-Syntax faltet nur mehrzeilige Tags selbst, Sie möchten jedoch Dinge zwischen dem Öffnen und Schließen von Tags falten. Das erfordert eine einfache Erweiterung des Syntax-Skripts. siehe meine Bearbeitung. Ich hatte das tatsächlich so lange in meiner Vim-Konfiguration, dass ich es vergessen habe!
Ingo Karkat
1
@zanona: Danke! Ihre Idee, die Auswahlkriterien für die HTML-Tags umzukehren, fügt eine nette Geste hinzu. Ich habe das der Antwort als (bessere) Alternative hinzugefügt.
Ingo Karkat