aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2022-01-14 00:13:00 -0800
committerGravatar Tom Willemse2022-01-14 00:13:00 -0800
commit5e9c6362e4fc90cab5031e6c6b82bffa8fde6ca6 (patch)
treea6b63d514660a80bced39809de7d3fe9c0d07a3b
parent976a2c7c284aadcdba3fd4505a7dea19fe48e7d5 (diff)
downloadnew-dotfiles-5e9c6362e4fc90cab5031e6c6b82bffa8fde6ca6.tar.gz
new-dotfiles-5e9c6362e4fc90cab5031e6c6b82bffa8fde6ca6.zip
Add shepherd configuration with Emacs service
-rw-r--r--GNUmakefile65
-rw-r--r--dotfiles.mk12
-rw-r--r--emacs/.config/shepherd/init.d/emacs.org16
-rw-r--r--shepherd/.config/shepherd/init.org13
4 files changed, 82 insertions, 24 deletions
diff --git a/GNUmakefile b/GNUmakefile
index ea8fd81..d63de98 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,16 +1,28 @@
-include dotfiles.mk
-
-MODULES=xmodmap emacs picom cower mowedline herbstluftwm xdg
-STOW=stow
+MODULES=xmodmap emacs xdg shepherd
+
+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 <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
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