Пользовательский плагин Sublime Text: изменение стиля, цвета вкладки или фона - PullRequest
0 голосов
/ 26 июня 2018

Иногда я работаю непосредственно с рабочим файлом (я знаю, что он очень уродливый и создает несколько рисков, но на данный момент у меня нет выбора). Я хочу, чтобы можно было легко узнать, что я работаю над рабочим файлом. Я могу работать с file_name, потому что производственные файлы находятся в производственной папке (или эквивалентной). Поэтому я начал плагин Sublime Text, чтобы изменить фон вкладки или фона кода другим цветом.

Я могу отображать информацию о стиле, но не знаю, как изменить этот стиль ...

Плагин ранней стадии:

import sublime, sublime_plugin
class TestStCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        if "production" in str(self.view.file_name()):
            print("===== self.view.style() =====")
            print(self.view.style())

Вывод плагина:

===== self.view.style() =====
{'active_guide': '#7a4815', 'find_highlight': '#ffe894', 'inactive_selection_foreground': '#f8f8f2', 'background': '#282923', 'selection_foreground': '#f8f8f2', 'highlight': '#c4c4bd', 'selection': '#48473d', 'rulers': '#5c5c56', 'selection_border': '#212117', 'shadow': '#141411', 'accent': '#67d8ef', 'misspelling': '#f92472', 'gutter': '#282923', 'guide': '#474842', 'stack_guide': '#7a4815', 'line_highlight': '#3e3d32', 'foreground': '#f8f8f2', 'gutter_foreground': '#90908a', 'minimap_border': '#90908a', 'caret': '#f8f8f1', 'invisibles': '#70716b', 'inactive_selection': '#383830', 'find_highlight_foreground': '#000000'}

Можете ли вы дать мне возможность программно модифицировать тему (или цвет) в плагине Sublime Text?

1 Ответ

0 голосов
/ 27 июня 2018

В Sublime цвет вкладки файла всегда соответствует цвету фона файла, и единственное, что может измениться, это настройка color_scheme.

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

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

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

Примером такого плагина будет следующий:

import sublime
import sublime_plugin

# A global list of potential path fragments that indicate that a file is a
# production file.
_prod_paths = ["/production/", "/prod/"]

# The color scheme to apply to files that are production files.
#
# If the color scheme you use is a `tmTheme` format, the value here needs to
# be a full package resource path. For sublime-color-scheme, only the name of
# the file should be used.
_prod_scheme = "Monokai-Production.sublime-color-scheme"
# _prod_scheme = "Packages/Color Scheme - Legacy/Blackboard.tmTheme"

class ProductionEventListener(sublime_plugin.EventListener):
    """
    Listen for files to be loaded or saved and alter their color scheme if
    any of the _production_path path fragments appear in their paths.
    """
    def alter_color_scheme(self, view):
        if view.file_name():
            # Get the current color scheme and an indication if this file
            # contains a production path fragment,.
            scheme = view.settings().get("color_scheme")
            is_prod = any(p for p in _prod_paths if p in view.file_name())

            # If this file is a production file and the color scheme is not the
            # production scheme, change it now.
            if is_prod and scheme != _prod_scheme:
                view.settings().set("color_scheme", _prod_scheme)

            # If the file is not production but has the production color scheme
            # remove our custom setting; this can happen if the path has
            # changed, for example.
            if not is_prod and scheme == _prod_scheme:
                view.settings().erase("color_scheme")

    # Use our method to handle file loads and saves
    on_load = on_post_save = alter_color_scheme

Каждый вид имеет свой собственный локальный объект settings, который наследует настройки по умолчанию, но также позволяет вам предоставлять настройки для каждого вида. Здесь плагин применяет настройку color_scheme, которая переопределяет унаследованную версию, когда обнаруживает, что файл содержит сегмент рабочего пути, и удаляет эту пользовательскую настройку (возвращаясь к унаследованной версии), если вы Save As присваиваете файлу имя, которого нет длиннее производственный путь.

Оставшаяся часть головоломки состоит в том, как определить, какую цветовую схему вы хотите использовать здесь. Для приведенного выше примера я вручную создал дубликат Monokai.sublime-color-scheme, который поставляется с Sublime, и изменил свойство background, чтобы немного изменить отображаемый цвет.

В качестве альтернативы вы можете выбрать другую цветовую схему, чтобы использовать ее вместо производственной, или даже сгенерировать sublime-color-scheme на лету.

В таком случае вы, вероятно, захотите использовать sublime.load_resource() и sublime.decode_value() для загрузки и декодирования sublime-color-scheme в объект JSON, затем манипулировать цветами и сохранить файл как новый sublime-color-scheme в вашем User пакет.

...