Como testar (programaticamente) se a sessão atual do Emacs (entre várias) está executando o servidor Emacs?

7

O server-running-ppredicado avaliará tse o servidor Emacs está em execução, independentemente de qual sessão do Emacs atualmente "possui" o processo do servidor.

Portanto, quando há duas ou mais sessões independentes do Emacs em execução simultaneamente, server-running-pele realmente não testa se a sessão atual do Emacs está executando o servidor.

Estou procurando um teste mais específico, que avaliará t se e somente se a sessão atual (ou seja, a sessão que está executando o teste) está executando o servidor Emacs.

kjo
fonte
11
Não é possível testar no momento, mas talvez você possa testar se o modo de servidor não é nulo.
YoungFrog
@YoungFrog: obrigado pela sugestão, mas em todas as situações que testei (ou seja, depois server-starte depois server-force-delete), server-modesempre foi nil.
KJo
11
Acho que a sugestão do YoungFrog é boa, mas você precisa ligar em (server-mode 1)vez de ligar (server-start). O primeiro invoca o último e server-force-deletetambém verifica e desativa esse modo, então parece que sever-modeé a interface pretendida, e não devemos ligar server-startdiretamente.
phils
11
Dito isto, o uso server-modeainda não conta para o mesmo servidor ser iniciado e excluído por meio de várias instâncias do Emacs, pois excluir o servidor de uma instância não afeta o valor de server-modeoutra.
phils

Respostas:

5

Você pode verificar:

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

Isso deve funcionar desde que você evite iniciar um servidor nas outras instâncias.

Supondo que um servidor baseado em soquete, se você iniciar uma segunda instância do Emacs e excluir e forçar a reinicialização do processo do servidor a partir dessa segunda instância, o código acima ainda retornará nulo na instância original (como o mesmo soquete diretório estará em uso), deixando você na situação original.

(Obviamente, isso não é o ideal, então pode muito bem haver uma solução melhor.)

server-running-pinforma se um servidor nomeado específico (padrão server-name) está em execução; portanto, se você server-nameé o mesmo em todas as suas instâncias, evite iniciar um servidor já em execução, como:

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