Emacs Hydra: Allow completion when I can't remember the command name
| emacsSo it turns out that I'm pretty much zonked after a day with the kiddo and have a hard time remembering keystrokes or speed-reading my Hydra cheat sheets. I want to be able to use M-x-like completion in my Hydra so that I can type a few characters and then maybe see the shortcuts there. Here's what it looks like:
Figure 1: Hydra completion
(defun my/hydra-format-head (h) (let ((key-binding (elt h 0)) (hint (elt h 2)) (cmd (and (elt h 1) (prin1-to-string (elt h 1))))) (if cmd (format "%s (%s) - %s" hint key-binding cmd) (format "%s (%s)" hint key-binding)))) (defun my/hydra-current-heads-as-candidates () (let ((base (replace-regexp-in-string "/body$" "" (symbol-name hydra-curr-body-fn)))) (mapcar (lambda (h) (cons (my/hydra-format-head h) (hydra--head-name h (intern base)))) (symbol-value (intern (concat base "/heads")))))) (defun my/hydra-execute-extended (prefixarg &optional command-name typed) (declare (interactive-only command-execute)) (interactive (let ((execute-extended-command--last-typed nil) (candidates (my/hydra-current-heads-as-candidates))) (hydra-keyboard-quit) (list current-prefix-arg (completing-read "Cmd: " candidates) execute-extended-command--last-typed))) (let* ((candidates (my/hydra-current-heads-as-candidates)) (bind (assoc-default command-name candidates 'string=))) (cond ((null bind) nil) ((hydra--callablep bind) (call-interactively bind)))))
This is how I add it to all my hydras:
(with-eval-after-load 'hydra (define-key hydra-base-map (kbd "<tab>") #'my/hydra-execute-extended))
Proooobably works? Very rough. Might be useful for those fuzzy-brain days.
This is part of my Emacs configuration.
You can comment with Disqus or you can e-mail me at sacha@sachachua.com.