On 2024-04-12 22:38, Ludovic Courtès wrote: > Hi Nicolas, > > Nicolas Graves skribis: > >> As promised to Stefan a few months ago, here's a use case of >> Shepherd/Emacs implementation that we developped in RDE. > > Would be nice to have it in Guix Home!
Something like this seems to work: (define (emacs-shepherd-service config name) (shepherd-service (documentation (format #f "Emacs server. Use ~a to connect to it." (if (eq? 'server name) "@code{emacsclient}" (format #f "@code{emacsclient -s ~a}" name)))) (provision `(,(symbol-append 'emacs- name))) (requirement '(emacs)) (modules '((shepherd support))) ;for '%user-runtime-dir' (start #~(make-systemd-constructor (list #$(file-append (home-emacs-configuration-emacs config) "/bin/emacs") #$(format #f "--fg-daemon=~a" name)) (list (endpoint (make-socket-address AF_UNIX (string-append %user-runtime-dir "/emacs/" #$(symbol->string name))) #:name '#$(format #f "emacs-~a" name) #:socket-directory-permissions #o700)) #:log-file (string-append (getenv "XDG_STATE_HOME") "/log" "/emacs-" #$(symbol->string name) ".log"))) (stop #~(make-systemd-destructor)))) But I'm not sure it's better regarding user experience. On RDE we implemented a notifier that parses the result of herd eval root "(and=> (lookup-service 'emacs-server) service-status)" thus giving a nice "Emacs is currently starting" notification. This evaluation doesn't seem to work using make-systemd-constructor, although it has its advantages (indeed launches a frame when available). It would be nice if service-status could "sync" with make-systemd-constructor in this case. I would be happy to send such a patch for Guix (is there already some patch series on which to graft this?), WDYT @Ludo? I can also send this in RDE, it simplifies a lot although I'm still not sure it yields a better user experience. @Andrew? >> We're using the --daemon option on the Shepherd side to launch the >> server in the background, include code in Emacs configuration to make it >> create a pid-file as soon as the server has started, and redefine >> kill-emacs to be managed by the Shepherd. > > Emacs supports systemd-style socket activation so, instead of using a > PID file, you could use ‘make-systemd-constructor’. > > Now, that code in emacs.c is unfortunately implemented via libsystemd > and thus disabled in Guix. Using libsystemd in this case is unnecessary > (and increases the attack surface, as we’ve seen with the xz backdoor): > it could read the ‘LISTEN_FDS’ and ‘LISTEN_PID’ environment variables > instead of calling the sd_* functions. > > https://www.freedesktop.org/software/systemd/man/latest/sd_listen_fds.html > > https://www.gnu.org/software/shepherd/manual/html_node/Service-De_002d-and-Constructors.html#index-make_002dsystemd_002dconstructor > > Thanks, > Ludo’. -- Best regards, Nicolas Graves