Sintassi HTML pieghevole in VIM?


9

Mi chiedevo quale sia il modo migliore per utilizzare la piegatura della sintassi per i file HTML. Specialmente se è in grado di riconoscere il codice javascript all'interno dei <script>tag.

Ho digitato set foldmethod=syntaxma non sembra fare alcuna piegatura. Devo aggiungere qualcos'altro al mio .vimrc?

Conosco javascript, ad esempio, devo aggiungere let javaScript_fold=1ma non sono sicuro di dover aggiungere qualcosa di simile per HTML.

Grazie!


5
Sì, lo script di sintassi HTML predefinito fornisce la piegatura. A meno che tu non usi uno script alternativo, questo è il modo di eseguire la piegatura della sintassi. Riesce a riconoscere JavaScript? Perché non ci provi semplicemente? Allora, qual è la tua domanda ?!
Ingo Karkat,

Hai ragione. Ho modificato la domanda, voglio abilitare la piegatura della sintassi HTML predefinita. Mi sto perdendo qualcosa?
Sergio

Risposte:


10

È 'foldmethod'un'opzione finestra locale; impostarlo dal tuo ~/.vimrcnon ha necessariamente l'effetto giusto.

Poiché la piegatura della sintassi è legata al tipo di html file , queste impostazioni appartengono a ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Dipende dall'avere filetype plugin onnel tuo ~/.vimrc, che probabilmente hai. È inoltre possibile configurare altre opzioni correlate lì, ad es foldcolumn=4.


Si noti inoltre che finora (a partire da Vim 7.4.1830), lo script di sintassi HTML predefinito piega solo un tag multilinea stesso, non il testo tra il tag di apertura e chiusura .

Quindi, questo viene piegato:

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

Ma questo non:

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

Per ottenere ciò, è necessario estendere lo script di sintassi, ad esempio tramite quanto segue, collocato in modo ottimale in ~/.vim/after/syntax/html.vim:

Alternativa 1

La piegatura viene eseguita tra tutti gli elementi html tranne quelli vuoti (quelli che non hanno un fratello di chiusura, come <br>). Contributo di @zanona; Grazie!

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

La piegatura viene eseguita tra determinati tag HTML strutturali (ad es. <head>), A livello di paragrafo (ad es <p>. <li>) E ausiliari (ad es. <script>).

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

Hey Ingo, non sono sicuro di aver fatto qualcosa di sbagliato, ma non c'è modo di ottenere un HTML pieghevole basato sul metodo di sintassi, non succede nulla? Ho un exprmetodo personalizzato che uso, tuttavia quella disabilita la piegatura della sintassi per CSS e JavaScript. Quando si utilizzano syntaxjavascript e css hanno le pieghe come previsto, ma nessuno dei tag HTML lo fa? Qualche idea?
zanona,

1
@zanona: i tag HTML sono colorati correttamente? A volte un elemento CSS o JavaScript errato interrompe la sintassi per il resto del documento. Lo SyntaxAttr.vim - Visualizza l'evidenziazione della sintassi attributi del carattere sotto il cursore plug aiuta con la risoluzione dei problemi. Controlla il gruppo di sintassi del tag HTML (che non riesce a piegare), quindi controlla che sia presente la regola di sintassi corrispondente fold.
Ingo Karkat,

Grazie Ingo! Lo proverò. Ho provato molte varianti di iniziare con un nuovo file html, rimuovere tutti i plugin, ecc. Ma non ho ancora alcuna piegatura in HTML. Daremo un'occhiata al plugin che hai inviato. Speriamo che sarà in grado di aiutare il debug. Grazie ancora per il vostro aiuto.
zanona,

1
@zanona: grazie per l'analisi dettagliata; Penso di sapere ora qual è il problema. La sintassi HTML predefinita esegue solo la piegatura dei tag multilinea stessa, ma si desidera piegare gli elementi tra i tag di apertura e chiusura. Ciò richiede una semplice estensione dello script di sintassi; vedi la mia modifica. In realtà l'ho avuto nella mia configurazione di Vim per così tanto tempo che me ne sono dimenticato!
Ingo Karkat,

1
@zanona: grazie! La tua idea di invertire i criteri di selezione per i tag HTML aggiunge un bel tocco. L'ho aggiunto alla risposta come alternativa (migliore).
Ingo Karkat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.