@map: better no-evil support; better prefixes; :prefix now evaluated

This commit is contained in:
Henrik Lissner 2017-02-09 04:24:38 -05:00
parent 774f55e867
commit 85a5d7b5ac

View file

@ -152,7 +152,6 @@ Examples:
;; Register keywords for proper indentation (see `@map') ;; Register keywords for proper indentation (see `@map')
(put ':prefix 'lisp-indent-function 'defun) (put ':prefix 'lisp-indent-function 'defun)
(put ':map 'lisp-indent-function 'defun) (put ':map 'lisp-indent-function 'defun)
(put ':map* 'lisp-indent-function 'defun)
(put ':after 'lisp-indent-function 'defun) (put ':after 'lisp-indent-function 'defun)
(put ':when 'lisp-indent-function 'defun) (put ':when 'lisp-indent-function 'defun)
(put ':unless 'lisp-indent-function 'defun) (put ':unless 'lisp-indent-function 'defun)
@ -229,13 +228,23 @@ Example
;; it's a flag ;; it's a flag
((keywordp key) ((keywordp key)
(when (cond ((eq key :leader) (when (memq key '(:leader :localleader))
(push (or +evil-leader ",") rest)) (if (not (featurep '+evil))
((eq key :localleader) (setq rest nil
(push (or +evil-localleader "\\") rest))) key :ignore)
(setq key :prefix)) (cond ((eq key :leader)
(push '+evil-leader rest))
((eq key :localleader)
(push '+evil-localleader rest)))
(setq key :prefix)))
(pcase key (pcase key
(:prefix (setq prefix (concat prefix (kbd (pop rest))))) (:ignore)
(:prefix
(let ((def (pop rest)))
(setq prefix
(if (or (symbolp def) (listp def))
`(vconcat ,prefix (if (stringp ,def) (kbd ,def) ,def))
`(vconcat ,prefix ,(if (stringp def) (kbd def) def))))))
(:map (setq keymaps (-list (pop rest)))) (:map (setq keymaps (-list (pop rest))))
(:unset `((@map ,(kbd (pop rest))))) (:unset `((@map ,(kbd (pop rest)))))
(:after (prog1 `((@after ,(pop rest) (@map ,@rest))) (setq rest '()))) (:after (prog1 `((@after ,(pop rest) (@map ,@rest))) (setq rest '())))
@ -266,31 +275,32 @@ Example
(when (stringp key) (when (stringp key)
(setq key (kbd key))) (setq key (kbd key)))
(when prefix (when prefix
(setq key (if (vectorp key) (vconcat prefix key) (concat prefix key)))) (setq key (append prefix (list 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))
(push (push (cond ((and keymaps states)
(cond ((and keymaps states) (unless (featurep 'evil)
(throw 'skip 'evil) (throw 'skip 'evil))
(macroexp-progn (macroexp-progn
(mapcar (lambda (keymap) `(evil-define-key* ',states ,keymap ,key ,def)) (mapcar (lambda (keymap) `(evil-define-key* ',states ,keymap ,key ,def))
keymaps))) keymaps)))
(keymaps (keymaps
(macroexp-progn (macroexp-progn
(mapcar (lambda (keymap) `(define-key ,keymap ,key ,def)) (mapcar (lambda (keymap) `(define-key ,keymap ,key ,def))
keymaps))) keymaps)))
(states (states
(throw 'skip 'evil) (unless (featurep 'evil)
(macroexp-progn (throw 'skip 'evil))
(mapcar (lambda (state) (macroexp-progn
`(define-key (mapcar (lambda (state)
(evil-state-property ',state ,(if local :local-keymap :keymap) t) `(define-key
,key ,def)) ,(intern (format "evil-%s-state-%smap" state (if local "local-" "")))
states))) ,key ,def))
(t `(,(if local 'local-set-key 'global-set-key) states)))
,key ,def))) (t `(,(if local 'local-set-key 'global-set-key)
forms)) ,key ,def)))
forms))
(setq states '() (setq states '()
local nil))) local nil)))