Не подсвечиваются/выделяются фоном нужные мне элементы кода.
Сколько цветовых схем не перепробовал — ничего не помогает. Как написать простейший
собственный синтаксис, расписано здесь, но что нужно проделать для изменения уже готовых?
Ответы
Ответ 1
Если не устраивает ни одна готовая схема, задаём цвета самостоятельно. Стоит предупредить
о трёх обстоятельствах:
С момента внесения правки в цветовую схему до отображения нового цвета может пройти
несколько минут. Иногда помогает перезагрузка файла или самого Sublime Text 3.
Из stack trace и всплывающих окон редактора не всегда понятно, где совершил опечатку
в синтаксисе. Рекомендую пользоваться плагином Local History, чтобы оставалась возможность
откатиться до предыдущих версий файла.
Scopes (см. ниже) меняются с выходом новых билдов Sublime Text 3. После обновления
может оказаться, что прописанные вами настройки сбились, и придётся заново вставлять
уже новые области видимости.
Свойства, отвечающие за цвет и начертание элементов синтаксиса языков разметки, программирования,
наборов макропакетов, языков и таблиц стилей и т. д. в Sublime Text 3 называются «scopes».
Перевёл как «области видимости», за точность перевода не ручаюсь.
Куда что вставлять
Открываем файл своей активной цветовой темы (схемы). Если не знаете, как, см. здесь
в первых двух абзацах после «Простое решение».
Куда-нибудь между тегами нашей цветовой схемы вносим следующий XML-массив:
name
Scope Name
scope
scope(s)
settings
foreground
color
Параметры:
— необязательный. Дабы не забыть, что означает вставленная нами
область видимости.
name, Scope Name — необязательный. Между тегами
задаём любое имя области видимости, которое будет отображаться в TmTheme Editor.
scope, scope(s) — между тегами вставляем
область (или области) видимости. Как их получить — см. ниже по тексту. Важно не оставлять
пространство между пустым, — иначе цветом, что указан у вас вместо
color, подсветится и совсем не то, что вы хотели.
foreground, color — между тегами указываем
цвет в форматах HEX, ARGB или X11. Последний формат не рекомендовал бы ввиду того,
что а) как минимум цвета aqua, fuchsia и lime не всегда поддерживаются Sublime Text
3, б) периодически возникают разного рода неисправности, не случающиеся, если вводим
цвет в HEX или ARGB.
Получаем и вносим область видимости одним из трёх способов, подробно расписанных
ниже, вслед за примерами.
Вписываем в XML-конструкцию цвет вместо color → сохраняем файл цветовой схемы → смотрим
результаты.
Примеры
Золотой текст:
scope
text.html.basic source.js.embedded.html source.js meta.group.braces.round
meta.group.braces.curly meta.property.object.js
settings
foreground
gold
Зелёный фон:
scope
text.html.basic source.js.embedded.html source.js meta.group.braces.round
meta.group.braces.curly meta.function-call.method.without-arguments.js variable.function.js
settings
background
#6BC7548F
Наклонный коралловый текст:
scope
text.html.basic source.js.embedded.html source.js meta.group.braces.round
meta.group.braces.curly meta.function-call.method.with-arguments.js variable.function.js
settings
fontStyle
italic
foreground
lightcoral
Ключи foreground, fontStyle (принимает значения bold или italic, значения указывать
со строчной буквы) и background можно комбинировать между собой, т. е. допускается
одновременное задание цвета элемента, его начертания и цвета фона вокруг:
fontStyle
italic
foreground
lightcoral
Несколько областей видимости, которые будут иметь одинаковый цвет, вносятся через
запятую. Допустим, мы желаем идентичную раскраску у открывающих и закрывающих скобок
тега :
name
Tag script brackets, open and closed
scope
text.html.basic source.js.embedded.html punctuation.definition.tag.begin.html,
text.html.basic source.js.embedded.html punctuation.definition.tag.end.html
settings
foreground
yellow
Результат, после того, как мы задали цвета областям видимости всем элементам примера.
Было:
Стало:
Получение областей видимости:
Узнать активную, т. е. до или в пределах которой находится каретка, область видимости
элемента можно сочетанием клавиш Ctrl + Alt + Shift+ P. Scope отобразится в строке
состояния (Status Bar) нижней части окна Sublime Text 3.
Однако из строки состояния не скопировать необходимую область видимости, необходимо
воспользоваться одним из трёх способов ниже. Плагины от adzenith и ttscoff, также предназначенные
для получения scopes в буфер обмена, у меня не заработали, — по всей видимости, они
для Sublime Text 2, но не Sublime Text 3.
UPD:
Начиная с билда 3114 области видимости отображаются уже в отдельном окне, а не строке
состояния, и их можно копировать.
Плагин от r-stein, о котором идёт речь ниже, уже не особо и нужен.
1. Плагин от r-stein
Проделаем следующие операции:
а. Копируем в буфер обмена следующий код:
sublime.set_clipboard(view.scope_name(view.sel()[0].b))
б. Устанавливаем каретку (упрощённо говоря, кликаем левой кнопкой мыши) до или внутри
— но не после — элемента синтаксиса, цвет которого хотим изменить.
в. Ctrl + ` (машинописный обратный апостроф, символ расположен на той же клавише,
где кириллическая «ё») → вставляем в открывшееся поле ввода код, что мы скопировали
на 1-м этапе, → Enter → в нашем буфере обмена содержится необходимая область видимости.
Как можно убедиться на практике, это не очень удобно. Для упрощения выполнения операции
служит плагин от ув-мого r-stein.
Tools → New plugin... → Вставляем в открывшийся файл код на Python:
import sublime, sublime_plugin
class CopyScopeCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
sublime.set_clipboard(view.scope_name(view.sel()[0].b))
sublime.status_message("Scope copied")
Ctrl + S → сохраняем файл как copy_scope.py.
Задаём плагину шорткат: Preferences → Paskage Settings → Mediawiker → Key Bindings
- User → между [] вписываем в открывшийся файл:
// Копирование областей видимости
{ "keys": ["ctrl+7", "ctrl+o"], "command": "copy_scope" },
Сохраняем. Чтобы сочетание наверняка оказалось ничем не занятым, я выбираю двухэтапные
хоткеи — то есть ввожу Ctrl + 7, затем Ctrl + O, и только после двух нажатий выполняется
необходимая команда. Можете назначить одноэтапный, только лучше удостоверьтесь, что
шорткат свободен: Preferences → Key Bindings - Default → в открывшемся файле Ctrl+F
→ временно отключаем кнопку Regular expression, иначе не удастся найти символ +, →
вводим в форму поиска сочетание клавиш, которое хотим использовать, → если оно задействовано,
выбираем другое, которое, впрочем, также может быть занято каким-то из установленных
вами плагинов.
(опционально) Добавляем кнопку вызова плагина в контекстное меню, появляющееся при
нажатии правой кнопкой мыши в любую область ввода текста:
Preferences → Browse Packages... → User → создаём файл Context.sublime-menu, если
его нет, → вставляем в файл
[
{
"command": "copy_scope"
},
]
Сохраняем. Если же файл существует, и в нём прописана команда для другого плагина,
разделяем объекты запятыми после {фигурных скобок}. Объекты заключены в [квадратные
скобки] (JSON-синтаксис).
[
{
"command": "lat_to_cyr"
},
{
"command": "copy_scope"
},
]
То же замечание по поводу запятых и скобок касается предыдущего и последующего примеров.
(опционально) Добавляем кнопку вызова плагина в верхнее меню:
Preferences → Browse Packages... → User → создаём файл Main.sublime-menu, если его
нет, → вписываем:
[
{
"id": "edit",
"children":
[
{ "command": "copy_scope" }
]
},
]
Сохраняем.
Наводим каретку до или внутри элемента, область видимости которого следует узнать,
→ вызываем команду получения scope любым из методов — Ctrl + 7, затем Ctrl + O; клик
правой кнопкой мыши в любую область ввода текста → Copy Scope; Edit → Copy Scope —
область видимости находится в нашем буфере обмена.
2. ScopeHunter онлайн
Сервис поддерживает только синтаксисы, перечисленные на картинке ниже,
тогда как методами 1 и 3 изменяется раскраска у любых элементов всех синтаксисов
Sublime Text 3. Например, я написал цветовую схему с поддержкой вики-разметки, для
меня вариант со ScopeHunter онлайн частично не подошёл.
Переходим на сайт TmTheme Editor → Gallery, если пользуетесь готовой цветовой схемой,
Open — собственной (когда файл темы находится среди файлов вашего компьютера, открываете
его, как описано здесь, и в title окна Sublime Text 3 высветится путь к локальному
файлу) → в правом нижнем углу выбираем необходимый язык разметки/программирования →
Customize Preview Code → вставляем тот самый код, где элементы подсвечиваются не так,
как вам нужно → Save → Scope Hunter → наводим мышью на элементы → под строкой Current
Scope выводится искомая область видимости:
Если у выбранной области видимости задан параметр «Name» (под «Matching Rule»), то
слева находим Score Name c таким же значением параметра, как у «Name», → меняем цвета
в веб-панели. Доступен онлайн-предпросмотр.
Когда же напротив Name ничего не указано, придётся создавать XML-массив (см. Куда
что вставлять) и вписывать область видимости в него.
Save → Download → сохраняем файл туда же, откуда его взяли.
К сожалению, работа над сервисом фактически прекращена, результат будет отличаться
от того, что вы имеете в Sublime Text 3, иногда разительно. Скриншоты одного скрипта,
сделанные 13 июня 2016 в Sublime Text 3 и TmTheme Editor:
3. Плагин ScopeHunter
Поддерживаются любые синтаксисы. Устанавливаем плагин через Package Control → Ctrl
+ Shift + P → в появившееся поле ввода вписываем одну из двух команд:
Scope Hunter: Toggle Instant Scoper — (зная о fuzzy поиске, можно ввести shtis) решение,
когда необходимо изменить цвета множеству элементов. Внизу появится консоль, где отобразятся
области видимости, автоматически сменяющиеся в зависимости от того, до или внутри какого
элемента синтаксиса располагается каретка.
Чтобы scopes добавлялись в буфер обмена автоматически, задайте значение true параметру
clipboard: Preferences → Package Settings → ScopeHunter → Settings - User → вставляем
следующий код и сохраняем файл.
{
"clipboard": true,
}
Когда вы не собираетесь работать с областями видимости, чтобы они не мешались в буфере
обмена, установите значение false или же прекратите действие команды ScopeHunter перезагрузкой
Sublime Text 3. Впрочем, иногда она сама по непонятным причинам прекращает функционировать,
и приходится заново после Ctrl+Shift+P вводить shtis.
Scope Hunter: Show Scope Under Cursor — подходит, когда требуется преобразить колор
одному или нескольким элементам. После того, как вы закрываете консоль клавишей Esc,
чтобы узнать области видимости ещё раз, придётся вновь набирать данную команду.
Если в течение сеанса работы в Sublime Text 3 вы ввели одну из этих команд, то другая
не заработает до того, как вы перезагрузите Sublime Text 3.
Поддерживаются множественные курсоры. Зажмите клавишу Ctrl и кликайте мышью до или
внутри элементов, область видимости которых необходимо узнать. В нижней консоли появятся
scopes сразу всех их. Пример:
Scope: text.html.basic
source.js.embedded.html
source.js
meta.group.braces.round
meta.brace.round.js
------
Scope: text.html.basic
source.js.embedded.html
source.js
meta.group.braces.round
meta.group.braces.curly
variable.other.readwrite.js
------
Scope: text.html.basic
source.js.embedded.html
source.js
meta.group.braces.round
meta.group.braces.curly
support.type.object.dom.js
------
Копируем области видимости (то, что справа, без Scope: с чёрточками).
Резюме
по рассмотренным способам получения областей видимости:
Плагин от r-stein:
Плюс — наиболее быстрое получение scopes,
Минус — нет никаких дополнительных функций.
ScopeHunter онлайн:
Плюс — быстрый предпросмотр цветов онлайн,
Минусы — неактивный разработчик и как следствие отсутствие поддержки новых изменений;
ограниченная поддержка синтаксисов.
Плагин ScopeHunter:
Плюс — работа сразу с множеством областей видимости,
Минус — перебои в работе плагина.
Когда мне требуется изменить 1—2 области видимости, я пользуюсь плагином от r-stein;
нужен быстрый предпросмотр — захожу в TmThemeEditor; ну а если основательно сажусь
править цветовых темы, то привожу в действие плагин ScopeHunter.