Add shepherd configuration with Emacs service

This commit is contained in:
Tom Willemse 2022-01-14 00:13:00 -08:00
parent 976a2c7c28
commit 5e9c6362e4
4 changed files with 81 additions and 23 deletions

View file

@ -1,16 +1,28 @@
include dotfiles.mk
MODULES=xmodmap emacs xdg shepherd
MODULES=xmodmap emacs picom cower mowedline herbstluftwm xdg
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 $@

View file

@ -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

View file

@ -0,0 +1,16 @@
Define a service for shepherd that starts up Emacs.
#+begin_src scheme
(define emacs
(make <service>
#: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

View file

@ -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