Используя API Sublime Text 3, как настроить дизайн вкладки? - PullRequest
0 голосов
/ 31 октября 2018

Я создаю превосходный плагин, который будет делать нечто подобное для Windows, как TerminalView для MacOS / Linux.

Прежде чем я начну, я не собираюсь давать какие-либо предложения по поводу таких плагинов. Я решил, что хотел бы создать свою собственную по нескольким причинам, и мне (по крайней мере, в настоящее время) не интересно, что делали другие люди.

Плагин открывает вкладку, читает любой текст, введенный в качестве ввода, передает его на stdin, затем читает stdout и вставляет текст во вкладку. Предстоит еще много работы, но чтобы завершить первую «итерацию» - если хотите, я попытался сделать так, чтобы вкладка выглядела менее похожей на вкладку возвышенного текста и больше походила на оконный терминал - CMD.

Излишне говорить, что я с треском провалился, и я здесь для вашей помощи.

Итак, на базовом уровне кто-нибудь знает, как я могу сделать следующее через возвышенный API (через код плагина):

  • Изменить цвет текста.
  • Изменить цвет фона вкладки ТОЛЬКО , не включая остальную часть экрана.

TerminalView сделал это довольно хорошо. Вот скриншот с этой страницы, объясняющий, чего я в конечном итоге хочу достичь:

What I'm trying to achieve

Я также хотел бы сказать, что я довольно тщательно изучил API, указанный выше, а также выполнил поиск по всему Google, но я не нашел ничего полезного.

Кто-нибудь знает функцию, которую я могу использовать, или, может быть, свойство, которое я могу установить для изменения цвета текста и цвета фона вкладки?

Весь вклад приветствуется (за исключением других предложений плагинов):)

1 Ответ

0 голосов
/ 31 октября 2018

Следует иметь в виду, что разработка плагинов в 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")

В результате получается файл, который выглядит следующим образом:

Sample region image

Здесь происходит то, что текст в первой области закрашивается областью terminal.green.black, что делает текст exercitation зеленым на черном фоне. Вторая область действия аналогично делает текст laboris черным на зеленом фоне.

Важно отметить, что общий цвет фона почти, но не совсем, черный. Причина этого заключается в том, что если вы примените регион с тем же цветом фона, что и общий цвет фона, он будет инвертировать цвета переднего плана и фона, чтобы применить контраст.

Результатом этого будет то, что оба этих примера будут отображаться в виде черного текста на зеленом фоне. Если общий цвет фона будет немного отличаться (но все же будет практически неотличим от черного), предоставленные вами цвета будут применены напрямую.

Более полный пример потребовал бы, чтобы в этой цветовой схеме примера были все возможные комбинации цветов переднего плана и фона, которые вас интересуют, чтобы у вас было больше областей для работы.

Точно так же ваш код должен был бы применять области везде, где цвет текста не является цветом по умолчанию. Первый аргумент add_regions() - это уникальный ключ, который используется для ссылки на регионы в списке, который он раскрашивает. Также важно использовать другое имя региона для каждого возможного цвета в минимуме; если вы повторно используете тот же ключ, список регионов изменится.

Что касается второй части вашего вопроса, как видно выше, цвет физической вкладки, а также область, представляющая файл, управляются свойством background цветовой схемы, используемой в этом конкретном представлении. Таким образом, в этом примере, независимо от используемой вами цветовой схемы, цвет фона «вкладки терминала» всегда будет черным.

Из того, как вы задали вопрос (и из вашего пояснения в комментариях), неясно, имели ли вы в виду физическую вкладку (названную Terminal (bash) на скриншоте выше) или ее содержимое (то есть вывод оболочки).

Насколько я знаю, невозможно сделать физическую вкладку другого цвета, чем ее содержимое; они всегда остаются связанными .-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...