Python

индекс
250,80

Пишем простой плагин для 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
+55
18 января 2012, 18:42
106

комментарии (46)

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

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

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

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

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

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

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

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

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

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

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

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

Не оно?
0
Romulka #
Оно. Тока я найти не смог.
0
smileonl #
А в нем можно как нибудь настроить нативное отображение под Linux Ubuntu ??? А то его цветовые схемы просто не очень воспринимают мои глаза :(
0
qwertysx #
Цветовую схему можно и самому написать. Смотри ~/.config/sublime-text-2/Packages/Color Scheme - Default/ для примеров.
+2
VCoder #
Возможно, стоит упомянуть, что редактор не бесплатный: $59 (или $500 за 10 лицензий)
0
Akr0n #
А разве без лицензии есть какие-то ограничения по фунционалу?
Лицензия скорее для тех, кто хочет отблагодарить автора и поддержать развитие хорошего продукта.
0
vtx #
popup на save. причем иногда выскакивает и при включенном auto-save на unfocus событии
+1
Sky4eg #
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
homm #
Напишу и свой советик. Я привык, при дублировании выделенной части текста (по-умолчанию это 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
Ambyte #
Небольшой советик. Чтобы управлять пакетами (установка, удаление, добавление репов и т.д.) не в ручную а всего парой кликов необходимо войти в консоль 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
krovatti #
До появления вашего поста пользовался Notepad++ с необходимыми мне (порой самодельными) скриптами. Теперь начал данный редактор использовать. Спасибо.
0
darked #
Прочитал что к нему можно «плагины» от textmate как — то прикручивать, но так и не понял как.
Всё хорошо в sublime, но вот среди множества поддержки языков, почему — то нет подсветки pascal, так и не получилось прикрутить модуль от textmate. Может кто осилил?
0
Agent_Smith #
Просто положите его в папку ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Pascal
0
Agent_Smith #
По крайней мере так я прикручивал поддержку Lua и Corona SDK
0
darked #
Многие пытался не помагалоЮ пока не нашёл это:

www.holylinux.net/download/?f=Sublime-TxtMate-Pascal-Highlighting-AddToUserArea.zip

— если вдруг у кого-нить такие же проблемы )
+1
rmaksim #
только класс должен называться не
class DecToHex(sublime_plugin.TextCommand):
а
class DecToHexCommand(sublime_plugin.TextCommand):
0
siberianMan #
поправил
0
theaqua #
Никто не подскажет, где можно достать SVN-плагин? Гугл выдает два варианта, но они что-то не особо работают.
0
rmaksim #
этот пробовал?
wbond.net/sublime_packages/tortoise

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