Two new Hydra colors - pink and teal
19 Feb 2015Two new colors are being added up to a total of five: red, blue, amaranth, pink and teal. I should carefully restate what they do to avoid confusion.
The three rules of Hydratics
1. A hydra may not injure a human being or, through inaction, allow a human being to come to harm.
Seriously though, see below.
Rule 1: Hydra heads are either red or blue
Once you're in a Hydra state:
- calling a red head will call the command and continue the state
- calling a blue head will call the command and stop the state
They may have a reddish or a bluish face that isn't exactly red or blue, but that's what they are underneath. I hope you get what I mean.
Rule 2: red or blue is inherited from the body color
This is merely a convenience, you can still explicitly override each head to be blue or red:
- if the body is red, amaranth or pink, the heads inherit red
- if the body is blue or teal, the heads inherit blue
Rule 3:
When you call a binding which isn't a head:
- amaranth, teal and pink Hydras will intercept it
- red and blue Hydras will quit and let Emacs execute your binding
Finally, on intercepting a non-head, amaranth and teal will issue a warning and do nothing without quitting. And pink will try to call the intercepted command without quitting. Currently only non-prefix bindings can be called, since I haven't figured out how to do it for prefixes.
A nice table to sum things up
Thanks to @kaushalmodi for pointing me in this direction:
|----------+-----------+-----------------------+-----------------|
| Body | Head | Executing NON-HEADS | Executing HEADS |
| Color | Inherited | | |
| | Color | | |
|----------+-----------+-----------------------+-----------------|
| amaranth | red | Disallow and Continue | Continue |
| teal | blue | Disallow and Continue | Quit |
| pink | red | Allow and Continue | Continue |
| red | red | Allow and Quit | Continue |
| blue | blue | Allow and Quit | Quit |
|----------+-----------+-----------------------+-----------------|
The extra-awesome Ruby-style Hydra docstrings
Turns out learning Ruby wasn't a complete waste of time, at least I learned about string interpolation. And now I'm sticking it into Elisp packages, first tiny, and now hydra.
How it works:
(defhydra hydra-toggle (:color pink)
"
_a_ abbrev-mode: %`abbrev-mode
_d_ debug-on-error: %`debug-on-error
_f_ auto-fill-mode: %`auto-fill-function
_g_ golden-ratio-mode: %`golden-ratio-mode
_t_ truncate-lines: %`truncate-lines
_w_ whitespace-mode: %`whitespace-mode
"
("a" abbrev-mode nil)
("d" toggle-debug-on-error nil)
("f" auto-fill-mode nil)
("g" golden-ratio-mode nil)
("t" toggle-truncate-lines nil)
("w" whitespace-mode nil)
("q" nil "cancel"))
(global-set-key (kbd "C-c C-v") 'hydra-toggle/body)
Here, using e.g. "_a_"
translates to "a"
with proper face. More
interestingly, e.g.
"foobar %`abbrev-mode"
translates roughly to
(format "foobar %S" abbrev-mode)
This means that you actually see the state of the mode that you're
changing. The escape syntax was chosen with another intent in mind:
because of the backquote, if you have company-mode
on, you can
complete the symbols while in string.
See how it looks like in action:
Small note on pink Hydras
It's useful for instance it the above example, when I don't care about self-inserting, but I still want to do navigation. Basically pink Hydra is the closest thing to an actual minor mode. Thanks to @angelic-sedition for the idea.
Small note on teal Hydras
It provides an interface similar to magit
dispatch: pressing
appropriate keys does things and pressing the wrong keys issues a
warning. The only difference between teal and amaranth is the color
inheritance, otherwise they behave exactly the same. This means that
if you want a non-quitting Hydra that will end up with more blue
heads, start with teal, otherwise, start with amaranth.
Thanks to @ffevotte for the idea.
Outro
It feels like things are finally falling into place with this package. I hope that you like the new changes and find new cool uses for the added abilities. Happy hacking!