branch: master commit e8bbb70545b6d5316d1797ebb5e76c5a30dff266 Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Add :pre and :post clauses to Hydra body * hydra.el (defhydra): the PLIST part of BODY argument now recognizes :pre and :post keys. These should be single Elisp statements, wrappable in a lambda. When you need more than one statement, use a `progn'. :pre will be called by `hydra-foo/body', as well as by all heads. :post will be called by the blue heads, as well as on Hydra termination by a command that isn't a head. Fixes #16. An Example: (global-set-key (kbd "C-z") (defhydra hydra-vi (:pre (set-cursor-color "#40e0d0") :post (set-cursor-color "#ffffff")) "vi" ("l" forward-char) ("h" backward-char) ("j" next-line) ("k" previous-line) ("q" nil "quit"))) --- hydra.el | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) diff --git a/hydra.el b/hydra.el index 043b2a3..23b563d 100644 --- a/hydra.el +++ b/hydra.el @@ -5,7 +5,7 @@ ;; Author: Oleh Krehel <ohwoeo...@gmail.com> ;; Maintainer: Oleh Krehel <ohwoeo...@gmail.com> ;; URL: https://github.com/abo-abo/hydra -;; Version: 0.6.1 +;; Version: 0.7.0 ;; Keywords: bindings ;; Package-Requires: ((cl-lib "0.5")) @@ -116,7 +116,7 @@ (define-key map [kp-9] 'hydra--digit-argument) (define-key map [kp-subtract] 'hydra--negative-argument) map) - "Keymap that all Hydras inherit. See `universal-argument-map'.") + "Keymap that all Hydras inherit. See `universal-argument-map'.") (defvar hydra-curr-map (make-sparse-keymap) @@ -130,7 +130,7 @@ (if (eq arg '-) (list -4) '(4)))) - (hydra-set-transient-map hydra-curr-map)) + (hydra-set-transient-map hydra-curr-map t)) (defun hydra--digit-argument (arg) "Forward to (`digit-argument' ARG)." @@ -298,21 +298,28 @@ in turn can be either red or blue." 'red (or (plist-get (cddr body) :color) 'red))) + (body-pre (plist-get (cddr body) :pre)) + (body-post (plist-get (cddr body) :post)) (method (if (hydra--callablep body) body (car body))) (hint (hydra--hint docstring heads body-color)) (doc (hydra--doc body-key body-name heads))) + (when (and (or body-pre body-post) + (version< emacs-version "24.4")) + (error "At least Emacs 24.4 is needed for :pre and :post")) `(progn ,@(cl-mapcar (lambda (head name) `(defun ,name () ,(format "%s\n\nCall the head: `%S'." doc (cadr head)) (interactive) + ,@(if body-pre (list body-pre)) ,@(if (eq (hydra--color head body-color) 'blue) `((hydra-disable) ,@(unless (null (cadr head)) - `((call-interactively #',(cadr head))))) + `((call-interactively #',(cadr head)))) + ,@(if body-post (list body-post))) `((catch 'hydra-disable (hydra-disable) (condition-case err @@ -325,7 +332,10 @@ in turn can be either red or blue." (when hydra-is-helpful (message ,hint)) (setq hydra-last - (hydra-set-transient-map (setq hydra-curr-map ',keymap) t))))))) + (hydra-set-transient-map + (setq hydra-curr-map ',keymap) + t + ,@(if body-post `((lambda () ,body-post)))))))))) heads names) ,@(unless (or (null body-key) (null method) @@ -347,10 +357,14 @@ in turn can be either red or blue." (defun ,body-name () ,doc (interactive) + ,@(if body-pre (list body-pre)) (when hydra-is-helpful (message ,hint)) (setq hydra-last - (hydra-set-transient-map ',keymap t)))))) + (hydra-set-transient-map + ',keymap + t + ,@(if body-post `((lambda () ,body-post))))))))) (provide 'hydra)