Jak włączyć składnię specyficzną dla języka w heredoc?


19

Kiedy edytuję plik PHP i definiuję ciąg w heredoc, podświetlanie składni zostanie włączone wewnątrz heredoc, jeśli jest to składnia JavaScript lub HTML lub SQL. Jednak nie będzie działać dla składni CSS.

Przykład (jeśli tworzymy nowy plik PHP o nazwie hello.phpz następującym kodem):

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

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

JAVASCRIPTBlok jest zaznaczony poprawnie, ale CSSblok nie jest. Ponadto, jeśli biegnę SynStackna varsłowa kluczowego w bloku kodu JavaScript, mam ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], ale jeśli to zrobię to samo z dowolnego miejsca w bloku CSS, ja tylko dostać ['phpRegion', 'phpHereDoc'], więc trzeba dodać trochę CSS podświetlanie składni reguł. Gdzie definiowane są te reguły składniowe i jak je dodać?


1
Uwaga: // This should be syntax-highlightednie jest poprawnym komentarzem CSS i dlatego należy wyróżnić składnię jako coś innego niż komentarz. CSS obsługuje tylko /* */komentarze wieloliniowe. //komentarze jednowierszowe są obsługiwane tylko wtedy, gdy używasz języków preprocesora, takich jak Sass lub Stylus.
— Rory O'Kane,

Masz rację. Zaktualizowałem kod, aby odzwierciedlić tę zmianę.
— MrSnrub 10.04.17.04

Ja też szukam rozwiązania dla podświetlania składni heredoc CSS. Próbowałem wielu scenariuszy, ale nie mogłem go uruchomić. Czy ktoś ma rozwiązanie?
— Ken

Odpowiedzi:


3

TL; DR:

Jest zdefiniowany w plikach składni PHP i HTML Vima. Aby zobaczyć, jak dodać reguły dla CSS, przejdź do sekcji I jak je dodać? poniżej lub czytaj dalej, aby wyjaśnić, jak to działa.

Gdzie są definiowane te reguły składniowe?

JavaScript heredoc jest podświetlany za pomocą funkcji Vima w składni contains1 , która pozwala grupom składni zawierać inne grupy składniowe.

Aby dowiedzieć się, gdzie to jest zdefiniowane, najpierw otwórz plik podświetlania składni dla PHP:

:e $VIMRUNTIME/syntax/php.vim

Teraz prawdopodobnie plik składniowy znajduje heredoc JavaScript na podstawie dopasowania ciągu „javascript”, więc spróbujmy wyszukać:

/javascript

Trzeci mecz to ten komentarz:

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

Wygląda obiecująco! Rzućmy okiem na odpowiednią linię składni:

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

( dodano kontynuacje linii dla łatwiejszego czytania )

Okej, więc ten region składni znajduje heredoc JavaScript ze złożonym wyrażeniem regularnym i umożliwia wyróżnianie JavaScript w regionie, włączając @htmlJavascriptskładnię cluster2 do containsargumentu.

Ale nie ma odpowiedniej definicji heredoków CSS! Dodajmy jeden. Pierwszą rzeczą do zmiany jest startwyrażenie regularne. Po prostu zmień javascriptna css:

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

To jest łatwe!

Ale nie chcemy wyróżniać JavaScript w naszym heredoc CSS. Musimy także zmienić @htmlJavascriptekwiwalent CSS. Ale jaki jest odpowiednik CSS? (Być może możesz zgadnąć, ale przejdźmy przez ruchy, aby się upewnić.)

Pozwala wyszukać htmljavascript3, aby zobaczyć, gdzie to jest zdefiniowane:

/htmljavascript

Hmmm. Brak innych wyników. Musi zostać zdefiniowany gdzie indziej! Rzućmy okiem na górę pliku, aby zobaczyć, czy możemy znaleźć jakieś obejmuje:

runtime! syntax/html.vim

Wygląda na to, że to może być 4 .

:e $VIMRUNTIME/syntax/html.vim

Uruchom wyszukiwanie ponownie w tym pliku i znajdziemy ten wiersz 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

Więc htmlJavaScript jest cluster, zdefiniowany w html.vim. Czy istnieje podobny klaster dla CSS, którego możemy użyć?

/htmlcss

Tak!

syn include @htmlCss syntax/css.vim

Więc po prostu trzeba wymienić @htmlJavascriptze @htmlCssw containsargumencie:

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

A jak mogę je dodać?

Zapisz całą komendę składni poniżej w pliku, ~/after/syntax/php.vimaby została uruchomiona po zakończeniu przetwarzania pozostałych składni PHP i gotowe!

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: Zobacz :help :syn-containsszczegóły.
2: Zobacz :help :syn-cluster.
3: Mam 'ignorecase'włączony. Bez tego musisz szukać htmlJavascriptlub \chtmljavascript
4: W rzeczywistości, w oparciu o schemat nazewnictwa stosowany w plikach składniowych Vima, prawdopodobnie moglibyśmy to rozgryźć na podstawie htmlJavascriptsamej nazwy.
5: Tym razem z „JavaScript” pisanymi wielkimi literami. Na szczęście mamy 'ignorecase'włączone, co?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.