From 85a5d7b5ac1f558b5e94e00d1dbf4703a1afe9b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Feb 2017 04:24:38 -0500 Subject: [PATCH] @map: better no-evil support; better prefixes; :prefix now evaluated --- core/core-lib.el | 68 +++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index d0caced67..08c8cc8a6 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -152,7 +152,6 @@ Examples: ;; Register keywords for proper indentation (see `@map') (put ':prefix 'lisp-indent-function 'defun) (put ':map 'lisp-indent-function 'defun) -(put ':map* 'lisp-indent-function 'defun) (put ':after 'lisp-indent-function 'defun) (put ':when 'lisp-indent-function 'defun) (put ':unless 'lisp-indent-function 'defun) @@ -229,13 +228,23 @@ Example ;; it's a flag ((keywordp key) - (when (cond ((eq key :leader) - (push (or +evil-leader ",") rest)) - ((eq key :localleader) - (push (or +evil-localleader "\\") rest))) - (setq key :prefix)) + (when (memq key '(:leader :localleader)) + (if (not (featurep '+evil)) + (setq rest nil + key :ignore) + (cond ((eq key :leader) + (push '+evil-leader rest)) + ((eq key :localleader) + (push '+evil-localleader rest))) + (setq key :prefix))) (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)))) (:unset `((@map ,(kbd (pop rest))))) (:after (prog1 `((@after ,(pop rest) (@map ,@rest))) (setq rest '()))) @@ -266,31 +275,32 @@ Example (when (stringp key) (setq key (kbd key))) (when prefix - (setq key (if (vectorp key) (vconcat prefix key) (concat prefix key)))) + (setq key (append prefix (list key)))) (unless (> (length rest) 0) (user-error "Map has no definition for %s" key)) (setq def (pop rest)) - (push - (cond ((and keymaps states) - (throw 'skip 'evil) - (macroexp-progn - (mapcar (lambda (keymap) `(evil-define-key* ',states ,keymap ,key ,def)) - keymaps))) - (keymaps - (macroexp-progn - (mapcar (lambda (keymap) `(define-key ,keymap ,key ,def)) - keymaps))) - (states - (throw 'skip 'evil) - (macroexp-progn - (mapcar (lambda (state) - `(define-key - (evil-state-property ',state ,(if local :local-keymap :keymap) t) - ,key ,def)) - states))) - (t `(,(if local 'local-set-key 'global-set-key) - ,key ,def))) - forms)) + (push (cond ((and keymaps states) + (unless (featurep 'evil) + (throw 'skip 'evil)) + (macroexp-progn + (mapcar (lambda (keymap) `(evil-define-key* ',states ,keymap ,key ,def)) + keymaps))) + (keymaps + (macroexp-progn + (mapcar (lambda (keymap) `(define-key ,keymap ,key ,def)) + keymaps))) + (states + (unless (featurep 'evil) + (throw 'skip 'evil)) + (macroexp-progn + (mapcar (lambda (state) + `(define-key + ,(intern (format "evil-%s-state-%smap" state (if local "local-" ""))) + ,key ,def)) + states))) + (t `(,(if local 'local-set-key 'global-set-key) + ,key ,def))) + forms)) (setq states '() local nil)))