branch: master commit eb1e0fc25c239ad8a3893c9e85479cae0a880035 Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Don't bind nil heads in outside keymaps * hydra.el (hydra-exit): New command to be used for nil heads. (hydra--delete-duplicates): Update for `hydra-exit'. (defhydra): Don't bind `hydra-exit' in outside keymaps. * hydra-test.el (hydra-blue-toggle): Update test. (hydra-amaranth-vi): Update test. Fixes #48. --- hydra-test.el | 37 +++------------------------ hydra.el | 77 +++++++++++++++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 67 deletions(-) diff --git a/hydra-test.el b/hydra-test.el index b904f2d..b4a1994 100644 --- a/hydra-test.el +++ b/hydra-test.el @@ -297,20 +297,6 @@ Call the head: `abbrev-mode'." (hydra-cleanup) (catch (quote hydra-disable) (call-interactively (function abbrev-mode)))) - (defun hydra-toggle/nil nil "Create a hydra with no body and the heads: - -\"t\": `toggle-truncate-lines', -\"f\": `auto-fill-mode', -\"a\": `abbrev-mode', -\"q\": `nil' - -The body can be accessed via `hydra-toggle/body'. - -Call the head: `nil'." - (interactive) - (hydra-disable) - (hydra-cleanup) - (catch (quote hydra-disable))) (defun hydra-toggle/hint nil (if hydra-lv (lv-message (format #("toggle: [t]: truncate, [f]: fill, [a]: abbrev, [q]: cancel." 9 10 (face hydra-face-blue) 24 25 (face hydra-face-blue) @@ -337,7 +323,7 @@ The body can be accessed via `hydra-toggle/body'." (setq hydra-curr-map (quote (keymap (7 . hydra-keyboard-quit) - (113 . hydra-toggle/nil) + (113 . hydra-exit) (97 . hydra-toggle/abbrev-mode) (102 . hydra-toggle/auto-fill-mode) (116 . hydra-toggle/toggle-truncate-lines) @@ -410,7 +396,7 @@ Call the head: `next-line'." (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) (hydra-vi/hint))) (7 . hydra-keyboard-quit) - (113 . hydra-vi/nil) + (113 . hydra-exit) (107 . hydra-vi/previous-line) (106 . hydra-vi/next-line) (kp-subtract . hydra--negative-argument) @@ -465,7 +451,7 @@ Call the head: `previous-line'." (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) (hydra-vi/hint))) (7 . hydra-keyboard-quit) - (113 . hydra-vi/nil) + (113 . hydra-exit) (107 . hydra-vi/previous-line) (106 . hydra-vi/next-line) (kp-subtract . hydra--negative-argument) @@ -492,21 +478,6 @@ Call the head: `previous-line'." (45 . hydra--negative-argument) (21 . hydra--universal-argument)))) t (lambda nil (hydra-cleanup)))))) - (defun hydra-vi/nil nil "Create a hydra with no body and the heads: - -\"j\": `next-line', -\"k\": `previous-line', -\"q\": `nil' - -The body can be accessed via `hydra-vi/body'. - -Call the head: `nil'." - (interactive) - (set-cursor-color "#e52b50") - (hydra-disable) - (hydra-cleanup) - (catch (quote hydra-disable) - (set-cursor-color "#ffffff"))) (defun hydra-vi/hint nil (if hydra-lv (lv-message (format #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth) 7 8 (face hydra-face-amaranth) @@ -536,7 +507,7 @@ The body can be accessed via `hydra-vi/body'." (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) (hydra-vi/hint))) (7 . hydra-keyboard-quit) - (113 . hydra-vi/nil) + (113 . hydra-exit) (107 . hydra-vi/previous-line) (106 . hydra-vi/next-line) (kp-subtract . hydra--negative-argument) diff --git a/hydra.el b/hydra.el index ecbc409..cc3e5fe 100644 --- a/hydra.el +++ b/hydra.el @@ -378,6 +378,12 @@ BODY is the second argument to `defhydra'" (t (setq overriding-terminal-local-map nil)))) +(defun hydra-exit () + "Exit the current Hydra and clean up." + (interactive) + (hydra-disable) + (hydra-cleanup)) + (defun hydra--unalias-var (str prefix) "Return the symbol named STR if it's bound as a variable. Otherwise, add PREFIX to the symbol name." @@ -634,15 +640,17 @@ NAME, BODY and HEADS are parameters to `defhydra'." In duplicate HEADS, :cmd-name is modified to whatever they duplicate." (let (res ali entry) (dolist (h heads) - (if (setq entry (assoc (cons (cadr h) - (hydra--head-color h '(nil nil))) - ali)) - (setf (cl-cdddr h) (plist-put (cl-cdddr h) :cmd-name (cdr entry))) - (push (cons (cons (cadr h) - (hydra--head-color h '(nil nil))) - (plist-get (cl-cdddr h) :cmd-name)) - ali) - (push h res))) + (if (null (cadr h)) + (setf (cl-cdddr h) (plist-put (cl-cdddr h) :cmd-name 'hydra-exit)) + (if (setq entry (assoc (cons (cadr h) + (hydra--head-color h '(nil nil))) + ali)) + (setf (cl-cdddr h) (plist-put (cl-cdddr h) :cmd-name (cdr entry))) + (push (cons (cons (cadr h) + (hydra--head-color h '(nil nil))) + (plist-get (cl-cdddr h) :cmd-name)) + ali) + (push h res)))) (nreverse res))) ;;* Macros @@ -755,31 +763,32 @@ result of `defhydra'." ,@(delq nil (cl-mapcar (lambda (head) - (let ((name (hydra--head-name head name))) - (when (or body-key method) - (let ((bind (hydra--head-property head :bind 'default)) - (final-key - (if body-key - (vconcat (kbd body-key) (kbd (car head))) - (kbd (car head))))) - (cond ((null bind) nil) - - ((eq bind 'default) - (list - (if (hydra--callablep method) - 'funcall - 'define-key) - method - final-key - (list 'function name))) - - ((hydra--callablep bind) - `(funcall (function ,bind) - ,final-key - (function ,name))) - - (t - (error "Invalid :bind property %S" head))))))) + (let ((name (hydra--head-property head :cmd-name))) + (unless (eq name 'hydra-exit) + (when (or body-key method) + (let ((bind (hydra--head-property head :bind 'default)) + (final-key + (if body-key + (vconcat (kbd body-key) (kbd (car head))) + (kbd (car head))))) + (cond ((null bind) nil) + + ((eq bind 'default) + (list + (if (hydra--callablep method) + 'funcall + 'define-key) + method + final-key + (list 'function name))) + + ((hydra--callablep bind) + `(funcall (function ,bind) + ,final-key + (function ,name))) + + (t + (error "Invalid :bind property %S" head)))))))) heads)) (defun ,(intern (format "%S/hint" name)) () ,(hydra--message name body docstring heads))