Краткая справка: Meld — утилита для визуального сравнения файлов/папок.
Наверняка не каждый согласится, что этот иструмент стоит тех танцев с бубном, которые необходимо совершить вокруг него для более менее комфортной работы (Meld слегка не расчитан на работу в Windows, но так как написан на python с использованием GTK, может функционировать и в ней). Я же, потыкав палочкой в бесплатные альтернативы, решил для себя, что если оно заведется, то усилия не будут напрасными.
Предлагаю заинтересовавщимся перейти к делу.
Весть процесс можно разделить на две части: установка и допиливание.
Основные манипуляции описаны здесь: Meld/Windows. Ниже привожу этот же список со своими комментариями.
Если кто-то будет применять на практике вышенаписанное, заглядывайте время от времени, возможно будут обновления.
P.S. Ранее не имел дела с python'ом, GTK и PyGTK, поэтому, если где-то написал откровенную ерунду, поправьте пожалуйста.
Наверняка не каждый согласится, что этот иструмент стоит тех танцев с бубном, которые необходимо совершить вокруг него для более менее комфортной работы (Meld слегка не расчитан на работу в Windows, но так как написан на python с использованием GTK, может функционировать и в ней). Я же, потыкав палочкой в бесплатные альтернативы, решил для себя, что если оно заведется, то усилия не будут напрасными.
Предлагаю заинтересовавщимся перейти к делу.
Весть процесс можно разделить на две части: установка и допиливание.
Установка
Основные манипуляции описаны здесь: Meld/Windows. Ниже привожу этот же список со своими комментариями.
- Python:
- С версиями python'а жонглировать не стал, установил ту, что указана в мануале.
- http://python.org/ftp/python/2.6.2/python-2.6.2.msi.
- Устанавливаем (напр. c:\dev\python).
- GTK+ All-in-one bundle:
- А вот этот пак я взял поновее (2.18 вместо 2.16).
- http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.18/gtk+-bundle_2.18.7-20100213_win32.zip.
- Распаковываем (напр. c:\dev\gtk).
- Python gnome bindings:
- С этими штуками нужно поаккуратнее. Чуть не та версия, сразу ничего не работает.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.12/pygtk-2.12.1-3.win32-py2.6.exe.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.20/pygobject-2.20.0.win32-py2.6.exe.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.4/pycairo-1.4.12-2.win32-py2.6.exe.
- От себя добавлю еще pygtksourceview, пригодилось при допиливании.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtksourceview/2.2/pygtksourceview-2.2.0.win32-py2.6.exe.
- Все это нужно установить убедившись, что инсталятор правильно нашел папку с python'ом (напр. c:\dev\python).
- libglade:
- Тут тоже без изменений, тем более, что версия последняя на данный момент.
- http://downloads.sourceforge.net/gladewin32/gtk-2.12.9-win32-2.exe.
- Устанавливаем (напр. c:\dev\glade).
- gtksourceview:
- Пара именно этих версий (pygtksourceview-2.2.0 и gtksourceview-2.2.2) у меня заработала.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/gtksourceview/2.2/gtksourceview-2.2.2.zip.
- А еще понадобится версия 2.9.3, т.к. в 2.2.2 не хватает некоторых файлов.
- http://ftp.gnome.org/pub/GNOME/binaries/win32/gtksourceview/2.9/gtksourceview-2.9.3.zip.
- Распаковываем 2.2.2 (напр. c:\dev\gtksourceview).
- Cygwin:
- Зачем Cygwin я так и не понял. Работает и без него.
- http://www.cygwin.com/setup.exe.
- Устанавливаем по ситуации (напр. c:\dev\cygwin).
- Если же не работает, ни без Cygwin'а, ни с ним, нужно доустановить пакет patch.
- Download meld source code:
- http://ftp.gnome.org/pub/gnome/sources/meld/1.3/meld-1.3.1.tar.bz2
- Распаковываем (напр. c:\dev\meld).
- Add this to your Path:
- Да да, в переменную PATH нужно добавить пути к python'у (пункт 1, c:\dev\python), к библиотекам (пункты 2, 4 и 5, c:\dev\gtk\bin, c:\dev\glade\bin и c:\dev\gtksourceview\bin) и к Cygwin'у, если установлен (пункт 6, c:\dev\cygwin\bin). Еще можно добавить путь к самому Meld'у (пункт 7, c:\dev\meld\meld-1.3.1)
Допиливание
- Первый вопрос, после успешного запуска: «на кой черт мне это черное консольное окошко?!».
Решается просто: нужно запускать не python, а pythonw.
- Следующий момент: окно утилиты не сохраняет свою позицию и состояние развернутости на весь экран (не то, что fullscreen, а то, что maximized). Возможно, это проблема GTK, возможно, менеджера окон Windows.
Полностью исправить такое поведение мне не удалось.
Сохранение позиции окна можно реализовать, сохраняя координаты вручную, но т.к. позиционировать окно до его отображения нельзя, а двигать его уже после отображения некрасиво, я этого делать не стал.
Решил ограничится сохранением флагаWINDOW_STATE_MAXIMIZED
. Достигается это путем добавления опции window_maximized в настройки приложения, и обработчика сигнала window-state-event. Сперва, нужно описать обработчик: в файл meldapp.glade (c:\dev\meld\meld-1.3.1\glade2\meldapp.glade) в секцию<widget class="GtkWindow" id="meldapp">
добавить строку<signal name="window_state_event" handler="on_window_state_event"/>
:
--- c:\dev\meld-base\meld-1.3.1\glade2\meldapp.glade +++ c:\dev\meld\meld-1.3.1\glade2\meldapp.glade @@ -7,6 +7,7 @@ <property name="title" translatable="yes">Meld</property> <property name="icon">pixmaps/icon.png</property> <signal name="size_allocate" handler="on_size_allocate"/> + <signal name="window_state_event" handler="on_window_state_event"/> <signal name="delete_event" handler="on_delete_event"/> <child> <widget class="GtkVBox" id="appvbox">
Затем, добавить обработчик: в файл meldapp.py (c:\dev\meld\meld-1.3.1\meldapp.py) добавить методon_window_state_event
:
--- c:\dev\meld-base\meld-1.3.1\meldapp.py +++ c:\dev\meld\meld-1.3.1\meldapp.py @@ -615,6 +615,9 @@ self.prefs.window_size_x = rect.width self.prefs.window_size_y = rect.height + def on_window_state_event(self, window, state): + self.prefs.window_maximized = bool(state.new_window_state & gtk.gdk.WINDOW_STATE_MAXIMIZED) + # # Toolbar and menu items (file) #
Добавить настройку по-умолчанию:
--- c:\dev\meld-base\meld-1.3.1\meldapp.py +++ c:\dev\meld\meld-1.3.1\meldapp.py @@ -313,6 +313,7 @@ defaults = { "window_size_x": prefs.Value(prefs.INT, 600), "window_size_y": prefs.Value(prefs.INT, 600), + "window_maximized": prefs.Value(prefs.BOOL, 1), "use_custom_font": prefs.Value(prefs.BOOL,0), "custom_font": prefs.Value(prefs.STRING,"monospace, 14"), "tab_size": prefs.Value(prefs.INT, 4),
И напоследок, применить настройку перед отображением окна:
--- c:\dev\meld-base\meld-1.3.1\meldapp.py +++ c:\dev\meld\meld-1.3.1\meldapp.py @@ -499,6 +500,8 @@ self.scheduler.connect("runnable", self.on_scheduler_runnable ) self.widget.set_default_size(self.prefs.window_size_x, self.prefs.window_size_y) self.ui.ensure_update() + if self.prefs.window_maximized: + self.widget.maximize() self.widget.show() self.widget.connect('focus_in_event', self.on_focus_change) self.widget.connect('focus_out_event', self.on_focus_change)
- Некоторые настройки, как например стиль отображения панели инструментов, берутся из файлов конфигурации рабочего стола GNOME, а если их нету, используется настройка по-умолчанию. Для стиля панели инструментов это
TOOLBAR_BOTH
, т.е. отображение иконок и подписей.
Для себя я просто поменял наTOOLBAR_ICONS
:
--- c:\dev\meld-base\meld-1.3.1\meldapp.py +++ c:\dev\meld\meld-1.3.1\meldapp.py @@ -375,7 +376,7 @@ def get_toolbar_style(self): if not hasattr(self, "_gconf"): - return gtk.TOOLBAR_BOTH + return gtk.TOOLBAR_ICONS style = self._gconf.get_string('/desktop/gnome/interface/toolbar_style') or "both" style = {"both":gtk.TOOLBAR_BOTH, "text":gtk.TOOLBAR_TEXT, "icon":gtk.TOOLBAR_ICONS, "icons":gtk.TOOLBAR_ICONS,
- Забавные вещи происходят при сохранении файлов с переносами отличными от LF (\n). В таком случае все LF заменяются на переносы файла, поэтому CRLF (\r\n) превращается в CRCRLF, а при следующем сохранении еще раз.
Возможно проблема кроется в неправильном парсинге файла (в Ubuntu Meld себе такого не позволяет), но пока я решил ее, просто закомментировав участок кода, заменяющий одни переносы на другие:
--- c:\dev\meld-base\meld-1.3.1\filediff.py +++ c:\dev\meld\meld-1.3.1\filediff.py @@ -815,6 +815,7 @@ else: return melddoc.RESULT_ERROR text = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), 0) + """ if bufdata.newlines: if type(bufdata.newlines) == type(""): if(bufdata.newlines) != '\n': @@ -832,6 +833,7 @@ if k != '\n': text = text.replace('\n', k) break + """ if bufdata.encoding: try: text = text.encode(bufdata.encoding)
Тем более, что этот же код все переносы ровняет под одну гребенку.
- В Meld'е установленном по инструкции на сайте GNOME, не доступны функции подсветки синтаксиса, отображения номеров строк и отображения пробелов вместо символов табуляции.
Чтобы исправить это, я добавил в мануал библиотеку gtksourceview-2.2.2. В ней не хватает файлов language.rng, language2.rng и styles.rng, зато они есть в gtksourceview-2.9.3 в папке share\gtksourceview-2.0\language-specs. Их нужно просто скопировать в аналогичную в gtksourceview-2.2.2.
Если кто-то будет применять на практике вышенаписанное, заглядывайте время от времени, возможно будут обновления.
P.S. Ранее не имел дела с python'ом, GTK и PyGTK, поэтому, если где-то написал откровенную ерунду, поправьте пожалуйста.