TL; DR:
Это определено в файлах синтаксиса Vim PHP и HTML. Чтобы увидеть, как добавить правила для CSS, перейдите к разделу А как мне добавить к ним? ниже, или читайте дальше для объяснения того, как это работает.
Где определяются эти правила синтаксиса?
Heredoc JavaScript выделяется с помощью функции синтаксиса contains
1 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
синтаксиса cluster
2 в contains
аргумент.
Но нет соответствующего определения для CSS heredocs! Давайте добавим один. Поэтому первое, что нужно изменить, - это start
регулярное выражение. Просто измените javascript
на css
:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
Это легко!
Но мы не хотим выделять JavaScript в нашем CSS-наследии. Поэтому нам также нужно изменить @htmlJavascript
эквивалент CSS. Но что такое CSS-эквивалент? (Вы можете догадаться, но давайте рассмотрим движения, чтобы быть уверенным.)
Давайте посмотрим на htmljavascript
3, чтобы увидеть, где это определено:
/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'
включили, а?
// This should be syntax-highlighted
это недопустимый комментарий CSS, поэтому синтаксис должен быть выделен как нечто иное, чем комментарий. CSS поддерживает только/* */
многострочные комментарии.//
однострочные комментарии поддерживаются, только если вы используете языки препроцессора, такие как Sass или Stylus.