branch: master
commit eb1e0fc25c239ad8a3893c9e85479cae0a880035
Author: Oleh Krehel <[email protected]>
Commit: Oleh Krehel <[email protected]>
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))