TL; DR:
Він визначений у PHP-файлах та файлах синтаксису HTML. Щоб побачити, як додати правила для CSS, перейдіть до розділу А як я їх додати? нижче або читайте далі для пояснення того, як це працює.
Де визначаються ці правила синтаксису?
JavaScript heredoc виділяється за допомогою функції синтаксису 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 гередок немає відповідного визначення! Додамо один. Тож перше, що потрібно змінити, - це start
регулярний вираз. Просто змініть javascript
на css
:
start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
Це легко!
Але ми не хочемо виділяти JavaScript у нашому heredoc 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.