branch: master commit d0cc1c5f5b3bfdf1b92e359d8ca6259345c1db0d Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Define a keymap var for each hydra and re-use it * hydra.el (hydra--make-defun): It will receive not the keymap, but the variable that hold the keymap. (defhydra): Define keymap as a variable. * hydra-test.el (hydra-red-error): Update test. (hydra-blue-toggle): Update test. (hydra-amaranth-vi): Update test. (hydra-zoom-duplicate-1): Update test. (hydra-zoom-duplicate-2): Update test. --- hydra-test.el | 620 ++++++++++++++++++--------------------------------------- hydra.el | 17 +- 2 files changed, 207 insertions(+), 430 deletions(-) diff --git a/hydra-test.el b/hydra-test.el index 155c047..9fc4ad0 100644 --- a/hydra-test.el +++ b/hydra-test.el @@ -37,6 +37,37 @@ ("k" previous-error "prev") ("SPC" hydra-repeat "rep" :bind nil))) '(progn + (defvar hydra-error/keymap + (quote (keymap (7 . hydra-keyboard-quit) + (32 . hydra-repeat) + (107 . hydra-error/previous-error) + (106 . hydra-error/next-error) + (104 . hydra-error/first-error) + (switch-frame . hydra--handle-switch-frame) + (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))) + "Keymap for hydra-error.") (defun hydra-error/first-error nil "Create a hydra with a \"M-g\" body and the heads: \"h\": `first-error', @@ -51,45 +82,13 @@ Call the head: `first-error'." (hydra-default-pre) (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function first-error))) + (condition-case err (call-interactively (function first-error)) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-error/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (32 . hydra-repeat) - (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-error/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-error/next-error nil "Create a hydra with a \"M-g\" body and the heads: \"h\": `first-error', @@ -104,45 +103,13 @@ Call the head: `next-error'." (hydra-default-pre) (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function next-error))) + (condition-case err (call-interactively (function next-error)) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-error/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (32 . hydra-repeat) - (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-error/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-error/previous-error nil "Create a hydra with a \"M-g\" body and the heads: \"h\": `first-error', @@ -157,54 +124,22 @@ Call the head: `previous-error'." (hydra-default-pre) (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function previous-error))) + (condition-case err (call-interactively (function previous-error)) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-error/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (32 . hydra-repeat) - (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-error/keymap) + t (lambda nil (hydra-cleanup)))))) (unless (keymapp (lookup-key global-map (kbd "M-g"))) (define-key global-map (kbd "M-g") nil)) (define-key global-map [134217831 104] - (function hydra-error/first-error)) + (function hydra-error/first-error)) (define-key global-map [134217831 106] - (function hydra-error/next-error)) + (function hydra-error/next-error)) (define-key global-map [134217831 107] - (function hydra-error/previous-error)) + (function hydra-error/previous-error)) (defun hydra-error/hint nil (if hydra-lv (lv-message (format #("error: [h]: first, [j]: next, [k]: prev, [SPC]: rep." 8 9 (face hydra-face-red) 20 21 (face hydra-face-red) @@ -227,39 +162,8 @@ The body can be accessed via `hydra-error/body'." (hydra-disable) (catch (quote hydra-disable) (when hydra-is-helpful (hydra-error/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (32 . hydra-repeat) - (107 . hydra-error/previous-error) - (106 . hydra-error/next-error) - (104 . hydra-error/first-error) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-error/keymap) + t (lambda nil (hydra-cleanup)))) (setq prefix-arg current-prefix-arg))))))) (ert-deftest hydra-blue-toggle () @@ -273,6 +177,37 @@ The body can be accessed via `hydra-error/body'." ("a" abbrev-mode "abbrev") ("q" nil "cancel"))) '(progn + (defvar hydra-toggle/keymap + (quote (keymap (7 . hydra-keyboard-quit) + (113 . hydra-toggle/nil) + (97 . hydra-toggle/abbrev-mode-and-exit) + (102 . hydra-toggle/auto-fill-mode-and-exit) + (116 . hydra-toggle/toggle-truncate-lines-and-exit) + (switch-frame . hydra--handle-switch-frame) + (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))) + "Keymap for hydra-toggle.") (defun hydra-toggle/toggle-truncate-lines-and-exit nil "Create a hydra with no body and the heads: \"t\": `toggle-truncate-lines', @@ -358,39 +293,8 @@ The body can be accessed via `hydra-toggle/body'." (hydra-disable) (catch (quote hydra-disable) (when hydra-is-helpful (hydra-toggle/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (113 . hydra-toggle/nil) - (97 . hydra-toggle/abbrev-mode-and-exit) - (102 . hydra-toggle/auto-fill-mode-and-exit) - (116 . hydra-toggle/toggle-truncate-lines-and-exit) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-toggle/keymap) + t (lambda nil (hydra-cleanup)))) (setq prefix-arg current-prefix-arg))))))) (ert-deftest hydra-amaranth-vi () @@ -408,6 +312,41 @@ The body can be accessed via `hydra-toggle/body'." ("k" previous-line) ("q" nil "quit"))) '(progn + (defvar hydra-vi/keymap + (quote (keymap (t lambda nil (interactive) + (message "An amaranth Hydra can only exit through a blue head") + (hydra-set-transient-map hydra-curr-map t) + (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) + (hydra-vi/hint))) + (113 . hydra-vi/nil) + (107 . hydra-vi/previous-line) + (106 . hydra-vi/next-line) + (7 . hydra-vi/hydra-keyboard-quit-and-exit) + (switch-frame . hydra--handle-switch-frame) + (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))) + "Keymap for hydra-vi.") (defun hydra-vi/hydra-keyboard-quit-and-exit nil "Create a hydra with no body and the heads: \"\": `hydra-keyboard-quit', @@ -441,49 +380,13 @@ Call the head: `next-line'." (set-cursor-color "#e52b50") (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function next-line))) + (condition-case err (call-interactively (function next-line)) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-vi/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (t lambda nil (interactive) - (message "An amaranth Hydra can only exit through a blue head") - (hydra-set-transient-map hydra-curr-map t) - (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) - (hydra-vi/hint))) - (113 . hydra-vi/nil) - (107 . hydra-vi/previous-line) - (106 . hydra-vi/next-line) - (7 . hydra-vi/hydra-keyboard-quit-and-exit) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-vi/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-vi/previous-line nil "Create a hydra with no body and the heads: \"\": `hydra-keyboard-quit', @@ -499,49 +402,13 @@ Call the head: `previous-line'." (set-cursor-color "#e52b50") (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function previous-line))) + (condition-case err (call-interactively (function previous-line)) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-vi/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (t lambda nil (interactive) - (message "An amaranth Hydra can only exit through a blue head") - (hydra-set-transient-map hydra-curr-map t) - (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) - (hydra-vi/hint))) - (113 . hydra-vi/nil) - (107 . hydra-vi/previous-line) - (106 . hydra-vi/next-line) - (7 . hydra-vi/hydra-keyboard-quit-and-exit) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-vi/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-vi/nil nil "Create a hydra with no body and the heads: \"\": `hydra-keyboard-quit', @@ -580,43 +447,8 @@ The body can be accessed via `hydra-vi/body'." (hydra-disable) (catch (quote hydra-disable) (when hydra-is-helpful (hydra-vi/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (t lambda nil (interactive) - (message "An amaranth Hydra can only exit through a blue head") - (hydra-set-transient-map hydra-curr-map t) - (when hydra-is-helpful (unless hydra-lv (sit-for 0.8)) - (hydra-vi/hint))) - (113 . hydra-vi/nil) - (107 . hydra-vi/previous-line) - (106 . hydra-vi/next-line) - (7 . hydra-vi/hydra-keyboard-quit-and-exit) - (switch-frame . hydra--handle-switch-frame) - (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 (lambda nil (hydra-cleanup)))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-vi/keymap) + t (lambda nil (hydra-cleanup)))) (setq prefix-arg current-prefix-arg))))))) (ert-deftest defhydradio () @@ -906,6 +738,34 @@ _f_ auto-fill-mode: %`auto-fill-function ("0" (text-scale-set 0) :bind nil :exit t) ("1" (text-scale-set 0) nil :bind nil :exit t))) '(progn + (defvar hydra-zoom/keymap + (quote (keymap (7 . hydra-keyboard-quit) + (114 . hydra-zoom/lambda-r) + (switch-frame . hydra--handle-switch-frame) + (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-zoom/lambda-0-and-exit) + (48 . hydra-zoom/lambda-0-and-exit) + (45 . hydra--negative-argument) + (21 . hydra--universal-argument))) + "Keymap for hydra-zoom.") (defun hydra-zoom/lambda-r nil "Create a hydra with no body and the heads: \"r\": `(text-scale-set 0)', @@ -919,43 +779,14 @@ Call the head: `(text-scale-set 0)'." (hydra-default-pre) (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function (lambda nil (interactive) - (text-scale-set 0))))) + (condition-case err (call-interactively (function (lambda nil (interactive) + (text-scale-set 0)))) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-zoom/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (114 . hydra-zoom/lambda-r) - (switch-frame . hydra--handle-switch-frame) - (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-zoom/lambda-0-and-exit) - (48 . hydra-zoom/lambda-0-and-exit) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument)))) - t (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-zoom/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-zoom/lambda-0-and-exit nil "Create a hydra with no body and the heads: \"r\": `(text-scale-set 0)', @@ -989,36 +820,8 @@ The body can be accessed via `hydra-zoom/body'." (hydra-disable) (catch (quote hydra-disable) (when hydra-is-helpful (hydra-zoom/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (114 . hydra-zoom/lambda-r) - (switch-frame . hydra--handle-switch-frame) - (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-zoom/lambda-0-and-exit) - (48 . hydra-zoom/lambda-0-and-exit) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument)))) - t (lambda nil (hydra-cleanup)))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-zoom/keymap) + t (lambda nil (hydra-cleanup)))) (setq prefix-arg current-prefix-arg))))))) (ert-deftest hydra-zoom-duplicate-2 () @@ -1031,6 +834,34 @@ The body can be accessed via `hydra-zoom/body'." ("0" (text-scale-set 0) :bind nil :exit t) ("1" (text-scale-set 0) nil :bind nil))) '(progn + (defvar hydra-zoom/keymap + (quote (keymap (7 . hydra-keyboard-quit) + (114 . hydra-zoom/lambda-r) + (switch-frame . hydra--handle-switch-frame) + (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-zoom/lambda-r) + (48 . hydra-zoom/lambda-0-and-exit) + (45 . hydra--negative-argument) + (21 . hydra--universal-argument))) + "Keymap for hydra-zoom.") (defun hydra-zoom/lambda-r nil "Create a hydra with no body and the heads: \"r\": `(text-scale-set 0)', @@ -1044,43 +875,14 @@ Call the head: `(text-scale-set 0)'." (hydra-default-pre) (hydra-disable) (catch (quote hydra-disable) - (condition-case err (prog1 t (call-interactively (function (lambda nil (interactive) - (text-scale-set 0))))) + (condition-case err (call-interactively (function (lambda nil (interactive) + (text-scale-set 0)))) ((quit error) (message "%S" err) - (unless hydra-lv (sit-for 0.8)) - nil)) + (unless hydra-lv (sit-for 0.8)))) (when hydra-is-helpful (hydra-zoom/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (114 . hydra-zoom/lambda-r) - (switch-frame . hydra--handle-switch-frame) - (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-zoom/lambda-r) - (48 . hydra-zoom/lambda-0-and-exit) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument)))) - t (lambda nil (hydra-cleanup)))))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-zoom/keymap) + t (lambda nil (hydra-cleanup)))))) (defun hydra-zoom/lambda-0-and-exit nil "Create a hydra with no body and the heads: \"r\": `(text-scale-set 0)', @@ -1096,7 +898,7 @@ Call the head: `(text-scale-set 0)'." (hydra-cleanup) (catch (quote hydra-disable) (call-interactively (function (lambda nil (interactive) - (text-scale-set 0)))))) + (text-scale-set 0)))))) (defun hydra-zoom/hint nil (if hydra-lv (lv-message (format #("zoom: [r 0]: reset." 7 8 (face hydra-face-red) 9 10 (face hydra-face-blue)))) @@ -1114,36 +916,8 @@ The body can be accessed via `hydra-zoom/body'." (hydra-disable) (catch (quote hydra-disable) (when hydra-is-helpful (hydra-zoom/hint)) - (setq hydra-last - (hydra-set-transient-map - (setq hydra-curr-map - (quote (keymap (7 . hydra-keyboard-quit) - (114 . hydra-zoom/lambda-r) - (switch-frame . hydra--handle-switch-frame) - (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-zoom/lambda-r) - (48 . hydra-zoom/lambda-0-and-exit) - (45 . hydra--negative-argument) - (21 . hydra--universal-argument)))) - t (lambda nil (hydra-cleanup)))) + (setq hydra-last (hydra-set-transient-map (setq hydra-curr-map hydra-zoom/keymap) + t (lambda nil (hydra-cleanup)))) (setq prefix-arg current-prefix-arg))))))) (ert-deftest hydra--pad () diff --git a/hydra.el b/hydra.el index 18233af..47badef 100644 --- a/hydra.el +++ b/hydra.el @@ -598,18 +598,16 @@ OTHER-POST is an optional extension to the :post key of BODY." ,body-post) `(,(when cmd `(condition-case err - (prog1 t - (call-interactively #',cmd)) + (call-interactively #',cmd) ((quit error) (message "%S" err) (unless hydra-lv - (sit-for 0.8)) - nil))) + (sit-for 0.8))))) (when hydra-is-helpful (,hint)) (setq hydra-last (hydra-set-transient-map - (setq hydra-curr-map ',keymap) + (setq hydra-curr-map ,keymap) t ,(if (and (not (memq body-color @@ -886,6 +884,7 @@ result of `defhydra'." (when (keywordp (car body)) (setq body (cons nil (cons nil body)))) (let* ((keymap (copy-keymap hydra-base-map)) + (keymap-name (intern (format "%S/keymap" name))) (body-name (intern (format "%S/body" name))) (body-key (cadr body)) (body-plist (cddr body)) @@ -930,10 +929,14 @@ result of `defhydra'." (hydra--make-funcall body-body-pre) (hydra--handle-nonhead keymap name body heads) `(progn + ;; create keymap + (defvar ,keymap-name + ',keymap + ,(format "Keymap for %S." name)) ;; create defuns ,@(mapcar (lambda (head) - (hydra--make-defun name body doc head keymap + (hydra--make-defun name body doc head keymap-name body-pre body-post)) heads-nodup) ;; free up keymap prefix @@ -970,7 +973,7 @@ result of `defhydra'." ,(hydra--message name body docstring heads)) ,(hydra--make-defun name body doc '(nil body) - keymap + keymap-name (or body-body-pre body-pre) body-post '(setq prefix-arg current-prefix-arg))))))