emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master e21d1d8 1/7: Update the call order and allow called functi


From: Oleh Krehel
Subject: [elpa] master e21d1d8 1/7: Update the call order and allow called functions to exit
Date: Sun, 08 Feb 2015 15:06:31 +0000

branch: master
commit e21d1d8e89d2af70bccb72d9b169115cf977da1c
Author: Oleh Krehel <address@hidden>
Commit: Oleh Krehel <address@hidden>

    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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]