Sublime Text 3. Руководство по созданию плагина для начинающих

Категория: Linux

Команда разработки Sublime Text 3 позаботилась о том, чтобы писать плагины под ST было просто. Когда я писал плагин впервые, я даже не знал синтаксис Python. В общем, поехали!

Мы напишем плагин UnicodeCharacterInsert, который по нажатию горячей клавиши откроет всплывающее окно с таблицей Unicode символов. При выборе символа он будет вставлен в текущую позицию курсора. Таблица символов будет находится во внешнем HTML файле.

Я работаю в OS Ubuntu Linux, учитывайте, что на других OS некоторые моменты могут отличаться.

Внимание!

Пользователь github указал на ошибку в консоле при открытии контекстного меню:

warning: mnemonic f not found in menu caption Unicode Characters

Цитирую:

В отличие от Menu Bar в контекстное меню Sublime Text не требуется добавлять mnemonics.

Документация

Сразу приведу ссылки на документацию по модулям и API для Sublime Text, которая вам пригодится при создании собственного плагина.

  • Events & Idle Watcher: http://www.sublimetext.com/docs/plugin-examples
  • API Reference: http://www.sublimetext.com/docs/3/api_reference.html
  • Commands: http://www.sublimetext.com/docs/3/commands.html
  • Commands: http://sublimetext.info/docs/en/core/commands.html
  • EventListener: https://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.EventListener

Костяк плагина

Открываем редактор Sublime Text и создаем костяк нового плагина: Tools » New Plugin.. Сохраняем сгенерированный файл в подкаталоге плагинов  ~/.config/sublime-text-3/Packages/UnicodeCharacterInsert с именем UnicodeCharacterInsert.py.

* Путь к плагинам в Windows: C:\Documents and Settings\username\Application Data\Sublime Text\Packages.

Переименуйте название класса команды на UnicodeCharacterInsertCommand:

import sublime, sublime_plugin

class UnicodeCharacterInsertCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")
Примечания
  • Окончание Command указывает на то, что это команда.
  • Метод run вызывается по умолчанию при запуске плагина.
  • Аргумент sublime_plugin.TextCommand указывает на тип плагина. Подробнее о типах плагинов Sublime Text.

Для запуска плагина, выполните в консоли Sublime Text следующий код:

view.run_command('unicode_character_insert')

Чтобы вызвать панель консоли нажмите: Ctrl+~.

Этот плагин просто вставит текст "Hello, World!" с начала текущего открытого документа.

Вставка текста

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

pos = self.view.sel()[0].begin()
self.view.insert(edit, pos, "Unicode Character")

Чтобы вставить текст после курсора вы можете использовать команду view.run_command("insert"):

self.view.run_command("insert", {"characters": "Unicode Character"})

Горячие клавиши

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

В каталоге плагина создайте файл Default.sublime-keymap со следующим содержимым:

[
    { "keys": [ "ctrl+shift+u", "ctrl+shift+i" ], "command": "unicode_character_insert" }
]

Теперь команда unicode_character_insert из вашего плагина будет вызываться при нажатии Ctrl+Shift+U+I, проверьте это.

Popup окно

Чтобы показать всплывающее окно с некоторым HTML контентом, в нашем случае это будет набор некоторых Unicode символов, используйте метод view.show_popup(content):

content = '<b>bold</b> text and <a href="link value">link</a>'
self.view.show_popup(content, sublime.HTML, location=-1, on_navigate=print)

Параметры метода show_popup:

flags        sublime.HTML, sublime.COOPERATE_WITH_AUTO_COMPLETE
location     -1
max_width    максимальная ширина popup окна
max_height   максимальная высота popup окна
on_navigate  метод, который будет вызван при нажатии на ссылку
on_hide      метод, который будет вызван при сокрытии окна

Код класса UnicodeCharacterInsertCommand (блок import я буду опускать для экономии места):

class UnicodeCharacterInsertCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        content = '<b>bold</b> text and <a href="link value">link</a>'
        self.view.show_popup(content, flags=sublime.HTML, location=-1, max_width=400, on_navigate=print)


Всплывающее окно c HTML разметкой

При нажатии на ссылку, в консоль будет выводится значение этой ссылки, текст link value.

Контент popup-окна в HTML файле

Теперь вынесем HTML разметку всплывающего окна во внешний файл unicode-characters.html, который сохраним в каталоге нашего плагина.

<style>
    html { background-color: #272822; margin: 0px; }
    body { margin: 10px; padding: 0; }
    a { text-decoration: none; margin: 0px; font-size: 24px; font-family: monospace; color: #EEF8F2; height: 30px; }
</style>

<div>
    <a href="«">«</a>
    <a href="»">»</a>
    <a href="‹">‹</a>
    <a href="›">›</a>
    <a href="§">§</a>
    <a href="¶">¶</a>
    <a href="©">©</a>
    <a href="®">®</a>
    <a href="™">™</a>
    <a href="؟">؟</a>
</div>
Внимание!

Popup-окна в Sublime Text 3 поддерживает лишь небольшой набор HTML тегов, атрибутов и CSS правил. При этом заявленная поддержка правила text-decoration: none у меня не работает.

Получить контент из внешнего файла можно так:

tpl_path = os.path.dirname(os.path.realpath(__file__)) + '/unicode-characters.html'
content = open(tpl_path, 'r').read()

При публикации плагина в репозитории packagecontrol.io мне подсказали, что внешние ресурсы необходимо подгружать методом sublime.load_resource. Этому методу нужно передавать путь к внешнему файлу относительно каталога ~/.config/sublime-text-3:

Packages/UnicodeCharacterInsert/unicode-characters.html

Финальная реализация

Реализуем методы get_characters_html для получения разметки всплывающего окна из файла unicode-characters.html и метод on_choice_symbol, который будет вставлять в документ выбранный Unicode символ и закрывать popup:

class UnicodeCharacterInsertCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        content = self.get_popup_content
        self.view.show_popup(content, flags=sublime.HTML, location=-1, max_width=400, on_navigate=self.on_choice_symbol)

    def get_characters_html(self):
        resources = sublime.find_resources('unicode-characters.html')
        content = sublime.load_resource(resources[0])
        return content

    def on_choice_symbol(self, symbol):
        self.view.run_command("insert", {"characters": symbol})
        self.view.hide_popup()

В результате у нас получилось вот такое popup-окно с таблицей Unicode символов:


Вид панели с Unicode символами

Добавление команды Command Palette

Создайте файл Default.sublime-commands в каталоге плагина:

[
    { "caption": "Unicode Character Insert: Show Panel", "command": "unicode_character_insert" }
]

Контекстное меню

Для добавление пунктов в контекстное меню создайте файл Context.sublime-menu в каталоге плагина:

[
    {
        "caption": "Unicode Characters",
        "mnemonic": "f",
        "id": "unicode_character_insert",
        "children":
        [
            {
                "command": "unicode_character_insert",
                "caption": "Show Characters Table"
            }
        ]
    },
	{
        "caption": "-",
        "id": "separator"
    }
]

Чтобы добавить пункты в основное меню создайте файл Main.sublime-menu:

[
    {
        "mnemonic": "n",
        "caption": "Preferences",
        "id": "preferences",
        "children": [
            {
                "mnemonic": "P",
                "caption": "Package Settings",
                "id": "package-settings",
                "children": [
                    {
                        "caption": "Unicode Character Insert",
                        "children": [
                            {
                                "caption": "Key Bindings – Default",
                                "command": "open_file",
                                "args": {
                                    "file": "${packages}/UnicodeCharacterInsert/Default.sublime-keymap"
                                }
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
Внимание!

Плагин Unicode Character Insert конфликтует с Colortip (https://github.com/jbrooksuk/Colortip). Просто имейте в виду..

#sublime text 3, #ST3, #st3 create plugin manual

категория: Linux