branch: master commit 64e5b9129fcc61b18ca194af6e512cbe91122155 Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Avoid evaling METHOD. * hydra.el (hydra-create): Update. METHOD doesn't need to be evaled: it's either nil, a lambda, or assume that it's a valid keymap without evaling. This will prevent eager macroexpansion failure for this argument. There still is a problem with eager macroexpansion failure in HEADS argument. Re #9 --- hydra.el | 38 ++++++++++++++++++++++---------------- 1 files changed, 22 insertions(+), 16 deletions(-) diff --git a/hydra.el b/hydra.el index 932cea2..4ef966c 100644 --- a/hydra.el +++ b/hydra.el @@ -112,20 +112,7 @@ When `(keymapp METHOD)`, it becomes: (mapconcat (lambda (x) (format "\"%s\": `%S'" (car x) (cadr x))) - heads ",\n"))) - map - (method - (cond ((null method) - (unless (keymapp (global-key-binding (kbd body))) - (global-set-key (kbd body) nil)) - 'global-set-key) - ((keymapp (setq map (eval method))) - (unless (keymapp (lookup-key map (kbd body))) - (define-key map (kbd body) nil)) - `(lambda (key command) - (define-key ,method key command))) - (t - method)))) + heads ",\n")))) `(progn ,@(cl-mapcar (lambda (head name) @@ -137,7 +124,8 @@ When `(keymapp METHOD)`, it becomes: `((call-interactively #',(cadr head)) (when hydra-is-helpful (message ,hint)) - (setq hydra-last (hydra-set-transient-map ',keymap t)))))) + (setq hydra-last + (hydra-set-transient-map ',keymap t)))))) heads names) (defun ,(intern (format "hydra-%s-body" body)) () ,doc @@ -145,9 +133,27 @@ When `(keymapp METHOD)`, it becomes: (when hydra-is-helpful (message ,hint)) (setq hydra-last (hydra-set-transient-map ',keymap t))) + ,@(cond ((null method) + `((unless (keymapp (global-key-binding (kbd ,body))) + (global-set-key (kbd ,body) nil)))) + ((or (functionp method) + (and (consp method) + (memq (car method) '(function quote)))) + nil) + (t + `((unless (keymapp (lookup-key ,method (kbd ,body))) + (define-key ,method (kbd ,body) nil))))) ,@(cl-mapcar (lambda (head name) - `(,method ,(vconcat (kbd body) (kbd (car head))) #',name)) + `(,@(cond ((null method) + (list 'global-set-key)) + ((or (functionp method) + (and (consp method) + (memq (car method) '(function quote)))) + (list 'funcall method)) + (t + (list 'define-key method))) + ,(vconcat (kbd body) (kbd (car head))) #',name)) heads names)))) (provide 'hydra)