3

こんにちは、ウィンドウ フォーカスが失われたときに Emacs のファイルを保存する Python プログラムを作成しようとしています。

そのために、完全な gtk アプリケーションを作成し、wnck モジュールを使用する Python プログラムを作成しました。

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 がプログラムの終了を待っているためです。プログラムをバックグラウンドで実行させる方法はありますか?

どんな助けでも本当に感謝しています。

4

2 に答える 2

1

Pymacs は主に、Python で emacs 拡張機能をプログラムできることを意味します。これは IPC メソッドではありません。

2 つのプログラムを同時に実行し、外部イベントが発生したときに相互にメッセージを送信したい場合は、IPC が必要です。

最新の Linux システムで非常に一般的な IPC の形式は、(恐ろしく文書化されていない) dbus です。Emacs は dbus をサポートしています (これも十分に文書化されていないようです)。

ただし、ここ (rakete による回答) は、emacs 関数に dbus インターフェイスを提供する方法の非常に良い例です

したがって、おそらくやりたいことは、emacs で「セーフ バッファ」メソッドを作成し、dbus からアクセスできるように登録し、プログラムを開始してフォーカス解除イベントを監視し、その「セーフ バッファ」メソッドを dbus 経由で呼び出すことです。

于 2012-08-06T08:50:29.470 に答える
0

Python でEPC サーバーを実装したPython-EPCを作成しました。EPC は、Emacs Lisp 用に設計された RPC スタックです。Python-EPC を使用すると、Emacs から Python 関数を、Python から Emacs Lisp 関数を呼び出すことができます。GTK との統合の例を次に示します: https://github.com/tkf/python-epc/blob/master/examples/gtk/server.py

于 2012-11-11T19:52:50.547 に答える