From 5e9c6362e4fc90cab5031e6c6b82bffa8fde6ca6 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Fri, 14 Jan 2022 00:13:00 -0800 Subject: [PATCH] Add shepherd configuration with Emacs service --- GNUmakefile | 63 ++++++++++++++++++++----- dotfiles.mk | 12 ----- emacs/.config/shepherd/init.d/emacs.org | 16 +++++++ shepherd/.config/shepherd/init.org | 13 +++++ 4 files changed, 81 insertions(+), 23 deletions(-) delete mode 100644 dotfiles.mk create mode 100644 emacs/.config/shepherd/init.d/emacs.org create mode 100644 shepherd/.config/shepherd/init.org diff --git a/GNUmakefile b/GNUmakefile index ea8fd81..d63de98 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,16 +1,28 @@ -include dotfiles.mk +MODULES=xmodmap emacs xdg shepherd -MODULES=xmodmap emacs picom cower mowedline herbstluftwm xdg -STOW=stow +STOW = stow +EMACS = emacs +SCHEME_IMPLEMENTATION = guile + +define tangle = + @echo -e "\e[35mOBT\e[0m" $< + @$(EMACS) -quick -batch \ + -eval "(package-initialize)" \ + -load ob-tangle \ + -eval "(setq sh-make-vars-local nil)" \ + -eval "(setq geiser-default-implementation '$(SCHEME_IMPLEMENTATION))" \ + -eval "(org-babel-tangle-file \"$<\" \"$(PWD)/$@\" \"$(1)\")" +endef .PHONY: all clean $(MODULES) zsh all: $(MODULES) -build: - mkdir build +install: + cp --recursive --verbose build/. ~/ -clean: $(addsuffix -clean,$(MODULES)) +clean: + rm -r build zsh: $(MAKE) -C $@ @@ -41,14 +53,17 @@ picom-clean: # Emacs # ######### -emacs-install: emacs-stow - xdg-settings set default-url-scheme-handler org-protocol EmacsClient.desktop +emacs: build/.config/shepherd/init.d/ build/.config/shepherd/init.d/emacs.scm \ + emacs/.config/emacs/init.elc + +build/.config/shepherd/init.d/emacs.scm: emacs/.config/shepherd/init.d/emacs.org + $(call tangle) ########### # Xmodmap # ########### -xmodmap: build build/.Xmodmap +xmodmap: build/ build/.Xmodmap build/.Xmodmap: xmodmap/Xmodmap.org $(call tangle,fundamental) @@ -104,10 +119,36 @@ x11/dot-x11-0-1-any.pkg.tar.xz: x11/PKGBUILD # XDG # ####### -xdg: xdg/.config/mimeapps.list xdg/.config/user-dirs.dirs \ - xdg/.config/user-dirs.locale +xdg: build/.config/ build/.config/mimeapps.list build/.config/user-dirs.dirs \ + build/.config/user-dirs.locale + +build/.config/mimeapps.list: xdg/.config/mimeapps.list.org + $(call tangle) + +build/.config/user-dirs.dirs: xdg/.config/user-dirs.dirs.org + $(call tangle) + +build/.config/user-dirs.locale: xdg/.config/user-dirs.locale.org + $(call tangle) + +# Shepherd + +shepherd: build/.config/shepherd/ build/.config/shepherd/init.scm + +build/.config/shepherd/init.scm: shepherd/.config/shepherd/init.org + $(call tangle) # Helper +%.el: %.org + $(call tangle,emacs-lisp) + +%.elc: %.el + @echo -e "\e[36mELC\e[0m" $< + $(EMACS) -batch -f batch-byte-compile $< + %: %.org $(call tangle) + +%/: + mkdir -p $@ diff --git a/dotfiles.mk b/dotfiles.mk deleted file mode 100644 index 50b64a3..0000000 --- a/dotfiles.mk +++ /dev/null @@ -1,12 +0,0 @@ -EMACS = /usr/bin/emacs -SCHEME_IMPLEMENTATION = guile - -define tangle = - @echo -e "\e[35mOBT\e[0m" $< - @$(EMACS) -batch \ - -eval "(package-initialize)" \ - -load ob-tangle \ - -eval "(setq sh-make-vars-local nil)" \ - -eval "(setq geiser-default-implementation '$(SCHEME_IMPLEMENTATION))" \ - -eval "(org-babel-tangle-file \"$<\" \"$(notdir $@)\" \"$(1)\")" -endef diff --git a/emacs/.config/shepherd/init.d/emacs.org b/emacs/.config/shepherd/init.d/emacs.org new file mode 100644 index 0000000..11bef69 --- /dev/null +++ b/emacs/.config/shepherd/init.d/emacs.org @@ -0,0 +1,16 @@ +Define a service for shepherd that starts up Emacs. + +#+begin_src scheme +(define emacs + (make + #:provides '(emacs) + #:docstring "Run `emacs --daemon'" + #:start (make-forkexec-constructor + '("emacs" "--fg-daemon") + #:log-file (string-append (getenv "HOME") "/.logs/emacs.log")) + #:stop (make-kill-destructor))) + +(register-services emacs) + +(start emacs) +#+end_src diff --git a/shepherd/.config/shepherd/init.org b/shepherd/.config/shepherd/init.org new file mode 100644 index 0000000..05c9d6e --- /dev/null +++ b/shepherd/.config/shepherd/init.org @@ -0,0 +1,13 @@ +[[info:shepherd][The Shepherd manual]] suggests that you use a single =init.scm=, but as is pointed out by this article about [[https://guix.gnu.org/en/blog/2020/gnu-shepherd-user-services/][GNU Shepherd user services]] it might be better to have the services in separate files so you can restart them individually if you make any changes to them. So I just put a loading script into =init.scm= that goes through the =init.d= directory and loads each service defined in there. + +#+begin_src scheme +(use-modules (shepherd service) + ((ice-9 ftw) #:select (scandir))) + +(for-each + (λ (file) (load (string-append "init.d/" file))) + (scandir (string-append (dirname (current-filename)) "/init.d") + (λ (file) (string-suffix? ".scm" file)))) + +(action 'shepherd 'daemonize) +#+end_src