Як увімкнути синтаксис, що відповідає мові, всередині гередока?


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.
Rory O'Kane

Ви праві. Я оновив код, щоб відобразити цю зміну.
MrSnrub

Я теж шукаю рішення для підсвічування синтаксису heredoc CSS. Я спробував багато сценаріїв, але не міг змусити його працювати. У когось є рішення?
Кен

Відповіді:


3

TL; DR:

Він визначений у PHP-файлах та файлах синтаксису HTML. Щоб побачити, як додати правила для CSS, перейдіть до розділу А як я їх додати? нижче або читайте далі для пояснення того, як це працює.

Де визначаються ці правила синтаксису?

JavaScript heredoc виділяється за допомогою функції синтаксису 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 гередок немає відповідного визначення! Додамо один. Тож перше, що потрібно змінити, - це startрегулярний вираз. Просто змініть javascriptна css:

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

Це легко!

Але ми не хочемо виділяти JavaScript у нашому heredoc 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.