Как узнать, запущен ли сервер emacs

Я хочу выполнить некоторый код в файле инициализации только в том случае, если сервер emacs запущен (особенно если emacs запущен с флагом --daemon). Кажется, что никакой крючок не работает, когда вызывается server-start, и нет никакой переменной, на которую я могу посмотреть, работает ли сервер.

Хакер должен использовать (featurep 'server), так как функция сервера не загружается, если только сервер не запущен, и это, похоже, работает для моих целей, но я хотел бы знать, как правильно это сделать, Спасибо.

Ответы

Ответ 1

Если серверный процесс запущен, связанный с ним объект процесса server-process. Тестирование, если server-process - не-nil, указывает, должен ли сервер работать; вы можете проверить его статус, чтобы проверить его в приемлемом состоянии.

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

Вы можете проверить, был ли Emacs вызван как демон с помощью (daemonp).

Ответ 2

Обновление: код, отправленный Gilles, выдает, если в буфере нет процесса, например "Ошибка буфера не имеет никакого процесса". Когда этот код используется в ~/.emacs.el, мы рискуем, что Emacs не запустится. Чтобы поймать ошибку:

(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)))