2012-03-13

Возвращение к Geany

Не срослось у меня со Snaked. Основная причина, это ощутимая тормознутость при навигации (а я довольно дофига туда-сюда по сорцам лажу), и это в XXI веке, на четырёх ядрах в 3.2GHz, простой текстовый, да ещё позиционирующийся как лёгкий, редактор :-). С остальными болячками я бы даже справился со временем.

Основной причиной обращения к Snaked была потребность в сессиях. Это что-то типа проектов (не особо мудрёных) и возможности запуска нескольких экземпляров редактора, а точнее открытии очередного файла в том или ином экземпляре; у меня одновременно открыто несколько проектов и в каждом от трёх до десятка файлов, мешать всё в кучу не разумно, к тому же каждый экземпляр редактора открыт в отдельном теге Awesome (это такой тайловый менеджер окон, теги -- что-то вроде рабочих столов).

В Geany, в принципе можно добиться подобной функциональности. Во-первых, в Geany есть понятие проекта, и нужно завести такой Geany-проект для каждого своего проекта; а во-вторых, при открытии файлов, относящихся к одному и тому же проекту, и при желании открытия их в своём экземпляре редактора, нужно передавать Geany ключик --socket-file с указанием уникального для этого экземпляра сокетного файла. Например, для проекта plup я буду открывать файлы так:
$ geany --socket-file=/tmp/geany-$USER-plup.socket setup.py
$ geany --socket-file=/tmp/geany-$USER-plup.socket bootstrap.py
$ geany --socket-file=/tmp/geany-$USER-plup.socket README
Везде указан один и тот же сокет, открыто всё будет в одном и том же окне. Но это полбеды, нам бы ещё хотелось сохранять набор открытых файлов при закрытии окна редактора. По умолчанию все экземпляры редактора будут писать список открытых вкладок в "сессию" по умолчанию, т.е. затирать данные друг друга. А что бы для каждой сессии вёлся свой список вкладок и нужно было завести Geany-проект (доступно через главное меню редактора).

Остаётся ещё одна проблема, если экземпляр редактора запущен (с правильным сокетом) и в нём выбран нужный проект, то все последующие открываемые извне файлы (с правильным сокетом) будут добавляться в этот проект. Но если экземпляр не открыт, то сокет не поможет загрузить очередной (первый открываемый) файл в проект. Получается, придётся заранее открыть редактор (с правильным сокетом) и в нём загрузить нужный проект, затем всё пойдёт как по маслу (до закрытия экземпляра редактора). Засада, конечно, но пока с этим не разобрался. Хотя у меня комп не отключается месяцами и я попросту ничего не закрываю перед сном, так что не очень мешает :-).

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

Но я всё же продолжу следить за Snaked, интересная вещь, пусть пока и не могу ей пользоваться.

2012-02-14

Snaked и GTK NumPad

Я уже жаловался на то что в GTK'шных приложениях хреново работает NumPad (в режиме курсора), это касалось навигации и выделения с использованием регистровых Ctrl и Shift, а так же использования буфера обмена, т.е. комбинации Ctrl+Insert, Shift+Insert и Shift+Delete не работали. Это препятствовало полноценному использованию GTK'шных приложения где требуется маломальская работа с текстом. В чём конкретно проблема не знаю, у Qt-приложений всё нормально, у GTK'шного Geany всё тоже отлично работает, видимо тут грешить надо на виджет GtkTextView и на то что он работает с Insert и Delete, но забивает на KP_Insert и KP_Delete.

Но проблема как-то решилась со временем, правда я уже напрочь отучился использовать приложения заточенные на GtkTextView (GtkSourceView основан на этом же виджете и наследует косяк), т.е. всякие редакторы, в IM это как бы не сильно беспокоит, например.

Ну вот и до Snaked дошла очередь :-). Редактор всем хорош, вот только построен он на паршивом (это моё официальное мнение) GtkSourceView, а значит использует все косяки этого виджета и не даёт мне работать с хоткеями как я этого хочу. Ещё недостаток, это заметное притормаживание, даже очень заметное после Geany. Тормозами я не занимался пока, а вот описанная ситуация с NumPad'ом решается таким плагином:
import gtk


author = 'bw<bw@handsdriver.net>'
name = 'M$ Keypad Copy/Paste'
desc = '<ctrl>KP_Insert + <shift>KP_Insert + <shift>KP_Delete'


def init(injector):
injector.bind('editor-active', 'copy', None, copy).to('<ctrl>KP_Insert')
injector.bind('editor-active', 'cut', None, cut).to('<shift>KP_Delete')
injector.bind('editor-active', 'paste', None, paste).to('<shift>KP_Insert')


def copy(editor):
clipboard = editor.view.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD)
editor.buffer.copy_clipboard(clipboard)


def cut(editor):
clipboard = editor.view.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD)
editor.buffer.cut_clipboard(clipboard, True)


def paste(editor):
clipboard = editor.view.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD)
editor.buffer.paste_clipboard(clipboard, None, True)
Собственно чем приглянулся Snaked. Тем что написан на родном для меня языке Python. Плагинизация, хотя тут ничем меня удивить не получилось. Маленькой, но наиважнейшей для меня фичей, это поддерживание сессиий: может быть запущено несколько экземпляров редактора с разными сессиями и при открытии очередного файла, ключиком можно указать в каком экземпляре он будет открыт (если грубо) и т.п. Запоминает файлы в сессии и не удаляет их оттуда пока ты сам это не сделаешь, а вот Geany сбрасывает, когда открываешь для редактирования файл при том что редактор не был загружен до этого. Да и просто интересными внутренностями, есть чему поучиться, а то и позаимствовать ;-).