Skip to content

Commit

Permalink
Add :pre and :post clauses to Hydra body
Browse files Browse the repository at this point in the history
* 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")))
  • Loading branch information
abo-abo committed Feb 4, 2015
1 parent e21d1d8 commit e8bbb70
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions hydra.el
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
;; Author: Oleh Krehel <[email protected]>
;; Maintainer: Oleh Krehel <[email protected]>
;; URL: https://github.com/abo-abo/hydra
;; Version: 0.6.1
;; Version: 0.7.0
;; Keywords: bindings
;; Package-Requires: ((cl-lib "0.5"))

Expand Down Expand Up @@ -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)
Expand All @@ -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)."
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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)

Expand Down

0 comments on commit e8bbb70

Please sign in to comment.