Пишем простой плагин для Sublime Text 2

Введение

Странно, но поискав на Хабре упоминания текстового редактора 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 расскажу в следующий раз, если тема будет кому-нибудь интересна.

Ссылки:



UPD: написал про Dev Builds и стоимость лицензии. Спасибо хаброюзерам Sky4eg, VCoder и vtx
Поделиться публикацией

Комментарии 47

    +5
    Согласен, действительно прекрасный редактор. Огромный плюс — кросплатформенность! А поиск файлов/строки/функции… Просто нужно горячие клавиши/команды освоить! Например Ctrl+P : или @Да кстати использую всегда dev версию, порой несколько билдов в день и на глазах видны изменения www.sublimetext.com/dev
      +2
      Солидарен, прекрасный редактор. Пользуюсь уже полгода.
      +1
      Ну что… Что мешает людям сделать такой же, только опенсорс??

      Вроде бы и база есть SciTE и на ее базе сделали замечательный, но несколько топорный NPP, а вот что-то клевенькое, кроссплатформенное и бесплатное — нет.

      И приходится пользоваться явовыми IDE, которые ох какие прожорливые
        +3
        Красивого опенсорса немного, именно красивого, а не функционального. Люблю n++, но вообще он страшненький.

        Так что либо Vim ( например: akitaonrails.com/2009/01/04/rails-on-vim-in-english ), либо прожорливые IDE.
          0
          емакс еще
            0
            емакс же!
            +3
            Возьми и сделай. (с)

            Все вам будут благодарны.
              0
              Ну я по специализации скорее к cloud9 что нить допишу. кстати вот cloud9 как раз таки красивый и функциональный и опенсорсный и для программистов)
              0
              Вам не нравится тот факт, что программисты тоже хотят кушать? Или в принципе за чужой труд не привыкли платить?
                +1
                Неужели программист не может купить себе инструмент?
                Это как если бы механики жаловались на отсутствие бесплатных ключей.
                  0
                  К сожалению или к счастью я не фрилансер, поэтому ПО покупает компания в которой я работаю. И если есть какой-то купленный стандарт, то приходится пользоваться или им или бесплатной альтернативой.
                  Вот и сетую на то что такой альтернативы нет.
                    +1
                    Если вы не фрилансер, у вас есть постоянный доход.

                    Инструмент, который вы используете, вам не нравится, но заплатить 50-100 долларов за подходящий не хотите.

                    Странно.
                      0
                      Чужие деньги считаете;) У меня не московская и даже не киевская ЗП.
                      Но я просто не понимаю почему, например, замечательные редакторы Aptana, Flash Develop, Cloud9, NPP и некоторые другие — бесплатны (но не подходят мне по определенным причинам)
                      Мне кажется уже достаточно написано оплаченного кода что бы сделать хороший легковесный редактор.
                  0
                  Но ведь IDE таки действительно IDE, а не текстовый редактор. Я к тому что автокомплит методов классов импортированных из библиотек, и дебаг — вещи полезные.
                    0
                    А в SciTE вам чего не хватает, «клевеньких» иконок?

                    P.S. NPP сделали не на базе SciTE, он лишь использует Scintilla.
                    +2
                    Отличная статья, спасибо! :)
                      0
                      В sublime можно назначать клавиатурные комбо и длинных последовательностей типа Ctrl+W+E?
                        +3
                        Про это не знал. Надо наверно написать большую статью про полезные фичи саблайма. Вроде вот этой net.tutsplus.com/tutorials/tools-and-tips/sublime-text-2-tips-and-tricks/ только шире и на русском.
                        +2
                        можно, например ctrl+k+b скрывает/показывает side bar
                        только нажимать надо не все вместе, а буквы по отдельности, то есть зажали ctrl, затем по-очереди k и b
                        { "keys": ["ctrl+k", "ctrl+b"], "command": "toggle_side_bar" }
                        +1
                        Немного не в тему, но интересует один вопрос: этот редактор поддерживает Vim-режим?
                        +1
                        Плагин от меня и от друга.

                        Мой — поиск в django-документации на rtfd выделенного слова. Ссылка: github.com/saippuakauppias/sublime-text-2-Django-DocsSearch

                        Димки — создание нового файла при нажатии клавиш, тут главная киллер-фича — это создание всех папок, что указаны в пути и есть режим в котором автоматически создаются и добавляются файлы __init__.py. github.com/xobb1t/Sublime-AdvancedNewFile

                        ps: как-то даже отправляли свои плагины умпутуну, когда они проводили что-то вроде конкурса с раздачей лицензий, но так и не получили ответа… Кто слушал Радио-Т и знает в чём там дело — отпишитесь, пожалуйста.
                          +1
                          Перешл на прощлой недели с netbeans на sublings. Вот сейчас написал плагин, чотбы переходить на новую строку (Start new line shift+enter в netbeans) мб кому понадобится.

                          gist.github.com/1635037
                            0
                            Preferences → Key binding (Default):
                            { «keys»: [«super+enter»], «command»: «run_macro_file», «args»: {«file»: «Packages/Default/Add Line.sublime-macro»} },

                            Не оно?
                              0
                              Оно. Тока я найти не смог.
                            0
                            А в нем можно как нибудь настроить нативное отображение под Linux Ubuntu ??? А то его цветовые схемы просто не очень воспринимают мои глаза :(
                              0
                              Цветовую схему можно и самому написать. Смотри ~/.config/sublime-text-2/Packages/Color Scheme - Default/ для примеров.
                              +2
                              Возможно, стоит упомянуть, что редактор не бесплатный: $59 (или $500 за 10 лицензий)
                                0
                                А разве без лицензии есть какие-то ограничения по фунционалу?
                                Лицензия скорее для тех, кто хочет отблагодарить автора и поддержать развитие хорошего продукта.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  Licenses are per-user, rather than per-machine, so you can enjoy Sublime Text on as many computers and operating systems as you wish with your license. Licenses are valid for both Sublime Text 1 and 2.


                                  Плюс лицензии в том, что она предоставляется на пользователя, а не на машину. Можно использовать кросплатформенно на любом количестве компьютеров за 59$. А 10 лицензий это при использовании, в бизнесе. Это прописано в лицензии www.sublimetext.com/eula
                                  +1
                                  Напишу и свой советик. Я привык, при дублировании выделенной части текста (по-умолчанию это super+shift+d) дублируется не ровно то, что выбрано, а все строки, на которых находится выделение.

                                  Поэтому я поправил файлик duplicate_lines.py. Открываем Preferences → Browser packages → default → duplicate_lines.py.

                                  Добавляем в метод run параметр force_lines=False, а в строчку if region.empty() добавляем:
                                  if force_lines or region.empty().

                                  После этого открываем пользвательский файл горячих клавиш, добавляем туда:
                                  { «keys»: [«super+d»], «command»: «duplicate_line», «args»: {«force_lines»: true}},

                                  Готово.
                                    +4
                                    Небольшой советик. Чтобы управлять пакетами (установка, удаление, добавление репов и т.д.) не в ручную а всего парой кликов необходимо войти в консоль Python Ctrl+`, и там вставить строку
                                    import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
                                    После чего нажать Enter, далее перезапустить редактор. После перезапуска в меню Preferences появятся пункты Package Settings и Package Control.
                                      0
                                      До появления вашего поста пользовался Notepad++ с необходимыми мне (порой самодельными) скриптами. Теперь начал данный редактор использовать. Спасибо.
                                        0
                                        Прочитал что к нему можно «плагины» от textmate как — то прикручивать, но так и не понял как.
                                        Всё хорошо в sublime, но вот среди множества поддержки языков, почему — то нет подсветки pascal, так и не получилось прикрутить модуль от textmate. Может кто осилил?
                                          0
                                          Просто положите его в папку ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Pascal
                                        +1
                                        только класс должен называться не
                                        class DecToHex(sublime_plugin.TextCommand):
                                        а
                                        class DecToHexCommand(sublime_plugin.TextCommand):
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        0
                                        Прочитал статью, пересел на этот редактор и забыл про Geany. В Geany была панель с папками, но вместо неё у Sublime есть очень хорошая функция: он хорошо знает, в какой папке открывать и в какой закрывать. Можно работать на клавиатуре и с удобными комбинациями клавиш (Vim/Emacs мне кажутся слишком навороченными и нелогичными).

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое