I’m a little late to the game on some of the developments in the Emacs world and don’t like breaking my workflow if I don’t have to. Even so, when I find a package that I find incedibly useful, adjustments are worth the effort. Hydra is one such package that I think all serious Emacs users will appreciate.
The basic idea of a Hydra is that it is a collection of related commands which are all accessible with a leader combination or key. But here’s where it gets interesting - once the leader key is pressed, there is no need to press additional modifiers for functions which are within the scope of that Hydra.
How exactly does this work? Here’s a simple example for when I need to change a numeric argument to a function:
(defhydra hydra-increment (global-map "C-c") ("n" universal-argument) ("u" increment-integer-at-point) ("e" decrement-integer-at-point) ("/" undo))
Notice that the leader combination is “C-c”, and all following commands are dedicated to one kind of task, incrementing or decrementing an integer near the cursor. As long as you don’t press a key that isn’t listed in the body of the Hydra, you can do this any number of times. I also included a way to give a numeric argument to the increment operation for cases when you want to change an integer by some amount other than 1. There is no need to press “C-u” in advance this way. You can also quickly undo an operation without pressing Control.
Neat, but we can do better.
How about a way to manage your windows?
(defhydra hydra-window-manager (global-map "C-.") ("s" split-window-below) ("S" split-window-right) ("o" other-window) ("k" (other-window -1)) ("n" other-window) ("p" (other-window -1)) ("f" find-file-other-window) ("x" ido-find-file) ("l" list-buffers) ("g" execute-extended-command) ("m" notmuch) ("t" eshell) ("d" dired) ("c" calc) ("." delete-other-windows))
For cases when I want to perform a bunch of operations in multiple windows quickly, this unbelievably simple Hydra is up to the task. My most common applications for which I might want to split a window are available, and both horizontal and vertical window management are easy (and there is more than one way to navigate them without the use of vi-like keys). The reason “k” is used instead of “h” is because I’m currently using Colemak Mod-DH, which moves “k” into that position. And granted, I could add a few things for resizing windows and that sort of thing, but it’s not something I often do.
Another thing I find myself doing frequently is moving around and deleting (not killing) text. The reason I delete rather than kill is because I use helm to manage my kill-ring and it is also clipboard-aware, making it something of a lispy clipboard manager in StumpWM. Killing text all the time only clutters the kill-ring up (which I don’t like even though it is searchable), so this does the intended job nicely.
(defhydra hydra-motion-and-deletion (global-map "C-M-S-s-e") ("." mark-line) ("a" move-beginning-of-line) ("n" next-line) ("p" previous-line) ("f" forward-char) ("b" backward-char) ("M-f" forward-word) ("M-b" backward-word) ("e" move-end-of-line) ("k" delete-region) (">" end-of-buffer) ("<" beginning-of-buffer) ("/" undo))
I didn’t draw any inspiration from god-mode for this, but before I knew it, I realized this was looking more and more like a modal package for Emacs. Whoops! It’s surprising that it took so few lines, though.
And lest you think I’m using a ridiculous key combination for that, it is actually a “Hyper” key in QMK that presses all those modifiers at once. I haven’t decided on a good leader combo for this one, so this is my placeholder that didn’t get in the way of any other binding.
As always, this is a work in progress that will be fine-tuned in time.
Experienced Hydra users will probably recognize that there are better ways to do what I presented here and that I’m only scratching the surface of what is possible. I’m aware that Hydras can be linked together, plaintext menus are possible, and that there are a host of other things not covered here. This was really meant to be a quick look to whet the appetite, as it surely did for me. :)
For those not using Hydra, remember, it’s only a package-install away!