Làm cách nào để kích hoạt cú pháp ngôn ngữ cụ thể trong một di sản?


19

Khi tôi chỉnh sửa tệp PHP và tôi xác định một chuỗi trong di truyền, tính năng tô sáng cú pháp sẽ được bật bên trong di truyền nếu đó là cú pháp JavaScript hoặc cú pháp HTML hoặc cú pháp SQL. Tuy nhiên, nó sẽ không hoạt động cho cú pháp CSS.

Ví dụ (nếu chúng ta tạo một tệp PHP mới được gọi hello.phpvới mã sau):

<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;

Các JAVASCRIPTkhối được đánh dấu một cách chính xác, nhưng CSSkhối không phải là. Ngoài ra, nếu tôi chạy SynStacktrên vartừ khóa trên khối mã Javascript, tôi nhận được ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], nhưng nếu tôi làm như vậy để bất cứ nơi nào trong khối CSS, tôi chỉ nhận được ['phpRegion', 'phpHereDoc'], vì vậy tôi cần thêm một số cú pháp CSS làm nổi bật quy tắc. Các quy tắc cú pháp này được xác định ở đâu và làm cách nào để thêm chúng vào?


1
Lưu ý: // This should be syntax-highlightedkhông phải là một nhận xét CSS hợp lệ và do đó, nên được đánh dấu cú pháp dưới dạng một cái gì đó khác với một nhận xét. CSS chỉ hỗ trợ /* */bình luận nhiều dòng. //Nhận xét một dòng chỉ được hỗ trợ nếu bạn sử dụng các ngôn ngữ tiền xử lý như Sass hoặc Stylus.
Rory O'Kane

Bạn nói đúng. Tôi đã cập nhật mã để phản ánh sự thay đổi đó.
MrSnrub

Tôi cũng đang tìm kiếm một giải pháp cho tô sáng cú pháp CSS. Tôi đã thử nhiều kịch bản nhưng không thể làm việc được. Bất cứ ai cũng có một giải pháp?
Ken

Câu trả lời:


3

TL; DR:

Nó được định nghĩa trong các tệp cú pháp PHP và HTML của Vim. Để xem cách thêm quy tắc cho CSS, hãy chuyển đến phần Và làm cách nào để thêm vào chúng? dưới đây, hoặc đọc để giải thích về cách thức hoạt động của nó.

Những quy tắc cú pháp được xác định ở đâu?

JavaScript heredoc được tô sáng bằng tính năng cú pháp contains1 của Vim , cho phép các nhóm cú pháp chứa các nhóm cú pháp khác.

Để tìm nơi được xác định, trước tiên hãy mở tệp tô sáng cú pháp cho PHP:

:e $VIMRUNTIME/syntax/php.vim

Bây giờ, có lẽ tệp cú pháp đang tìm kiếm di truyền JavaScript dựa trên kết quả khớp của chuỗi "javascript", vì vậy hãy thử tìm kiếm:

/javascript

Trận đấu thứ ba là bình luận này:

" including HTML,JavaScript,SQL even if not enabled via options

Trông đầy hứa hẹn! Hãy xem dòng cú pháp có liên quan:

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

( tiếp tục dòng được thêm vào để dễ đọc hơn )

Được rồi, do đó, khu vực cú pháp này tìm thấy di truyền JavaScript với biểu thức chính quy phức tạp và cho phép tô sáng JavaScript trong khu vực bằng cách bao gồm @htmlJavascriptcú pháp cluster2 trong containsđối số.

Nhưng không có định nghĩa tương ứng cho CSS heredocs! Hãy thêm một. Vì vậy, điều đầu tiên để thay đổi là startbiểu thức thông thường. Chỉ cần thay đổi javascriptthành css:

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"

Điều này thật dễ dàng!

Nhưng chúng tôi không muốn làm nổi bật JavaScript trong di truyền CSS của chúng tôi. Vì vậy, chúng ta cũng cần thay đổi @htmlJavascripttương đương với CSS. Nhưng những gì CSS tương đương? (Bạn có thể đoán được, nhưng hãy chắc chắn chuyển động.)

Cho phép tìm kiếm htmljavascript3 để xem nơi được xác định:

/htmljavascript

Hừm. Không có kết quả khác. Nó phải được định nghĩa ở nơi khác! Chúng ta hãy xem nhanh phần trên cùng của tệp để xem liệu chúng ta có thể tìm thấy bất kỳ bao gồm:

runtime! syntax/html.vim

Có vẻ như nó có thể là 4 .

:e $VIMRUNTIME/syntax/html.vim

Chạy lại tìm kiếm trong tệp này và chúng tôi tìm thấy dòng 5 này :

syn cluster htmlJavaScript      add=@htmlPreproc

Vì vậy, htmlJavaScript là một cluster, được định nghĩa trong html.vim. Có một cụm tương tự cho CSS chúng ta có thể sử dụng?

/htmlcss

Vâng

syn include @htmlCss syntax/css.vim

Vì vậy, chúng ta chỉ cần thay thế @htmlJavascriptbằng @htmlCsstrong containsđối số:

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]

Và làm thế nào để tôi thêm vào chúng?

Lưu toàn bộ lệnh cú pháp bên dưới trong tệp ~/after/syntax/php.vimđể nó được chạy sau khi phần còn lại của quá trình xử lý cú pháp PHP được thực hiện và bạn đã hoàn tất!

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlCss,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

1: Xem :help :syn-containsđể biết chi tiết.
2: Xem :help :syn-cluster.
3: Tôi đã 'ignorecase'bật. Nếu không có nó, bạn sẽ cần tìm kiếm htmlJavascripthoặc \chtmljavascript
4: Trên thực tế, dựa trên sơ đồ đặt tên được sử dụng trong các tệp cú pháp Vim, có lẽ chúng ta có thể đã tìm ra điều này chỉ dựa trên htmlJavascripttên.
5: Với "JavaScript" được viết hoa khác nhau, lần này. May mắn là chúng ta đã được 'ignorecase'bật, hả?

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.