Zeigen Sie Puffer an, die von einer anderen Emacs-Instanz verwaltet werden

7

Ist es möglich, gnusin einer separaten Emacs-Instanz zu laufen oder andere Dinge, die häufig blockieren, und die Puffer an die Haupt-Emacs-Instanz weiterzuleiten? Ich denke, allgemein frage ich mich, welche Art von Kommunikation zwischen Emacs-Instanzen möglich ist.

Gregory Nisbet
quelle
Keine Antwort auf Ihre Frage, sondern nur ein paar Gedanken - viele Leute scheinen mehrere Emacs-Instanzen auszuführen, weil es keine bessere Methode gibt, um die Puffer zu organisieren. Kommunikationsprobleme zwischen mehreren Instanzen können vermieden werden, indem sie nicht vorhanden sind - dh eine bessere Organisation mit nur einer Instanz -, z. B. das Organisieren nach Frames mithilfe von frame-bufs github.com/alpaker/Frame-Bufs oder einer Vielzahl anderer Organisationsbibliotheken (z. B. Projekte) , usw.). Kurz gesagt, es gibt viele Möglichkeiten, eine enorme Menge aktiver Puffer innerhalb einer Emacs-Instanz effektiv zu organisieren.
Lawlist
Ich fange an, el-screenfür die Pufferorganisation zu verwenden , aber ein projektorientierter Ansatz könnte sinnvoller sein. Ich stelle mir eher einen Master-Emacs und ein paar kopflose Arbeiter-Emacses vor, die Dinge wie blockieren gnus. Einfachste mögliche Lösung Die Emacses kommunizieren über Sockets oder die Master-Emacs erzeugen einen kurzlebigen Worker und die gesamte Kommunikation erfolgt über stdin und stdout, aber dann müsste ich mir große Mühe geben, um emacs-spezifische Objekte zu serialisieren und zu deserialisieren (das ist das harte Arbeit versuche ich zu vermeiden).
Gregory Nisbet
Ah ich sehe . . . Ja, ich bekomme normalerweise eine Tasse Kaffee oder schaue mir die neuesten Fragen zum Stapelaustausch an, während ich nach dem Start von Emacs zum ersten Mal eine E-Mail erhalte / sende - dh ich fühle deinen Schmerz. Nachfolgende E-Mail-Überprüfungen / -Sendungen sind mit Wanderlust viel schneller, aber die erste Überprüfung / Sendung mit Tausenden von gespeicherten E-Mails kann einige Minuten dauern.
Lawlist
@lawlist, ich habe versucht, mutt in ansiterm auszuführen, da dann nur ansiterm abstürzt, aber die Aktualisierungsrate war schrecklich (und ich konnte nicht herausfinden, wie die Hintergrundfarbe in mutt deaktiviert werden kann). Ich habe auch versucht, Fernweh zu verwenden, konnte aber nicht herausfinden, wie es für Google Mail konfiguriert wird (ich habe einen leeren Desktop-Ordner, in dem sich nichts befindet).
Gregory Nisbet
Ich verwende mu4e, das einen asynchronen Prozess zum Herunterladen von E-Mails verwendet. (Senden ist immer noch ein Problem, aber normalerweise weniger, da es nur eine Nachricht ist.)
mbork

Antworten:

4

Stellen Sie sicher, dass auf jeder Emacs-Instanz ein Daemon mit einem eindeutigen Namen ausgeführt wird. Stellen Sie die Variable ein server-start, um beispielsweise den Servernamen auszuwählen

emacs --daemon &          # Normal instance with the default server name ("server")
emacs --daemon=gnus &     # Instance for GNUS only

Von einer Instanz aus können Sie mit der Funktion Code in einer anderen Instanz ausführen server-eval-at. Der Wert des Ausdrucks wird an die lokale Instanz zurückgegeben. Es muss ein Wert sein, der zurückgelesen werden kann: Ganzzahlen, Zeichenfolgen, Listen und andere „transparente“ Datenstrukturen sind in Ordnung, aber Sie können Puffer, Frames usw. auf diese Weise übertragen.

Mit dieser Funktion können Sie einer anderen Instanz anweisen, einen Frame zu öffnen, die Puffernamen in einer anderen Instanz aufzulisten usw. Beachten Sie, dass Ihr Code blockiert, wenn die andere Instanz ausgelastet ist, bis er auf den Dämon antwortet.

(server-eval-at "gnus" `(frame-parameter
                          (make-frame-on-display ,(frame-parameter (selected-frame) 'display))
                          window-id))

Es gibt nicht viel Code, der diese Funktion verwendet: Die meisten Emacs-Benutzer führen eine einzelne Instanz aus. Was auch immer Sie tun möchten, Sie müssten wahrscheinlich einige Codierungsarbeiten durchführen.

Gilles 'SO - hör auf böse zu sein'
quelle
Sie können einfach emacs --daemon=gnusstattemacs --daemon --eval '(setq server-name "gnus")'
phils
0

Emacsclient

Verwenden Sie anstelle von Emacs den Emacsclient. Zuerst müssen Sie a (server-start)in Ihrem Emacs (en) ausführen und dann den Client in einem eigenen Frame mit ausführen emacsclient -c test.mac.

Sie können auch verschiedene Serverdateien anhand der Optionen -f ServerFile(unter Windows) oder Servernamen unterscheiden -s ServerName. Bitte schauen Sie unter http://www.gnu.org/software/emacs/manual/html_node/emacs/emacsclient-Options.html nach . Zu diesem Zweck müssen Sie unterschiedliche Servernamen für die verschiedenen Emacsen: (setq server-name "Server1")usw. festlegen .

Dieter.Wilhelm
quelle
Kann emacsclient eine Verbindung zu mehreren Daemons herstellen?
Gregory Nisbet
Ich fürchte, ich verstehe Ihre Anwendungsfälle nicht vollständig. Könnten Sie uns bitte Beispiele geben?
Dieter.Wilhelm
1
Mail-Leseprogramme wie Gnus oder Fernweh sperren die Benutzeroberfläche während der Aktualisierung. Ich brauche diese Programme nicht wirklich, um die meiste Zeit mit dem Rest der Emacs zu interagieren, möchte aber, dass die Puffer in einem einzigen Kontext verwaltet werden, damit ich nicht zwischen den E-Mail-Emacs und allem hin und her wechseln muss sonst emacs. Ich weiß, dass bestimmte Pakete wie helm eine separate Emacs-Instanz verwenden, um ein Blockieren zu vermeiden, und habe mich gefragt, ob es eine Möglichkeit gibt, die Puffer einer anderen Emacs-Instanz anzuzeigen, anstatt einen Teil eines vorhandenen Emacs-Clients so umzuschreiben, dass er weniger synchron ist.
Gregory Nisbet
@ GregoryNisbet: Ich sehe, ich habe meine Antwort aktualisiert, um Ihre Antwort über mehrere Daemons oder Emacs-Serverinstanzen aufzunehmen, hoffe es hilft ...
Dieter.Wilhelm
2
Wäre es nicht dasselbe wie verschiedene Instanzen von Emacs auszuführen, da zu einer Zeit eine Instanz von Emacsclient auf die Puffer nur eines Emacs-Servers zugreifen könnte?
Iqbal Ansari