Следует иметь в виду, что разработка плагинов в Sublime легче, если вы не делаете это в вакууме. То есть, даже если вы не заинтересованы в том, чтобы использовать решение проблемы кого-то другого (например, я часто разрабатываю свои собственные плагины, а не использую уже существующие), глядя на то, как кто-то достиг чего-то похожего на то, что вы делаете ». пытаться сделать это бесценный инструмент обучения.
Поэтому я бы рекомендовал взглянуть не только на упомянутый вами пакет TerminalView , но и Terminus (который аналогичен, но работает на всех платформах). Даже если вы не собираетесь их использовать, вы можете проверить их код, чтобы увидеть, как они работают.
При этом, вообще говоря, цвет, отображаемый в тексте, определяется цветовой схемой , которая используется в сочетании с определением синтаксиса, применяемым к этому конкретному файлу. Синтаксис использует правила для применения одного или нескольких scopes
к каждому символу в файле, а цветовая схема использует правила, соответствующие этим scopes
, чтобы знать, какой цвет будет отображаться.
Например, файл Python.sublime-syntax
содержит правило, которое распознает слово def
как определяющее функцию и применяет к ней область действия storage.type.function.python
. Файл Monokai.sublime-color-scheme
содержит правило, которое гласит, что все, что соответствует storage.type.function
, должно отображаться курсивом синим текстом. Таким образом, если вы используете эту цветовую схему и редактируете файл Python, слово def
отображается синим и курсивом.
Такая функциональность не совсем полезна для целей терминального плагина, поскольку правила должны быть в состоянии явно соответствовать известному тексту, но теоретически терминал может отображать все, что вы захотите. Так что это не путь, или, по крайней мере, не совсем путь; пакет TerminalView, который вы упомянули в своем первоначальном вопросе, позволяет вам применять синтаксис, если вы этого хотите, но в целом все равно использует следующий метод.
Программно, вы можете использовать конечную точку API view.add_regions()
, чтобы сделать что-то похожее на это с некоторыми оговорками, как мы увидим через мгновение.
Возможно, вы видели эффекты этой функции API, даже если не знали об этом. Он может применять значки в желобе, связанном с каждой линией, а также применять графическую разметку в виде контуров, подчеркиваний и т. Д. К тексту в буфере.
Например, подстилка может содержать значок желтого круга в желобе, чтобы показать вам линии с проблемами, и использовать цветной контур вокруг текста, чтобы показать вам, в чем проблема.
Одной из вещей, которую он может использовать, является применение цветной области к тексту. Фактически это то, что TerminalView и Terminus делают для достижения этой конкретной функции в своих терминалах. Однако цвета региона, которые он может применить, по-прежнему контролируются используемой цветовой схемой. Поэтому, если вы не хотите ограничиваться только цветами, существующими в вашей текущей цветовой схеме, вам необходимо предоставить собственную цветовую схему, которая также будет использоваться вашим плагином.
Например, создайте файл с именем Test.sublime-color-scheme
в вашем пакете User
со следующим содержимым:
{
"globals":
{
"foreground": "white",
"background": "#000001",
"caret": "white",
},
"rules":
[
{
"name": "Green on Black",
"scope": "terminal.green.black",
"foreground": "green",
"background": "black"
},
{
"name": "Black on Green",
"scope": "terminal.black.green",
"foreground": "black",
"background": "green"
}
]
}
Это очень минимальная цветовая схема, которая устанавливает общий цвет текста на белый, а цвет фона - почти, но не совсем черный (по причинам, которые мы рассмотрим чуть позже). Он также включает в себя два правила, одно из которых знает, как окрашивать текст в зеленый цвет на черном фоне, а другое - как окрашивать текст в черный цвет на зеленом фоне.
С этим на месте создайте новое пустое представление и используйте фрагмент lorem
, чтобы заполнить его некоторым примером текста, затем используйте консоль Sublime для запуска команды view.settings().set("color_scheme", "Test.sublime-color-scheme")
. Вы должны увидеть фон изменения файла на черный (вместе с вкладкой), а текст остается белым.
Теперь, вернувшись в консоль, выполните следующие команды:
view.add_regions("green_black", [sublime.Region(163, 175)], "terminal.green.black")
view.add_regions("black_green", [sublime.Region(184, 191)], "terminal.black.green")
В результате получается файл, который выглядит следующим образом:
Здесь происходит то, что текст в первой области закрашивается областью terminal.green.black
, что делает текст exercitation
зеленым на черном фоне. Вторая область действия аналогично делает текст laboris
черным на зеленом фоне.
Важно отметить, что общий цвет фона почти, но не совсем, черный. Причина этого заключается в том, что если вы примените регион с тем же цветом фона, что и общий цвет фона, он будет инвертировать цвета переднего плана и фона, чтобы применить контраст.
Результатом этого будет то, что оба этих примера будут отображаться в виде черного текста на зеленом фоне. Если общий цвет фона будет немного отличаться (но все же будет практически неотличим от черного), предоставленные вами цвета будут применены напрямую.
Более полный пример потребовал бы, чтобы в этой цветовой схеме примера были все возможные комбинации цветов переднего плана и фона, которые вас интересуют, чтобы у вас было больше областей для работы.
Точно так же ваш код должен был бы применять области везде, где цвет текста не является цветом по умолчанию. Первый аргумент add_regions()
- это уникальный ключ, который используется для ссылки на регионы в списке, который он раскрашивает. Также важно использовать другое имя региона для каждого возможного цвета в минимуме; если вы повторно используете тот же ключ, список регионов изменится.
Что касается второй части вашего вопроса, как видно выше, цвет физической вкладки, а также область, представляющая файл, управляются свойством background
цветовой схемы, используемой в этом конкретном представлении. Таким образом, в этом примере, независимо от используемой вами цветовой схемы, цвет фона «вкладки терминала» всегда будет черным.
Из того, как вы задали вопрос (и из вашего пояснения в комментариях), неясно, имели ли вы в виду физическую вкладку (названную Terminal (bash)
на скриншоте выше) или ее содержимое (то есть вывод оболочки).
Насколько я знаю, невозможно сделать физическую вкладку другого цвета, чем ее содержимое; они всегда остаются связанными .-