Refactor map! (and update for new evil-define-key)

This commit is contained in:
Henrik Lissner 2016-05-20 01:47:11 -04:00
parent 83e13e4df6
commit c24b96e1ac

View file

@ -185,55 +185,55 @@ Examples:
(while rest (while rest
(setq key (pop rest)) (setq key (pop rest))
(push (push
(cond ((listp key) ; it's a sub exp (reverse
`(,(macroexpand `(map! ,@key)))) (cond ((listp key) ; it's a sub exp
`(,(macroexpand `(map! ,@key))))
((keywordp key) ((keywordp key)
(when (memq key '(:leader :localleader)) (when (memq key '(:leader :localleader))
(push (pcase key (push (cond ((eq key :leader)
(:leader narf-leader-prefix) narf-leader-prefix)
(:localleader narf-localleader-prefix)) ((eq key :localleader)
rest) narf-localleader-prefix))
(setq key :prefix)) rest)
(pcase key (setq key :prefix))
;; TODO: Data checks (pcase key
(:prefix (setq prefix (concat prefix (kbd (pop rest)))) nil) (:prefix (setq prefix (concat prefix (kbd (pop rest)))) nil)
(:map (setq keymaps (-list (pop rest))) nil) (:map (setq keymaps (-list (pop rest))) nil)
(:unset `(,(macroexpand `(map! ,(kbd (pop rest)) nil)))) (:unset `(,(macroexpand `(map! ,(kbd (pop rest)) nil))))
(: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 '())))
(otherwise ; might be a state prefix (otherwise ; might be a state prefix
(mapc (lambda (letter) (mapc (lambda (letter)
(if (assoc letter state-map) (if (assoc letter state-map)
(add-to-list 'states (cdr (assoc letter state-map))) (push (cdr (assoc letter state-map)) states)
(user-error "Invalid mode prefix %s in key %s" letter key))) (user-error "Invalid mode prefix %s in key %s" letter key)))
(split-string (substring (symbol-name key) 1) "" t)) (split-string (substring (symbol-name key) 1) "" t))
(unless states (unless states
(user-error "Unrecognized keyword %s" key)) nil))) (user-error "Unrecognized keyword %s" key)) nil)))
;; It's a key-def pair ;; It's a key-def pair
((or (stringp key) ((or (stringp key)
(characterp key) (characterp key)
(vectorp key)) (vectorp key))
(when (stringp key) (when (stringp key)
(setq key (kbd key))) (setq key (kbd key)))
(when prefix (when prefix
(setq key (cond ((vectorp key) (vconcat prefix key)) (setq key (cond ((vectorp key) (vconcat prefix key))
(t (concat prefix key))))) (t (concat prefix key)))))
(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) (let (out-forms)
(dolist (keymap keymaps) (mapc (lambda (keymap)
(if (not states) (if states
(add-to-list 'out-forms `(evil-define-key nil ,keymap ,key ,def) t) (push `(evil-define-key ',states ,keymap ,key ,def) out-forms)
(dolist (state states) (push `(define-key ,keymap ,key ,def) out-forms)))
(add-to-list 'out-forms `(evil-define-key ',state ,keymap ,key ,def) t)))) keymaps)
(setq states '()) (setq states '())
out-forms)) out-forms))
(t (user-error "Invalid key %s" key))))
(t (user-error "Invalid key %s" key)))
forms) forms)
(setq i (1+ i))) (setq i (1+ i)))
`(progn ,@(apply #'nconc (delete nil (delete (list nil) (reverse forms)))))))) `(progn ,@(apply #'nconc (delete nil (delete (list nil) (reverse forms))))))))