Wie kann (programmgesteuert) getestet werden, ob in der aktuellen Emacs-Sitzung (unter mehreren) der Emacs-Server ausgeführt wird?

7

Das server-running-pPrädikat bewertet, tob der Emacs-Server ausgeführt wird, unabhängig davon, welcher Emacs-Sitzung derzeit der Serverprozess "gehört".

Wenn daher zwei oder mehr unabhängige Emacs-Sitzungen gleichzeitig ausgeführt werden, server-running-pwird nicht wirklich getestet, ob auf der aktuellen Emacs-Sitzung der Server ausgeführt wird.

Ich suche nach einem spezifischeren Test, der t genau dann ausgewertet wird, wenn in der aktuellen Sitzung (dh in der Sitzung, in der der Test durchgeführt wird) der Emacs-Server ausgeführt wird.

kjo
quelle
1
Kann momentan nicht testen, aber vielleicht können Sie testen, ob der Servermodus nicht Null ist.
YoungFrog
@YoungFrog: danke für den Vorschlag, aber in jeder Situation, die ich getestet habe (nämlich nach server-startund nach server-force-delete), server-modewar immer nil.
Kjo
1
Ich denke, YoungFrogs Vorschlag ist gut, aber Sie müssen anrufen, (server-mode 1)anstatt anzurufen (server-start). Ersteres ruft Letzteres auf und server-force-deleteüberprüft und deaktiviert diesen Modus, sodass es eher so aussieht, als wäre sever-modees die beabsichtigte Schnittstelle, und wir sollten nicht direkt anrufen server-start.
Phils
1
Die Verwendung von server-modeimmer noch berücksichtigt nicht, dass derselbe Server über mehrere Emacs-Instanzen gestartet und gelöscht wird, da das Löschen des Servers von einer Instanz keine Auswirkung auf den Wert von server-modein einer anderen hat.
Phils

Antworten:

5

Sie könnten überprüfen:

(and (boundp 'server-process)
     (processp server-process)
     (server-running-p))

Dies sollte funktionieren, vorausgesetzt, Sie haben es vermieden, in den anderen Instanzen einen Server zu starten.

Wenn Sie einen Socket-basierten Server annehmen und eine zweite Emacs-Instanz starten und den Serverprozess von dieser zweiten Instanz aus zwangsweise löschen und dann neu starten, gibt der obige Code in der ursprünglichen Instanz weiterhin Nicht-Null zurück (als denselben Socket) Verzeichnis wird verwendet), so dass Sie in der ursprünglichen Situation bleiben.

(Offensichtlich ist dies nicht ideal, daher gibt es möglicherweise eine bessere Lösung.)

server-running-pGibt an, ob ein bestimmter benannter Server (standardmäßig server-name) ausgeführt wird. Wenn Sie server-namealso in allen Instanzen gleich sind, können Sie vermeiden, einen bereits laufenden Server wie folgt zu starten:

;; Start server (but don't restart).
(require 'server)
(unless (server-running-p)
  (server-start))
Phils
quelle