I totally forgot about this, but a few months ago I wrote my first Emacs package. Before I tell you about the package itself, some background.
I’m a huge fan of use-package. It’s a great package to bundle all configuration of installed packages together.
You can see how I’m using it in my personal emacs configuration, and below is one example use case:
(use-package whitespace :ensure t :hook ((prog-mode text-mode) . whitespace-mode) :custom-face (whitespace-line ((t (:background "gray90")))) :custom (whitespace-line-column 80) (whitespace-style '(face tabs empty trailing lines-tail)))
So the body of the
(use-package) macro accepts various keywords
- To ensure the package is installed.
- Hook a function to be called by any existing hook, like mode hooks.
- Customize variables defined by the package.
Hydra is a package that got me intrigued. It’s a very sophisticated
package that allows you to configure series of key bindings. It more
or less allows you to activate a temporary key map. But let me explain
with the simplest example from their
(defhydra hydra-zoom (global-map "<f2>") "zoom" ("g" text-scale-increase "in") ("l" text-scale-decrease "out"))
f2 you activate the hydra and then the keys
can be used to zoom in or out. You can keep tapping those two keys,
until you tap any other key and the hydra gets deactivated.
I wanted to use this package, but I was a bit annoyed
didn’t have a
So I wrote use-package-hydra. It’s pretty simple, under 100 lines, and
it just expands the
:hydra keyword to a call to
This is an example from the
(use-package yasnippet :after hydra :bind (:map yas-minor-mode-map ("<f2>" . hydra-yas/body)) :hydra (hydra-yas (:color blue :hint nil) " ^YASnippets^ -------------------------------------------- Modes: Load/Visit: Actions: _g_lobal _d_irectory _i_nsert _m_inor _f_ile _t_ryout _e_xtra _l_ist _n_ew ^ ^ _a_ll " ("d" yas-load-directory) ("e" yas-activate-extra-mode) ("i" yas-insert-snippet) ("f" yas-visit-snippet-file :color blue) ("n" yas-new-snippet) ("t" yas-tryout-snippet) ("l" yas-describe-tables) ("g" yas/global-mode) ("m" yas/minor-mode) ("a" yas-reload-all)))
It defines a hydra named
hydra-yas. Just like the
macro, this will define the function
hydra-yas/body. Inside the
(use-package) body that function is bound to
f2. So pressing
i will trigger
Like I said, I forgot about the package. That is probably because I didn’t get much attention when I announced it on the emacs-devel mailing list. I was hoping for reaction on how to improve the code or hear people being excited about it, but there wasn’t much action.
Also the issue where this package was suggested didn’t get much traction.
Now, honestly, I’m not even using it myself…
I really would like to improve the package, so it’s more DRY1. Like I want to avoid putting in
hydra-yas/body, and have those auto-defined with the user knowing.
Comments are welcome on Reddit.
Don’t Repeat Yourself