Как включить языковой синтаксис внутри heredoc?


19

Когда я редактирую файл PHP и определяю строку в heredoc, подсветка синтаксиса будет включена внутри heredoc, если это синтаксис JavaScript, синтаксис HTML или синтаксис SQL. Однако это не будет работать для синтаксиса CSS.

Пример (если мы создадим новый файл PHP hello.phpс именем следующего кода):

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

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

JAVASCRIPTБлок выделен правильно, но CSSблок не является. Кроме того , если я бегу SynStackна varключевое слово на блоке кода JavaScript, я получаю ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], но если бы я сделать то же самое в любое место в блоке CSS, я только получаю ['phpRegion', 'phpHereDoc'], так что мне нужно добавить некоторые CSS правила подсветки синтаксиса. Где определяются эти правила синтаксиса и как их добавить?


1
Примечание: // This should be syntax-highlightedэто недопустимый комментарий CSS, поэтому синтаксис должен быть выделен как нечто иное, чем комментарий. CSS поддерживает только /* */многострочные комментарии. //однострочные комментарии поддерживаются, только если вы используете языки препроцессора, такие как Sass или Stylus.
Рори О'Кейн

Ты прав. Я обновил код, чтобы отразить это изменение.
MrSnrub

Я тоже ищу решение для подсветки синтаксиса CSS heredoc. Я перепробовал много сценариев, но не смог заставить его работать. У кого-нибудь есть решение?
Кен,

Ответы:


3

TL; DR:

Это определено в файлах синтаксиса Vim PHP и HTML. Чтобы увидеть, как добавить правила для CSS, перейдите к разделу А как мне добавить к ним? ниже, или читайте дальше для объяснения того, как это работает.

Где определяются эти правила синтаксиса?

Heredoc JavaScript выделяется с помощью функции синтаксиса contains1 Vim , которая позволяет группам синтаксиса содержать другие группы синтаксиса.

Чтобы узнать, где это определено, сначала откройте файл подсветки синтаксиса для PHP:

:e $VIMRUNTIME/syntax/php.vim

Теперь, предположительно, файл синтаксиса находит heredoc JavaScript на основе совпадения строки «javascript», поэтому давайте попробуем найти это:

/javascript

Третий матч это комментарий:

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

Выглядит многообещающе! Давайте посмотрим на соответствующую строку синтаксиса:

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

( добавлены продолжения строки для удобства чтения )

Итак, эта область синтаксиса находит наследственный JavaScript-код с извилистым регулярным выражением и позволяет выделять JavaScript внутри области путем включения @htmlJavascriptсинтаксиса cluster2 в containsаргумент.

Но нет соответствующего определения для CSS heredocs! Давайте добавим один. Поэтому первое, что нужно изменить, - это startрегулярное выражение. Просто измените javascriptна css:

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

Это легко!

Но мы не хотим выделять JavaScript в нашем CSS-наследии. Поэтому нам также нужно изменить @htmlJavascriptэквивалент CSS. Но что такое CSS-эквивалент? (Вы можете догадаться, но давайте рассмотрим движения, чтобы быть уверенным.)

Давайте посмотрим на htmljavascript3, чтобы увидеть, где это определено:

/htmljavascript

Хммм. Других результатов нет. Это должно быть определено в другом месте! Давайте кратко рассмотрим верхнюю часть файла, чтобы увидеть, можем ли мы найти какие-либо включения:

runtime! syntax/html.vim

Похоже, что это может быть 4 .

:e $VIMRUNTIME/syntax/html.vim

Запустите поиск снова в этом файле, и мы находим эту строку 5 :

syn cluster htmlJavaScript      add=@htmlPreproc

Итак, htmlJavaScript - это cluster, определенный в html.vim. Есть ли подобный кластер для CSS, который мы можем использовать?

/htmlcss

Ага!

syn include @htmlCss syntax/css.vim

Поэтому нам просто нужно заменить @htmlJavascriptс @htmlCssв containsаргументе:

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

И как мне к ним добавить?

Сохраните всю синтаксическую команду ниже в файле, ~/after/syntax/php.vimчтобы она запускалась после того, как остальная часть синтаксической обработки PHP была выполнена, и все готово!

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: :help :syn-containsподробности см.
2: Видите :help :syn-cluster.
3: я 'ignorecase'включен. Без него вам придется искать htmlJavascriptили \chtmljavascript
4: На самом деле, основываясь на схеме именования, используемой в файлах синтаксиса Vim, мы, вероятно, могли бы выяснить это, основываясь только на htmlJavascriptодном имени.
5: На этот раз с "JavaScript" заглавными буквами по-другому. К счастью, нас 'ignorecase'включили, а?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.