]> code.delx.au - gnu-emacs-elpa/commitdiff
Define a keymap var for each hydra and re-use it
authorOleh Krehel <ohwoeowho@gmail.com>
Sat, 28 Mar 2015 15:08:03 +0000 (16:08 +0100)
committerOleh Krehel <ohwoeowho@gmail.com>
Sat, 28 Mar 2015 15:08:03 +0000 (16:08 +0100)
* 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
hydra.el

index 155c047e8aaa25e44b7c4fa2bc7a472b6cbb1d7c..9fc4ad0dfdd9aa89ed601ba373ec8c3a2bab8e37 100644 (file)
        ("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:
 
 \"\a\":    `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:
 
 \"\a\":    `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:
 
 \"\a\":    `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 ()
index 18233afeb672c9a512d8f474826a6ab67787dc91..47badef4e3a8ddb6611ee98fedf43b060793a37e 100644 (file)
--- 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))))))