Как загрузить программу GTK в Pymacs
Здравствуйте, я пытаюсь написать программу на Python для сохранения файлов Emacs при потере фокуса окна.
Для этого я написал программу на Python, которая создает полное gtk-приложение и использует модуль wnck:
from Pymacs import lisp
import wnck
import gtk
class AutoSaver(object):
"""This class watches if Emacs looses focus and if Emacs looses
focus saves all buffers with files
"""
def __init__(self):
"""
"""
self.screen = wnck.screen_get_default()
self.screen.force_update()
self.screen.connect("active_window_changed", self.watch_for_emacs)
def watch_for_emacs(self, screen, data=None):
screen.force_update()
win_list = screen.get_windows()
for win in win_list:
if win.get_application().get_name().startswith("emacs"):
self.save_all_buffers()
def save_all_buffers(self):
lisp.save_some_buffers(True, None)
def main(self):
"""
Starts GTK's main loop.
"""
gtk.main()
def start():
autosaver = AutoSaver()
autosaver.main()
start.interaction = ''
К сожалению, программа Python останавливает Emacs; вероятно, потому что Emacs ждет завершения программы. Можно ли запустить программу в фоновом режиме?
Любая помощь действительно ценится.
2 ответа
Pymacs в основном означает, что вы можете программировать расширение emacs на python. Это не метод IPC.
Если вы хотите, чтобы две программы работали одновременно и отправляли друг другу сообщения при возникновении внешних событий, вам нужен IPC.
Очень распространенной формой IPC в современных системах Linux является (ужасно недокументированный) dbus. В Emacs есть поддержка dbus (что также не очень хорошо документировано).
Однако здесь (ответ от rakete) очень хороший пример того, как предоставить интерфейс dbus для функции emacs.
Итак, что вы, вероятно, захотите сделать, - это создать метод "безопасного буфера" в emacs, зарегистрировать его как доступный из dbus, запустить вашу программу для наблюдения за событиями несфокусировки и вызвать этот метод "безопасного буфера" через dbus.
Я сделал Python-EPC, реализацию сервера EPC на Python. EPC - это стек RPC, разработанный для Emacs Lisp. Используя Python-EPC, вы можете вызывать функции Python из Emacs и функции Emacs Lisp из Python. Вот пример для интеграции с GTK: https://github.com/tkf/python-epc/blob/master/examples/gtk/server.py