如何在Pymacs中加载GTK程序

时间:2012-07-29 11:01:35

标签: python emacs 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 个答案:

答案 0 :(得分:1)

Pymacs主要只是意味着你可以在python中编程emacs扩展。它不是IPC方法。

如果您希望同时运行两个程序并在发生外部事件时发送相互消息,则需要IPC。

现代Linux系统上一种非常常见的IPC形式(可怕的未记录的)dbus。 Emacs支持dbus(似乎也没有详细记录)。

然而,here (the answer by rakete) is a very nice example on how to provide a dbus interface to an emacs function

所以,您可能想要做的是在emacs中创建一个“安全缓冲”方法,将其注册为可从dbus访问,启动程序以监视非聚焦事件并通过dbus调用“安全缓冲”方法

答案 1 :(得分:0)

我制作了Python-EPC,这是Python中的EPC服务器实现。 EPC是一个RPC堆栈,专为Emacs Lisp设计。使用Python-EPC,您可以从Python调用Emacs和Emacs Lisp函数的Python函数。以下是与GTK集成的示例:https://github.com/tkf/python-epc/blob/master/examples/gtk/server.py