¿Cómo probar (programáticamente) si la sesión actual de Emacs (entre varias) está ejecutando el servidor Emacs?

7

El server-running-ppredicado evaluará tsi el servidor Emacs se está ejecutando, independientemente de qué sesión de Emacs "posea" actualmente el proceso del servidor.

Por lo tanto, cuando hay dos o más sesiones independientes de Emacs ejecutándose simultáneamente, server-running-prealmente no se prueba si la sesión actual de Emacs está ejecutando el servidor.

Estoy buscando una prueba más específica, una que evalúe t si y solo si la sesión actual (es decir, la sesión que realiza la prueba) está ejecutando el servidor Emacs.

kjo
fuente
1
No puedo probar en este momento, pero tal vez puedas probar si el modo servidor no es nulo.
YoungFrog
@YoungFrog: gracias por la sugerencia, pero en cada situación que probé (es decir, después server-starty después server-force-delete), server-modesiempre fue así nil.
kjo
1
Creo que la sugerencia de YoungFrog es buena, pero debe llamar en (server-mode 1)lugar de llamar (server-start). El primero invoca al segundo, y server-force-deletetambién verifica y deshabilita este modo, por lo que parece que sever-modees la interfaz deseada, y no deberíamos llamar server-startdirectamente.
phils
1
Dicho esto, el uso server-modeaún no tiene en cuenta el mismo servidor que se inicia y elimina a través de múltiples instancias de Emacs, ya que eliminar el servidor de una instancia no tiene ningún efecto sobre el valor de server-modeotra.
phils

Respuestas:

5

Puede verificar:

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

Eso debería funcionar siempre que haya evitado iniciar un servidor en otras instancias.

Suponiendo un servidor basado en sockets, si tuviera que iniciar una segunda instancia de Emacs y eliminar por la fuerza y ​​luego reiniciar el proceso del servidor desde esa segunda instancia, el código anterior aún devolverá un valor nulo en la instancia original (como el mismo socket el directorio estará en uso), dejándolo en la situación original.

(Obviamente, esto no es ideal, por lo que puede haber una mejor solución).

server-running-ple indica si se server-nameestá ejecutando un servidor con nombre en particular (por defecto ); así que si su server-namees el mismo en todas sus instancias, entonces puede evitar iniciar un servidor que ya se está ejecutando de la siguiente manera:

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