Cú pháp HTML gấp trong VIM?


9

Tôi đã tự hỏi đâu là cách tốt nhất để sử dụng cú pháp gấp cho các tệp HTML. Đặc biệt nếu nó có thể nhận ra mã javascript trong <script>thẻ.

Tôi gõ set foldmethod=syntaxnhưng dường như không làm được gì cả. Tôi có phải thêm cái gì khác vào .vimrc không?

Tôi biết ví dụ về javascript, tôi cần thêm let javaScript_fold=1nhưng tôi không chắc liệu tôi có phải thêm một cái gì đó tương tự cho HTML hay không.

Cảm ơn!


5
Có, tập lệnh cú pháp HTML mặc định cung cấp gấp. Trừ khi bạn sử dụng một kịch bản thay thế, đó là những cách để làm gấp cú pháp. Nó có thể nhận ra JavaScript không? Tại sao bạn không thử? Vậy, câu hỏi của bạn là gì?!
Ingo Karkat 1/03/2015

Bạn đúng rồi. Tôi đã chỉnh sửa câu hỏi, tôi muốn kích hoạt cú pháp HTML mặc định. Tui bỏ lỡ điều gì vậy?
Sergio

Câu trả lời:


10

Đây 'foldmethod'là một tùy chọn cửa sổ cục bộ; thiết lập nó từ bạn ~/.vimrckhông nhất thiết phải có hiệu quả đúng.

Vì cú pháp gấp được liên kết với kiểu html tệp , các cài đặt này thuộc về ~/.vim/after/ftplugin/html.vim:

setlocal foldmethod=syntax

Điều này phụ thuộc vào việc có filetype plugin ontrong bạn ~/.vimrc, mà bạn có thể có. Bạn cũng có thể cấu hình các tùy chọn liên quan khác ở đó, ví dụ foldcolumn=4.


Cũng lưu ý rằng cho đến nay (kể từ Vim 7.4.1830), tập lệnh cú pháp HTML mặc định chỉ tự gập một thẻ nhiều dòng chứ không phải văn bản giữa thẻ mở và thẻ đóng .

Vì vậy, điều này được gấp lại:

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

Nhưng điều này không:

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

Để có được điều này, bạn cần mở rộng tập lệnh cú pháp, ví dụ như thông qua các mục sau, được đặt tốt nhất vào ~/.vim/after/syntax/html.vim:

Phương án 1

Folding được thực hiện giữa tất cả trừ các phần tử html (những phần tử không có anh chị em đóng, như <br>). Đóng góp bởi @zanona; cảm ơn!

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

Phương án 2

Folding được thực hiện giữa một số tên một cách rõ ràng về cấu trúc (ví dụ <head>), đoạn cấp (ví dụ <p>, <li>) và phụ trợ (ví dụ <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

Này Ingo, tôi không chắc liệu tôi có làm gì sai không, nhưng không có cách nào tôi có thể nhận được bất kỳ gấp HTML nào dựa trên phương pháp cú pháp, không có gì xảy ra? Tôi có một exprphương thức tùy chỉnh mà tôi sử dụng, tuy nhiên đó là vô hiệu hóa cú pháp gấp cho css và javascript. Khi sử dụng syntaxjavascript và css có các nếp gấp như mong đợi nhưng không có thẻ HTML nào làm được? Có ý kiến ​​gì không?
zanona

1
@zanona: Các thẻ HTML có được tô màu đúng không? Đôi khi, một phần tử CSS hoặc JavaScript xấu phá vỡ cú pháp cho phần còn lại của tài liệu. Các SyntaxAttr.vim - Hiển thị nổi bật cú pháp thuộc tính của nhân vật dưới con trỏ Plugin giúp khắc phục sự cố. Kiểm tra nhóm cú pháp của thẻ HTML (không thể gập lại), sau đó kiểm tra xem quy tắc cú pháp tương ứng có foldtrong đó không.
Ingo Karkat

Cảm ơn Ingo! Tôi sẽ thử nó. Tôi đã thử nhiều biến thể bắt đầu với một tệp html mới, loại bỏ tất cả các plugin, v.v. nhưng tôi vẫn không có nếp gấp trong HTML. Tôi sẽ có một cái nhìn về các plugin bạn gửi. Hy vọng rằng sẽ có thể giúp gỡ lỗi. Cảm ơn một lần nữa vì sự giúp đỡ của bạn.
zanona

1
@zanona: Cảm ơn đã phân tích chi tiết; Tôi nghĩ bây giờ tôi biết vấn đề là gì. Cú pháp HTML mặc định chỉ thực hiện việc gấp các thẻ nhiều dòng, nhưng bạn muốn gấp các thứ ở giữa các thẻ mở và đóng. Điều đó cần một phần mở rộng đơn giản của tập lệnh cú pháp; xem chỉnh sửa của tôi. Tôi thực sự đã có cái này trong cấu hình Vim của tôi quá lâu đến nỗi tôi quên mất nó!
Ingo Karkat

1
@zanona: Cảm ơn! Ý tưởng của bạn về việc đảo ngược các tiêu chí lựa chọn cho các thẻ HTML thêm vào một liên lạc tốt đẹp. Tôi đã thêm nó vào câu trả lời như là một thay thế (tốt hơn).
Ingo Karkat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.