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 ;; Maintainer: Oleh Krehel ;; 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)