Sintaks HTML lipat dalam VIM?

9

Saya bertanya-tanya mana yang merupakan cara terbaik untuk menggunakan sintaks lipat untuk file HTML. Khususnya jika dapat mengenali kode javascript di dalam <script>tag.

Saya mengetik set foldmethod=syntaxtetapi tampaknya tidak melakukan pelipatan. Apakah saya harus menambahkan sesuatu ke .vimrc saya?

Saya tahu untuk javascript, misalnya, saya perlu menambahkan let javaScript_fold=1tetapi saya tidak yakin apakah saya harus menambahkan sesuatu yang serupa untuk HTML.

Terima kasih!

Sergio
sumber
5
Ya, skrip sintaks HTML default memberikan pelipatan. Kecuali jika Anda menggunakan script alternatif, itulah yang cara untuk melakukan sintaks lipat. Bisakah itu mengenali JavaScript? Mengapa Anda tidak mencoba saja? Jadi, apa pertanyaanmu ?!
Ingo Karkat
Kamu benar. Saya mengedit pertanyaan, saya ingin mengaktifkan lipat sintaks HTML default. Apakah saya melewatkan sesuatu?
Sergio

Jawaban:

10

Ini 'foldmethod'adalah opsi jendela-lokal; pengaturan dari Anda ~/.vimrctidak selalu memiliki efek yang tepat.

Karena lipatan sintaks terikat pada html filetype , pengaturan ini milik ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Ini tergantung pada milik filetype plugin onAnda ~/.vimrc, yang mungkin Anda miliki. Anda juga dapat mengonfigurasi opsi terkait lainnya di sana, mis foldcolumn=4.


Perhatikan juga sejauh ini (pada Vim 7.4.1830), skrip sintaks HTML default hanya melipat tag multi-baris itu sendiri, bukan teks antara tag pembuka dan penutup .

Jadi, ini terlipat:

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

Tetapi ini tidak:

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

Untuk mendapatkan ini, Anda perlu memperluas skrip sintaksis, misalnya melalui yang berikut ini, ditempatkan ke ~/.vim/after/syntax/html.vim:

Alternatif 1

Lipat dilakukan antara semua kecuali elemen html batal (yang tidak memiliki saudara kandung, seperti <br>). Dikontribusikan oleh @zanona; Terima kasih!

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

Alternatif 2

Lipat dilakukan antara struktural tertentu (misalnya <head>), tingkat paragraf (misalnya <p>, <li>) dan <script>tag HTML tambahan (misalnya ).

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
sumber
Hai Ingo, saya tidak yakin apakah saya melakukan kesalahan, tetapi tidak ada cara saya dapat melipat HTML berdasarkan metode sintaks, tidak ada yang terjadi? Saya memiliki exprmetode khusus yang saya gunakan, namun menonaktifkan sintaks lipat untuk css dan javascript. Saat menggunakan syntaxjavascript dan css memiliki lipatan seperti yang diharapkan tetapi tidak ada tag HTML yang melakukannya? Ada ide?
Zanona
1
@zanona: Apakah tag HTML berwarna dengan benar? Kadang-kadang elemen CSS atau JavaScript yang buruk memecah sintaks untuk sisa dokumen. The SyntaxAttr.vim - Tampilkan sintaks atribut dari karakter di bawah kursor plugin membantu dengan pemecahan masalah. Periksa grup sintaks dari tag HTML (gagal dilipat), lalu periksa apakah ada aturan sintaksis yang terkait folddi dalamnya.
Ingo Karkat
Ingo terima kasih! Saya akan mencobanya. Saya telah mencoba banyak variasi mulai dengan file html baru, menghapus semua plugin, dll tetapi saya masih belum melipat di bawah HTML. Saya akan melihat plugin yang Anda kirim. Semoga itu bisa membantu debugging. Sekali lagi terima kasih atas bantuan Anda.
Zanona
1
@zanona: Terima kasih atas analisis terperinci; Saya pikir saya tahu sekarang apa masalahnya. Sintaks HTML default hanya melipat tag multi-baris itu sendiri, tetapi Anda ingin melipat barang di antara tag pembuka dan penutup. Itu membutuhkan ekstensi sederhana dari skrip sintaks; lihat hasil edit saya. Saya benar-benar memiliki ini dalam konfigurasi Vim saya begitu lama sehingga saya lupa!
Ingo Karkat
1
@zanona: Terima kasih! Gagasan Anda untuk membalikkan kriteria pemilihan untuk tag HTML menambahkan sentuhan yang bagus. Saya telah menambahkan itu ke jawabannya sebagai alternatif (lebih baik).
Ingo Karkat