Введение
Странно, но поискав на Хабре упоминания текстового редактора Sublime Text 2 я почти ничего не нашел. Спешу исправить положение и рассказать хабраюзерам об этом прекрасном инструменте. Вначале очень коротко расскажу о том чем же он так хорош, потом напишем простой но полезный плагин.
Почему Sublime Text 2
Не берусь утверждать, что Sublime Text 2 — лучший текстовый редактор, но мне он пришёлся очень по душе, и вот почему:
- Приятный глазу тёмный интерфейс, визуальные эффекты и Distraction Free Mode
- Панелька с редактируемым текстом в миниатюре. Интересная и действительно удобная находка!
- Множественное выделение и редактирование
- Все фичи свойственные большинству продвинутых редакторов: подсветка синтаксиса, форматирование кода, автодополнение и т.д.
- То чего нет «в коробке» можно скачать из репозитария! Да-да, после совершения простейших манипуляций в Sublime появляется полноценная система управления пакетами, почти как в убунте или дебиане.
- Если и этого не достаточно — прямо в главном меню есть пункт «New Plugin». Жмем на него и пишем плагин реализующий необходимый нам функционал на языке Python. Об этом и пойдет речь.
- Стоит это чудо $59 за одну, либо $500 за 10 лицензий. Однако если не хочется, то можно и не платить. Ограничений никаких в этом случае нет, просто изредка будет всплывать напоминание.
Постановка задачи
Пример реальный, из инженерной практики. Перевод выделенного числа в тексте из десятичной в шестнадцатеричную систему счисления. Фича должна быть доступна из главного и контекстного меню а так же по сочетанию клавиш Ctrl+Shift+H. Результат выполнения: число в хексе записанное с использованием цифр и букв верхнего регистра без каких-либо ведущих символов вроде «0x». Если выделенный текст не является числом — ругаемся об этом с статусбаре. Обращаю внимание, что пример намерено упрощен до максимума, чтоб за деталями не потерялась суть: простота создания плагинов для Sublime.
Пишем плагин
Жмём Tools -> New Plugin... и видим заготовку. Меняем название класса и пишем функционал в методе run. У меня получилось следующее:
import sublime, sublime_plugin
class DecToHexCommand(sublime_plugin.TextCommand):
MAX_STR_LEN = 10
def run(self, edit):
v = self.view
# Получаем значение первого выделенного блока
dec = v.substr(v.sel()[0])
# Заменяем десятичное число шестнадцатеричным или выводим сообщение об ошибке
if dec.isdigit():
v.replace(edit, v.sel()[0], hex(int(dec))[2:].upper())
else:
# Обрезаем слишком длинные строки, которые не поместятся в статусбар
if len(dec) > self.MAX_STR_LEN:
logMsg = dec[0:self.MAX_STR_LEN]+ "..."
else:
logMsg = dec
sublime.status_message("\"" + logMsg + "\" isn't a decimal number!")
Сохраняем туда куда предложит редактор с именем dec_to_hex.py
Добавляем пункты меню. Прописываем клавиатурное сочетание
Начнем с «горячих клавиш». В меню жмём Preferences -> Key Bindings-User. Открывается файл с настройками в формате JSON. Скорее всего пустой. Добавляем в него строчку
{ "keys": ["ctrl+shift+h"], "command": "dec_to_hex" }
Сохраняем. Всё. Впринципе уже можно пользоваться. Если не работает стоит посмотреть что по этому поводу написано в консольке (Ctrl+`).
Для того чтоб добавить пункт в контекстное меню создаём файл Context.sublime-menu следующего содержания:
[
{
"command": "dec_to_hex"
}
]
Думаю, что как и в предыдущем случае всё понятно без комментариев. Сохраняем в тот же каталог, в который сохранили плагин. Т.е. %USERPROFILE%\AppData\Roaming\Sublime Text 2\Packages\User, для пользователей Windows. Там же создаём файл Main.sublime-menu. Я посчитал, что этот пункт будет уместнее всего в меню Edit, поэтому в файле Main.sublime-menu написал следующее:
[
{
"id": "edit",
"children":
[
{ "command": "dec_to_hex" }
]
}
]
Проверяем. В главном и контекстом меню должны появиться пункты с названием Dec To Hex
На этом всё. А о том как упаковать наш плагин в пакет и поделиться им с товарищами, а так же о других интересных возможностях Sublime расскажу в следующий раз, если тема будет кому-нибудь интересна.
Ссылки:
- www.sublimetext.com/docs/api-reference — Plugin API Reference
- www.sublimetext.com/download — Download
- www.sublimetext.com/dev — Dev Builds. Использую dev версии, багов пока не ловил.
- net.tutsplus.com/tutorials/python-tutorials/how-to-create-a-sublime-text-2-plugin — Статья на ту же тему на английском языке
UPD: написал про Dev Builds и стоимость лицензии. Спасибо хаброюзерам Sky4eg, VCoder и vtx