From 3c0e22d25301d4e49596805a325a8f1b8884f4b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jan 2017 19:49:45 -0500 Subject: [PATCH] Remove map! usage from core files (to be moved to evil module) --- core/core-lib.el | 151 -------------------------------------------- core/core-popups.el | 14 ++-- 2 files changed, 8 insertions(+), 157 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index b398f4213..b3634c3ea 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -88,156 +88,5 @@ Examples: (t (user-error "associate! invalid rules for mode [%s] (in %s) (match %s) (files %s)" mode in match files))))) -;; 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) -(put ':leader 'lisp-indent-function 'defun) -(put ':localleader 'lisp-indent-function 'defun) - -(defmacro map! (&rest rest) - "A nightmare of a key-binding macro that will use `evil-define-key', -`evil-define-key*', `define-key' and `global-set-key' depending on context and -plist key flags. It was designed to make binding multiple keys more concise, -like in vim. - -Yes, it tries to do too much. Yes, I only did it to make the \"frontend\" config -that little bit more concise. Yes, I could simply have used the above functions. -But it takes a little insanity to custom write your own emacs.d, so what else -were you expecting? - -States - :n normal - :v visual - :i insert - :e emacs - :o operator - :m motion - :r replace - :L local - - These can be combined (order doesn't matter), e.g. :nvi will apply to - normal, visual and insert mode. The state resets after the following - key=>def pair. - - Capitalize the state flag to make it a local binding. - - If omitted, the keybind will be defined globally. - -Flags - :unset [KEY] ; unset key - (:map [KEYMAP] [...]) ; apply inner keybinds to KEYMAP - (:map* [KEYMAP] [...]) ; apply inner keybinds to KEYMAP (deferred) - (:prefix [PREFIX] [...]) ; assign prefix to all inner keybindings - (:after [FEATURE] [...]) ; apply keybinds when [FEATURE] loads - -Conditional keybinds - (:when [CONDITION] [...]) - (:unless [CONDITION] [...]) - -Example - (map! :map magit-mode-map - :m \"C-r\" 'do-something ; assign C-r in motion state - :nv \"q\" 'magit-mode-quit-window ; assign to 'q' in normal and visual states - \"C-x C-r\" 'a-global-keybind - - (:when IS-MAC - :n \"M-s\" 'some-fn - :i \"M-o\" (lambda (interactive) (message \"Hi\"))))" - (let ((keymaps (if (boundp 'keymaps) keymaps)) - (defer (if (boundp 'defer) defer)) - (prefix (if (boundp 'prefix) prefix)) - (state-map '(("n" . normal) - ("v" . visual) - ("i" . insert) - ("e" . emacs) - ("o" . operator) - ("m" . motion) - ("r" . replace))) - local key def states forms) - (while rest - (setq key (pop rest)) - (cond - ;; it's a sub expr - ((listp key) - (push (macroexpand `(map! ,@key)) forms)) - - ;; it's a flag - ((keywordp key) - (when (cond ((eq key :leader) - (push doom-evil-leader rest)) - ((eq key :localleader) - (push doom-evil-localleader rest))) - (setq key :prefix)) - (pcase key - (:prefix (setq prefix (concat prefix (kbd (pop rest))))) - (:map (setq keymaps (-list (pop rest)))) - (:map* (setq defer t keymaps (-list (pop rest)))) - (:unset `(,(macroexpand `(map! ,(kbd (pop rest)))))) - (:after (prog1 `((after! ,(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 '()))) - (otherwise ; might be a state prefix - (mapc (lambda (letter) - (cond ((assoc letter state-map) - (push (cdr (assoc letter state-map)) states)) - ((string= letter "L") - (setq local t)) - (t (user-error "Invalid mode prefix %s in key %s" letter key)))) - (split-string (substring (symbol-name key) 1) "" t)) - (unless states - (user-error "Unrecognized keyword %s" key)) - (when (assoc "L" states) - (cond ((= (length states) 1) - (user-error "local keybinding for %s must accompany another state" key)) - ((> (length keymaps) 0) - (user-error "local keybinding for %s cannot accompany a keymap" key))))))) - - ;; It's a key-def pair - ((or (stringp key) - (characterp key) - (vectorp key)) - (when (stringp key) - (setq key (kbd key))) - (when prefix - (setq key (cond ((vectorp key) (vconcat prefix key)) - (t (concat prefix key))))) - (unless (> (length rest) 0) - (user-error "Map has no definition for %s" key)) - (setq def (pop rest)) - (push - (cond ((and keymaps states) - (macroexp-progn - (mapcar (lambda (keymap) - `(,(if defer 'evil-define-key 'evil-define-key*) - ',states ,keymap ,key ,def)) - keymaps))) - (keymaps - (macroexp-progn - (mapcar (lambda (keymap) - `(define-key ,keymap ,key ,def)) - keymaps))) - (states - (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) - (setq states '() - local nil)) - - (t (user-error "Invalid key %s" key)))) - (macroexp-progn (reverse forms)))) - -(when noninteractive - (defmacro map! (&rest rest))) - (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-popups.el b/core/core-popups.el index f7c667d1a..fdb442c2e 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -330,12 +330,14 @@ monkey patch it to use pop-to-buffer, and to remember the previous window." org-agenda-buffer nil)))) (after! org-agenda - (map! :map org-agenda-mode-map - :e "" 'doom/popup-org-agenda-quit - :e "ESC" 'doom/popup-org-agenda-quit - :e [escape] 'doom/popup-org-agenda-quit - "q" 'doom/popup-org-agenda-quit - "Q" 'doom/popup-org-agenda-quit))) + (after! evil + (evil-define-key* 'motion org-agenda-mode-map + [escape] 'doom/popup-org-agenda-quit + (kbd "ESC") 'doom/popup-org-agenda-quit)) + + (let ((map org-agenda-mode-map)) + (define-key map "q" 'doom/popup-org-agenda-quit) + (define-key map "Q" 'doom/popup-org-agenda-quit)))) (after! repl-toggle (add-hook! doom-popup-close