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ć?

MrSnrub
źródło
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?

Bogaty
źródło