branch: master commit e21d1d8e89d2af70bccb72d9b169115cf977da1c Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Update the call order and allow called functions to exit * hydra.el (defhydra): First disable the transient map, then call red head, allowing it to throw `hydra-disable' to break, then re-set transient map. If the called function raises an error, display this error for a while, but still set the transient map. * hydra-test.el: Update test. Re #15. --- hydra-test.el | 290 ++++++++++++++++++++++++++++++--------------------------- hydra.el | 18 +++- 2 files changed, 167 insertions(+), 141 deletions(-) diff --git a/hydra-test.el b/hydra-test.el index 07d0a74..f3b4094 100644 --- a/hydra-test.el +++ b/hydra-test.el @@ -46,39 +46,45 @@ The body can be accessed via `hydra-error/body'. Call the head: `first-error'." (interactive) - (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) - 20 21 (face hydra-face-red) - 31 32 (face hydra-face-red)))) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (kp-subtract . hydra--negative-argument) - (kp-9 . hydra--digit-argument) - (kp-8 . hydra--digit-argument) - (kp-7 . hydra--digit-argument) - (kp-6 . hydra--digit-argument) - (kp-5 . hydra--digit-argument) - (kp-4 . hydra--digit-argument) - (kp-3 . hydra--digit-argument) - (kp-2 . hydra--digit-argument) - (kp-1 . hydra--digit-argument) - (kp-0 . hydra--digit-argument) - (57 . hydra--digit-argument) - (56 . hydra--digit-argument) - (55 . hydra--digit-argument) - (54 . hydra--digit-argument) - (53 . hydra--digit-argument) - (52 . hydra--digit-argument) - (51 . hydra--digit-argument) - (50 . hydra--digit-argument) - (49 . hydra--digit-argument) - (48 . hydra--digit-argument) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument))) - t)) - (call-interactively (function first-error))) + (catch (quote hydra-disable) + (hydra-disable) + (condition-case err (prog1 t (call-interactively (function first-error))) + ((debug error) + (message "%S" err) + (sit-for 0.8) + nil)) + (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) + 20 21 (face hydra-face-red) + 31 32 (face hydra-face-red)))) + (setq hydra-last + (hydra-set-transient-map + (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) + (106 . hydra-error/next-error) + (104 . hydra-error/first-error) + (kp-subtract . hydra--negative-argument) + (kp-9 . hydra--digit-argument) + (kp-8 . hydra--digit-argument) + (kp-7 . hydra--digit-argument) + (kp-6 . hydra--digit-argument) + (kp-5 . hydra--digit-argument) + (kp-4 . hydra--digit-argument) + (kp-3 . hydra--digit-argument) + (kp-2 . hydra--digit-argument) + (kp-1 . hydra--digit-argument) + (kp-0 . hydra--digit-argument) + (57 . hydra--digit-argument) + (56 . hydra--digit-argument) + (55 . hydra--digit-argument) + (54 . hydra--digit-argument) + (53 . hydra--digit-argument) + (52 . hydra--digit-argument) + (51 . hydra--digit-argument) + (50 . hydra--digit-argument) + (49 . hydra--digit-argument) + (48 . hydra--digit-argument) + (45 . hydra--negative-argument) + (21 . hydra--universal-argument))) + t)))) (defun hydra-error/next-error nil "Create a hydra with a \"M-g\" body and the heads: \"h\": `first-error', @@ -89,39 +95,45 @@ The body can be accessed via `hydra-error/body'. Call the head: `next-error'." (interactive) - (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) - 20 21 (face hydra-face-red) - 31 32 (face hydra-face-red)))) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (kp-subtract . hydra--negative-argument) - (kp-9 . hydra--digit-argument) - (kp-8 . hydra--digit-argument) - (kp-7 . hydra--digit-argument) - (kp-6 . hydra--digit-argument) - (kp-5 . hydra--digit-argument) - (kp-4 . hydra--digit-argument) - (kp-3 . hydra--digit-argument) - (kp-2 . hydra--digit-argument) - (kp-1 . hydra--digit-argument) - (kp-0 . hydra--digit-argument) - (57 . hydra--digit-argument) - (56 . hydra--digit-argument) - (55 . hydra--digit-argument) - (54 . hydra--digit-argument) - (53 . hydra--digit-argument) - (52 . hydra--digit-argument) - (51 . hydra--digit-argument) - (50 . hydra--digit-argument) - (49 . hydra--digit-argument) - (48 . hydra--digit-argument) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument))) - t)) - (call-interactively (function next-error))) + (catch (quote hydra-disable) + (hydra-disable) + (condition-case err (prog1 t (call-interactively (function next-error))) + ((debug error) + (message "%S" err) + (sit-for 0.8) + nil)) + (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) + 20 21 (face hydra-face-red) + 31 32 (face hydra-face-red)))) + (setq hydra-last + (hydra-set-transient-map + (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) + (106 . hydra-error/next-error) + (104 . hydra-error/first-error) + (kp-subtract . hydra--negative-argument) + (kp-9 . hydra--digit-argument) + (kp-8 . hydra--digit-argument) + (kp-7 . hydra--digit-argument) + (kp-6 . hydra--digit-argument) + (kp-5 . hydra--digit-argument) + (kp-4 . hydra--digit-argument) + (kp-3 . hydra--digit-argument) + (kp-2 . hydra--digit-argument) + (kp-1 . hydra--digit-argument) + (kp-0 . hydra--digit-argument) + (57 . hydra--digit-argument) + (56 . hydra--digit-argument) + (55 . hydra--digit-argument) + (54 . hydra--digit-argument) + (53 . hydra--digit-argument) + (52 . hydra--digit-argument) + (51 . hydra--digit-argument) + (50 . hydra--digit-argument) + (49 . hydra--digit-argument) + (48 . hydra--digit-argument) + (45 . hydra--negative-argument) + (21 . hydra--universal-argument))) + t)))) (defun hydra-error/previous-error nil "Create a hydra with a \"M-g\" body and the heads: \"h\": `first-error', @@ -132,39 +144,45 @@ The body can be accessed via `hydra-error/body'. Call the head: `previous-error'." (interactive) - (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) - 20 21 (face hydra-face-red) - 31 32 (face hydra-face-red)))) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (kp-subtract . hydra--negative-argument) - (kp-9 . hydra--digit-argument) - (kp-8 . hydra--digit-argument) - (kp-7 . hydra--digit-argument) - (kp-6 . hydra--digit-argument) - (kp-5 . hydra--digit-argument) - (kp-4 . hydra--digit-argument) - (kp-3 . hydra--digit-argument) - (kp-2 . hydra--digit-argument) - (kp-1 . hydra--digit-argument) - (kp-0 . hydra--digit-argument) - (57 . hydra--digit-argument) - (56 . hydra--digit-argument) - (55 . hydra--digit-argument) - (54 . hydra--digit-argument) - (53 . hydra--digit-argument) - (52 . hydra--digit-argument) - (51 . hydra--digit-argument) - (50 . hydra--digit-argument) - (49 . hydra--digit-argument) - (48 . hydra--digit-argument) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument))) - t)) - (call-interactively (function previous-error))) + (catch (quote hydra-disable) + (hydra-disable) + (condition-case err (prog1 t (call-interactively (function previous-error))) + ((debug error) + (message "%S" err) + (sit-for 0.8) + nil)) + (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red) + 20 21 (face hydra-face-red) + 31 32 (face hydra-face-red)))) + (setq hydra-last + (hydra-set-transient-map + (setq hydra-curr-map '(keymap (107 . hydra-error/previous-error) + (106 . hydra-error/next-error) + (104 . hydra-error/first-error) + (kp-subtract . hydra--negative-argument) + (kp-9 . hydra--digit-argument) + (kp-8 . hydra--digit-argument) + (kp-7 . hydra--digit-argument) + (kp-6 . hydra--digit-argument) + (kp-5 . hydra--digit-argument) + (kp-4 . hydra--digit-argument) + (kp-3 . hydra--digit-argument) + (kp-2 . hydra--digit-argument) + (kp-1 . hydra--digit-argument) + (kp-0 . hydra--digit-argument) + (57 . hydra--digit-argument) + (56 . hydra--digit-argument) + (55 . hydra--digit-argument) + (54 . hydra--digit-argument) + (53 . hydra--digit-argument) + (52 . hydra--digit-argument) + (51 . hydra--digit-argument) + (50 . hydra--digit-argument) + (49 . hydra--digit-argument) + (48 . hydra--digit-argument) + (45 . hydra--negative-argument) + (21 . hydra--universal-argument))) + t)))) (unless (keymapp (lookup-key global-map (kbd "M-g"))) (define-key global-map (kbd "M-g") nil)) @@ -237,8 +255,8 @@ The body can be accessed via `toggle/body'. Call the head: `toggle-truncate-lines'." (interactive) - (hydra-disable) - (call-interactively (function toggle-truncate-lines))) +(hydra-disable) +(call-interactively (function toggle-truncate-lines))) (defun toggle/auto-fill-mode nil "Create a hydra with no body and the heads: \"t\": `toggle-truncate-lines', @@ -250,8 +268,8 @@ The body can be accessed via `toggle/body'. Call the head: `auto-fill-mode'." (interactive) - (hydra-disable) - (call-interactively (function auto-fill-mode))) +(hydra-disable) +(call-interactively (function auto-fill-mode))) (defun toggle/abbrev-mode nil "Create a hydra with no body and the heads: \"t\": `toggle-truncate-lines', @@ -263,8 +281,8 @@ The body can be accessed via `toggle/body'. Call the head: `abbrev-mode'." (interactive) - (hydra-disable) - (call-interactively (function abbrev-mode))) +(hydra-disable) +(call-interactively (function abbrev-mode))) (defun toggle/nil nil "Create a hydra with no body and the heads: \"t\": `toggle-truncate-lines', @@ -276,7 +294,7 @@ The body can be accessed via `toggle/body'. Call the head: `nil'." (interactive) - (hydra-disable)) +(hydra-disable)) (defun toggle/body nil "Create a hydra with no body and the heads: \"t\": `toggle-truncate-lines', @@ -286,40 +304,40 @@ Call the head: `nil'." The body can be accessed via `toggle/body'." (interactive) - (when hydra-is-helpful (message #("toggle: [t]: truncate, [f]: fill, [a]: abbrev, [q]: cancel." 9 10 (face hydra-face-blue) - 24 25 (face hydra-face-blue) - 35 36 (face hydra-face-blue) - 48 49 (face hydra-face-blue)))) +(when hydra-is-helpful (message #("toggle: [t]: truncate, [f]: fill, [a]: abbrev, [q]: cancel." 9 10 (face hydra-face-blue) + 24 25 (face hydra-face-blue) + 35 36 (face hydra-face-blue) + 48 49 (face hydra-face-blue)))) (setq hydra-last (hydra-set-transient-map '(keymap (113 . toggle/nil) - (97 . toggle/abbrev-mode) - (102 . toggle/auto-fill-mode) - (116 . toggle/toggle-truncate-lines) - (kp-subtract . hydra--negative-argument) - (kp-9 . hydra--digit-argument) - (kp-8 . hydra--digit-argument) - (kp-7 . hydra--digit-argument) - (kp-6 . hydra--digit-argument) - (kp-5 . hydra--digit-argument) - (kp-4 . hydra--digit-argument) - (kp-3 . hydra--digit-argument) - (kp-2 . hydra--digit-argument) - (kp-1 . hydra--digit-argument) - (kp-0 . hydra--digit-argument) - (57 . hydra--digit-argument) - (56 . hydra--digit-argument) - (55 . hydra--digit-argument) - (54 . hydra--digit-argument) - (53 . hydra--digit-argument) - (52 . hydra--digit-argument) - (51 . hydra--digit-argument) - (50 . hydra--digit-argument) - (49 . hydra--digit-argument) - (48 . hydra--digit-argument) - (45 . hydra--negative-argument) + (97 . toggle/abbrev-mode) + (102 . toggle/auto-fill-mode) + (116 . toggle/toggle-truncate-lines) + (kp-subtract . hydra--negative-argument) + (kp-9 . hydra--digit-argument) + (kp-8 . hydra--digit-argument) + (kp-7 . hydra--digit-argument) + (kp-6 . hydra--digit-argument) + (kp-5 . hydra--digit-argument) + (kp-4 . hydra--digit-argument) + (kp-3 . hydra--digit-argument) + (kp-2 . hydra--digit-argument) + (kp-1 . hydra--digit-argument) + (kp-0 . hydra--digit-argument) + (57 . hydra--digit-argument) + (56 . hydra--digit-argument) + (55 . hydra--digit-argument) + (54 . hydra--digit-argument) + (53 . hydra--digit-argument) + (52 . hydra--digit-argument) + (51 . hydra--digit-argument) + (50 . hydra--digit-argument) + (49 . hydra--digit-argument) + (48 . hydra--digit-argument) + (45 . hydra--negative-argument) (21 . hydra--universal-argument)) - t))))))) + t))))))) (provide 'hydra-test) diff --git a/hydra.el b/hydra.el index 738b77c..043b2a3 100644 --- a/hydra.el +++ b/hydra.el @@ -313,11 +313,19 @@ in turn can be either red or blue." `((hydra-disable) ,@(unless (null (cadr head)) `((call-interactively #',(cadr head))))) - `((when hydra-is-helpful - (message ,hint)) - (setq hydra-last - (hydra-set-transient-map (setq hydra-curr-map ',keymap) t)) - (call-interactively #',(cadr head)))))) + `((catch 'hydra-disable + (hydra-disable) + (condition-case err + (prog1 t + (call-interactively #',(cadr head))) + ((debug error) + (message "%S" err) + (sit-for 0.8) + nil)) + (when hydra-is-helpful + (message ,hint)) + (setq hydra-last + (hydra-set-transient-map (setq hydra-curr-map ',keymap) t))))))) heads names) ,@(unless (or (null body-key) (null method)