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

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

[elpa] master 1a13273 06/22: Allow to pause arbitrary hydras to the stac


From: Oleh Krehel
Subject: [elpa] master 1a13273 06/22: Allow to pause arbitrary hydras to the stack
Date: Fri, 16 Oct 2015 10:06:55 +0000

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

    Allow to pause arbitrary hydras to the stack
    
    * hydra.el (hydra-pause-resume): New command.
    (hydra-pause-ring): New defvar. Stores the paused hydras.
    (hydra-keyboard-quit): Set `hydra-curr-map' to nil, so it's possible to
    determine if any hydra is active.
    (hydra--clearfun): Ignore `hydra-pause-resume', since the hydra needs to
    be active for `hydra-pause-resume'.
    
    Fixes #135
---
 hydra.el |   43 +++++++++++++++++++++++++++++++------------
 1 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/hydra.el b/hydra.el
index 0272348..d912c7d 100644
--- a/hydra.el
+++ b/hydra.el
@@ -116,18 +116,20 @@ warn: keep KEYMAP and issue a warning instead of running 
the command."
 
 (defun hydra--clearfun ()
   "Disable the current Hydra unless `this-command' is a head."
-  (when (or
-         (memq this-command '(handle-switch-frame keyboard-quit))
-         (null overriding-terminal-local-map)
-         (not (or (eq this-command
-                      (lookup-key hydra-curr-map (this-single-command-keys)))
-                  (cl-case hydra-curr-foreign-keys
-                    (warn
-                     (setq this-command 'hydra-amaranth-warn))
-                    (run
-                     t)
-                    (t nil)))))
-    (hydra-disable)))
+  (unless (eq this-command 'hydra-pause-resume)
+    (when (or
+           (memq this-command '(handle-switch-frame
+                                keyboard-quit))
+           (null overriding-terminal-local-map)
+           (not (or (eq this-command
+                        (lookup-key hydra-curr-map (this-single-command-keys)))
+                    (cl-case hydra-curr-foreign-keys
+                      (warn
+                       (setq this-command 'hydra-amaranth-warn))
+                      (run
+                       t)
+                      (t nil)))))
+      (hydra-disable))))
 
 (defvar hydra--ignore nil
   "When non-nil, don't call `hydra-curr-on-exit'.")
@@ -409,6 +411,7 @@ Return DEFAULT if PROP is not in H."
   (hydra-disable)
   (cancel-timer hydra-timeout-timer)
   (cancel-timer hydra-message-timer)
+  (setq hydra-curr-map nil)
   (unless (and hydra--ignore
                (null hydra--work-around-dedicated))
     (if hydra-lv
@@ -1060,6 +1063,22 @@ DOC defaults to TOGGLE-NAME split and capitalized."
                    0
                  i)))))
 
+(defvar hydra-pause-ring (make-ring 10)
+  "Ring for paused hydras.")
+
+(defun hydra-pause-resume ()
+  "Quit the current hydra and save it to the stack.
+If there's no active hydra, pop one from the stack and call its body.
+If the stack is empty, call the last hydra's body."
+  (interactive)
+  (cond (hydra-curr-map
+         (ring-insert hydra-pause-ring hydra-curr-body-fn)
+         (hydra-keyboard-quit))
+        ((zerop (ring-length hydra-pause-ring))
+         (funcall hydra-curr-body-fn))
+        (t
+         (funcall (ring-remove hydra-pause-ring 0)))))
+
 ;; Local Variables:
 ;; outline-regexp: ";;\\([;*]+ [^\s\t\n]\\|###autoload\\)\\|("
 ;; indent-tabs-mode: nil



reply via email to

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