(use-modules (ice-9 match)) (define-syntax-rule (forever body ...) (while #t body ...)) (define-syntax-rule (with-fork body ...) (match (primitive-fork) (0 (begin body ...)) (pid pid))) (define (touch-file file) (close-port (open-file file "a0b"))) (define (run-command command) (zero? (status:exit-val (apply system* command)))) (define (make-system-constructor command) (lambda _ (run-command command))) (define (make-system-destructor command) (lambda _ (not (run-command command)))) (define (simple-service program) (make #:provides (list (string->symbol program)) #:requires '() #:start (make-forkexec-constructor (list program)) #:stop (make-kill-destructor))) (define %home (getenv "HOME")) (register-services ;; Emacs (make #:provides '(emacs) #:requires '() #:start (make-system-constructor '("emacs" "--daemon")) #:stop (make-system-destructor '("emacsclient" "--eval" "(kill-emacs)"))) ;; Customize X key bindings. (make #:provides '(xmodmap) #:requires '() #:start (make-forkexec-constructor (list "xmodmap" (string-append %home "/.xmodmap")))) ;; GPG/SSH agent. (make #:provides '(gpg-agent) #:requires '() #:start (make-system-constructor (list "gpg-agent" "--daemon" "--enable-ssh-support" "--pinentry-program" (string-append %home "/.guix-profile/bin/pinentry-gtk-2"))) #:stop (make-system-destructor '("gpg-connect-agent" "killagent" "/bye"))) ;; Mailbox sync. (make #:provides '(offlineimap) #:requires '() #:start (lambda args (with-fork ;; OfflineIMAP's "autorefresh" mode consistently ;; consumes all of the RAM on my machine, so let's just ;; run it in a loop instead. (forever (system* "offlineimap") (sleep 20)))) #:stop (make-kill-destructor)) ;; FUSE (make #:provides '(sshfs) #:requires '() #:start (make-forkexec-constructor (list "sshfs" "aigis:Music" (string-append %home "/Music")))) ;; Music. (make #:provides '(mpd) #:requires '() #:start (lambda args (define (scope file) (string-append %home "/.config/mpd/" file)) (unless (file-exists? (scope "playlists")) (mkdir (scope "playlists"))) (touch-file (scope "database")) (fork+exec-command (list "mpd" (scope "mpd.conf"))))) (simple-service "mpdscribble")) ;; Send dmd into the background (action 'dmd 'daemonize) ;; Services to start when dmd starts: (for-each start '(emacs xmodmap gpg-agent offlineimap sshfs mpd))