core-lib: refactor map! (and disable it when noninteractive)

This commit is contained in:
Henrik Lissner 2017-01-28 02:05:05 -05:00
parent fb53c8fda7
commit 02fef2fded

View file

@ -160,12 +160,10 @@ Example
local key def states forms) local key def states forms)
(while rest (while rest
(setq key (pop rest)) (setq key (pop rest))
(push
(reverse
(cond (cond
;; it's a sub expr ;; it's a sub expr
((listp key) ((listp key)
`(,(macroexpand `(map! ,@key)))) (push (macroexpand `(map! ,@key)) forms))
;; it's a flag ;; it's a flag
((keywordp key) ((keywordp key)
@ -175,10 +173,10 @@ Example
(push doom-evil-localleader rest))) (push doom-evil-localleader rest)))
(setq key :prefix)) (setq key :prefix))
(pcase key (pcase key
(:prefix (setq prefix (concat prefix (kbd (pop rest)))) nil) (:prefix (setq prefix (concat prefix (kbd (pop rest)))))
(:map (setq keymaps (-list (pop rest))) nil) (:map (setq keymaps (-list (pop rest))))
(:map* (setq defer t keymaps (-list (pop rest))) nil) (:map* (setq defer t keymaps (-list (pop rest))))
(:unset `(,(macroexpand `(map! ,(kbd (pop rest)) nil)))) (:unset `(,(macroexpand `(map! ,(kbd (pop rest))))))
(:after (prog1 `((after! ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '()))) (:after (prog1 `((after! ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
(:when (prog1 `((if ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '()))) (:when (prog1 `((if ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
(:unless (prog1 `((if (not ,(pop rest)) ,(macroexpand `(map! ,@rest)))) (setq rest '()))) (:unless (prog1 `((if (not ,(pop rest)) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
@ -196,8 +194,7 @@ Example
(cond ((= (length states) 1) (cond ((= (length states) 1)
(user-error "local keybinding for %s must accompany another state" key)) (user-error "local keybinding for %s must accompany another state" key))
((> (length keymaps) 0) ((> (length keymaps) 0)
(user-error "local keybinding for %s cannot accompany a keymap" key)))) (user-error "local keybinding for %s cannot accompany a keymap" key)))))))
nil)))
;; It's a key-def pair ;; It's a key-def pair
((or (stringp key) ((or (stringp key)
@ -211,33 +208,36 @@ Example
(unless (> (length rest) 0) (unless (> (length rest) 0)
(user-error "Map has no definition for %s" key)) (user-error "Map has no definition for %s" key))
(setq def (pop rest)) (setq def (pop rest))
(let (out-forms) (push
(cond ((and keymaps states) (cond ((and keymaps states)
(mapc (lambda (keymap) (macroexp-progn
(push `(,(if defer 'evil-define-key 'evil-define-key*) (mapcar (lambda (keymap)
',states ,keymap ,key ,def) `(,(if defer 'evil-define-key 'evil-define-key*)
out-forms)) ',states ,keymap ,key ,def))
keymaps)) keymaps)))
(keymaps (keymaps
(mapc (lambda (keymap) (push `(define-key ,keymap ,key ,def) out-forms)) (macroexp-progn
keymaps)) (mapcar (lambda (keymap)
`(define-key ,keymap ,key ,def))
keymaps)))
(states (states
(mapc (lambda (state) (macroexp-progn
(push `(define-key (mapcar (lambda (state)
`(define-key
(evil-state-property ',state ,(if local :local-keymap :keymap) t) (evil-state-property ',state ,(if local :local-keymap :keymap) t)
,key ,def) ,key ,def))
out-forms)) states)))
states)) (t `(,(if local 'local-set-key 'global-set-key)
(t (push `(,(if local 'local-set-key 'global-set-key) ,key ,def)))
,key ,def) forms)
out-forms)))
(setq states '() (setq states '()
local nil) local nil))
out-forms))
(t (user-error "Invalid key %s" key)))) (t (user-error "Invalid key %s" key))))
forms)) (macroexp-progn (reverse forms))))
`(progn ,@(apply #'nconc (delete nil (delete (list nil) (reverse forms)))))))
(when noninteractive
(defmacro map! (&rest rest)))
(provide 'core-lib) (provide 'core-lib)
;;; core-lib.el ends here ;;; core-lib.el ends here