2010-09-13 36 views
15

Me gustaría ejecutar algún código en mi archivo de inicio solo si el servidor de emacs se está ejecutando (específicamente si emacs se inicia con el indicador --daemon). No parece haber ningún gancho que se ejecute cuando se llama al server-start y no hay ninguna variable que pueda ver para ver si el servidor se está ejecutando.Cómo saber si el servidor de emacs se está ejecutando

Un truco es usar (featurep 'server), ya que la función de servidor no está cargada a menos que se inicie el servidor, y esto parece funcionar para mis propósitos, pero me gustaría saber cuál es la forma correcta de hacerlo. Gracias.

Respuesta

16

Si se está ejecutando un proceso de servidor, el objeto de proceso asociado es server-process. Probar si server-process es no nil le dice si se supone que el servidor se está ejecutando; puedes probar su estado para verificar que esté en un estado aceptable.

(and (boundp 'server-process) 
    (memq (process-status server-process) '(connect listen open run))) 

Puede probar si Emacs se invocó como un demonio con (daemonp).

+2

'daemonp' es exactamente lo que estaba buscando, gracias! – pheaver

1

Actualización: el código publicado por Gilles arroja si un buffer no tiene proceso, como "Buffer scratch no tiene proceso". Cuando este código se usa en ~/.emacs.el, corremos el riesgo de que Emacs no se inicie. Para detectar el error:

(defun --running-as-server() 
    "Returns true if `server-start' has been called." 
    (condition-case nil 
     (and (boundp 'server-process) 
      (memq (process-status server-process) 
       '(connect listen open run))) 
    (error))) 
+0

Una solución más simple: compruebe que 'server-process' no es nulo antes de la llamada a' process-status': '(y (boundp 'server-process) server-process (memq (process-status ....' –

Cuestiones relacionadas