After following an article from the author of Mastering Emacs, I was quite pleased with source controlling some encrypted secrets that I use in Emacs regularly, such as my elfeed feeds or IRC password.
In short, it looks like this:
A file, secrets.el.gpg
that contains:
(setq secret-1 "foo"
my/erc-password "hunter2")
From use-package
declarations in init.el
I would load this file:
(use-package erc
:config (load-library "/path/to/secrets.el.gpg"))
(use-package elfeed
:config (load-library "/path/to/secrets.el.gpg"))
...
Of course, having to copy this line was disgusting me as I iteratively and obsessively try to improve my Emacs config.
I decided that I would attempt to define a local package and somehow load it as a "dependency" of other packages.
;; didn't work
(use-package my-secrets
:ensure nil
:load-path "./secrets.el.gpg")
The above didn't work, most likely because it isn't an actual package, even when
I added (provide 'my-secrets)
to the bottom of the encrypted file.
I'm not sure if this is the best solution, but it works and is nicer than having
to call load-library
in each package's :config
.
First, I made a simple wrapper package - .emacs.d/lisp/my-secrets.el
(in my
load-path
) that just calls that frequently copy-pasted line:
(load-library (expand-file-name "secrets.el.gpg" user-emacs-directory))
(provide 'my-secrets)
(use-package my-secrets
:ensure nil)
After some digging in the use-package
source, since this it was undocumented,
I found there is a keyword :load
which seems to do exactly what I want.
Now, in all dependent packages, I can specify:
(use-package erc
:load my-secrets
:custom (erc-password my/erc-secret)
...)
(use-package elfeed
:load my-secrets
:custom (elfeed-feeds my/elfeed-feeds)
...)
A small improvement, but satisfying and feels more idiomatic.
Maybe some elisp wizards know how to improve this even further, or know a better way!