Minimize dependence on map!

This is in preparation for general.el integration coming in 2.1.1. It is
very likely that map! will change (and even more, be split into several
macros). Not much, but change none-the-less. Specifically, the state
keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state
property that takes a list, e.g. (normal visual insert).

In any case, both map! and general are also relatively expensive
compared to define-key and evil-define-key* (and the new define-key!
macro), so use that when we can.

This also means changes to either API won't affect Doom's modules in the
long term.
This commit is contained in:
Henrik Lissner 2018-06-03 15:46:00 +02:00
parent 83590d65ba
commit 1e81a35461
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
20 changed files with 276 additions and 239 deletions

View file

@ -153,17 +153,26 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
(defvar doom--defer nil)
(defvar doom--local nil)
(defmacro define-key! (keymap key def &rest rest)
(defmacro define-key! (keymaps key def &rest rest)
"TODO"
(declare (indent defun))
`(progn
(define-key ,keymap ,key ,def)
(if (and (listp keymaps)
(not (eq (car-safe keymaps) 'quote)))
`(dolist (map (list ,@keymaps))
,(macroexpand `(define-key! map ,key ,def ,@rest)))
(when (eq (car-safe keymaps) 'quote)
(pcase (cadr keymaps)
(`global (setq keymaps '(current-global-map)))
(`local (setq keymaps '(current-local-map)))
(x (error "%s is not a valid keymap" x))))
`(let ((map ,keymaps))
(define-key map ,key ,def)
,@(let (forms)
(while rest
(let ((key (pop rest))
(def (pop rest)))
(push `(define-key ,keymap ,key ,def) forms)))
(nreverse forms))))
(push `(define-key map ,key ,def) forms)))
(nreverse forms)))))
(defmacro map! (&rest rest)
"A nightmare of a key-binding macro that will use `evil-define-key*',

View file

@ -27,7 +27,7 @@
cfw:fchar-top-left-corner ?┏
cfw:fchar-top-right-corner ?┓)
(map! :map cfw:calendar-mode-map "q" #'+calendar/quit)
(define-key cfw:calendar-mode-map "q" #'+calendar/quit)
(when (featurep 'solaire-mode)
(add-hook 'cfw:calendar-mode-hook #'solaire-mode))

View file

@ -103,7 +103,7 @@ playback.")
(advice-add 'circe--irc-conn-disconnected :after #'+irc*circe-disconnect-hook)
;; Let `+irc/quit' and `circe' handle buffer cleanup
(map! :map circe-mode-map [remap kill-buffer] #'bury-buffer)
(define-key circe-mode-map [remap kill-buffer] #'bury-buffer)
(defun +irc*circe-truncate-nicks ()
"Truncate long nicknames in chat output non-destructively."
@ -163,7 +163,7 @@ playback.")
(def-package! lui
:commands lui-mode
:config
(map! :map lui-mode-map "C-u" #'lui-kill-to-beginning-of-line)
(define-key lui-mode-map "\C-u" #'lui-kill-to-beginning-of-line)
(when (featurep! :feature spellcheck)
(setq lui-flyspell-p t
lui-fill-type nil))

View file

@ -39,23 +39,24 @@ paths.")
;; Enhance readability of a post
(add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap)
(map! (:map (elfeed-search-mode-map elfeed-show-mode-map)
(define-key! (elfeed-search-mode-map elfeed-show-mode-map)
[remap kill-this-buffer] #'+rss/quit
[remap kill-buffer] #'+rss/quit)
(:map elfeed-search-mode-map
:n "q" #'+rss/quit
:n "r" #'elfeed-update
:n "s" #'elfeed-search-live-filter
:n "RET" #'elfeed-search-show-entry
:n "M-RET" #'elfeed-search-browse-url)
(:map elfeed-show-mode-map
:n "q" #'elfeed-kill-buffer
:m "j" #'evil-next-visual-line
:m "k" #'evil-previous-visual-line
(define-key! elfeed-show-mode-map
[remap next-buffer] #'+rss/next
[remap previous-buffer] #'+rss/previous)))
[remap previous-buffer] #'+rss/previous)
(when (featurep 'evil)
(evil-define-key* 'normal elfeed-search-mode-map
"q" #'+rss/quit
"r" #'elfeed-update
"s" #'elfeed-search-live-filter
(kbd "RET") #'elfeed-search-show-entry
(kbd "M-RET") #'elfeed-search-browse-url)
(evil-define-key* 'normal elfeed-show-mode-map
"q" #'elfeed-kill-buffer)
(evil-define-key* 'motion elfeed-show-mode-map
"j" #'evil-next-visual-line
"k" #'evil-previous-visual-line)))
(def-package! elfeed-org

View file

@ -52,18 +52,19 @@
mode-line-format nil))
(add-hook 'twittering-mode-hook #'+twitter|switch-mode-and-header-line)
(map! :map twittering-mode-map
(define-key! twittering-mode-map
"q" #'+twitter/quit
"Q" #'+twitter/quit-all
[remap twittering-kill-buffer] #'+twitter/quit
[remap delete-window] #'+twitter/quit
[remap +workspace/close-window-or-workspace] #'+twitter/quit
(:when (featurep! :feature evil)
[remap +workspace/close-window-or-workspace] #'+twitter/quit)
(when (featurep! :feature evil +everywhere)
(define-key! twittering-mode-map
[remap evil-window-delete] #'+twitter/quit
"f" #'twittering-favorite
"F" #'twittering-unfavorite
"C-f" #'twittering-follow
"C-F" #'twittering-unfollow
"\C-f" #'twittering-follow
"\C-F" #'twittering-unfollow
"d" #'twittering-delete-status
"r" #'twittering-retweet
"R" #'twittering-toggle-or-retrieve-replied-statuses

View file

@ -14,14 +14,13 @@
:defer 1
:after-call pre-command-hook
:init
(map! :map global-map
(define-key! 'global
[remap apropos] #'helm-apropos
[remap bookmark-jump] #'helm-bookmarks
[remap execute-extended-command] #'helm-M-x
[remap find-file] #'helm-find-files
[remap imenu-anywhere] #'helm-imenu-anywhere
[remap imenu] #'helm-semantic-or-imenu
[remap swiper] #'helm-swoop
[remap noop-show-kill-ring] #'helm-show-kill-ring
[remap projectile-find-file] #'helm-projectile-find-file
[remap projectile-recentf] #'helm-projectile-recentf

View file

@ -50,7 +50,8 @@ immediately runs it on the current candidate (ending the ivy session)."
(after! magit (setq magit-completing-read-function #'ivy-completing-read))
(after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq))
(map! [remap switch-to-buffer] #'ivy-switch-buffer
(define-key! 'global
[remap switch-to-buffer] #'ivy-switch-buffer
[remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer
[remap imenu-anywhere] #'ivy-imenu-anywhere)
@ -69,7 +70,8 @@ immediately runs it on the current candidate (ending the ivy session)."
(def-package! counsel
:commands counsel-describe-face
:init
(map! [remap apropos] #'counsel-apropos
(define-key! 'global
[remap apropos] #'counsel-apropos
[remap bookmark-jump] #'counsel-bookmark
[remap describe-face] #'counsel-describe-face
[remap describe-function] #'counsel-describe-function
@ -82,6 +84,7 @@ immediately runs it on the current candidate (ending the ivy session)."
[remap recentf-open-files] #'counsel-recentf
[remap org-capture] #'counsel-org-capture
[remap swiper] #'counsel-grep-or-swiper)
:config
(set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit)))
@ -106,7 +109,8 @@ immediately runs it on the current candidate (ending the ivy session)."
:commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer
counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project)
:init
(map! [remap projectile-find-file] #'counsel-projectile-find-file
(define-key! 'global
[remap projectile-find-file] #'counsel-projectile-find-file
[remap projectile-find-dir] #'counsel-projectile-find-dir
[remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer
[remap projectile-grep] #'counsel-projectile-grep
@ -126,10 +130,10 @@ immediately runs it on the current candidate (ending the ivy session)."
(def-package! ivy-hydra
:commands (+ivy@coo/body ivy-dispatching-done-hydra)
:init
(map! :after ivy
:map ivy-minibuffer-map
"C-o" #'+ivy@coo/body
"M-o" #'ivy-dispatching-done-hydra)
(after! ivy
(define-key! ivy-minibuffer-map
"\C-o" #'+ivy@coo/body
(kbd "M-o") #'ivy-dispatching-done-hydra))
:config
(defhydra +ivy@coo (:hint nil :color pink)
"

View file

@ -42,7 +42,7 @@ buffers."
integration."
(interactive)
(let ((prefix (this-command-keys)))
(map! :m prefix nil)
(evil-define-key* 'motion 'global prefix nil)
(evilem-default-keybindings prefix)
(set-transient-map evilem-map)
(which-key-reload-key-sequence prefix)))

View file

@ -55,19 +55,22 @@
(defun +eshell|init-keymap ()
"Setup eshell keybindings. This must be done in a hook because eshell-mode
redefines its keys every time `eshell-mode' is enabled."
(map! :map eshell-mode-map
:n [return] #'+eshell/goto-end-of-prompt
:n "c" #'+eshell/evil-change
:n "C" #'+eshell/evil-change-line
:n "d" #'+eshell/evil-delete
:n "D" #'+eshell/evil-delete-line
:i "C-d" #'+eshell/quit-or-delete-char
:i "C-p" #'eshell-previous-input
:i "C-n" #'eshell-next-input
[remap doom/backward-to-bol-or-indent] #'eshell-bol
[remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input
(when (featurep 'evil)
(evil-define-key* 'normal eshell-mode-map
[return] #'+eshell/goto-end-of-prompt
"c" #'+eshell/evil-change
"C" #'+eshell/evil-change-line
"d" #'+eshell/evil-delete
"D" #'+eshell/evil-delete-line)
(evil-define-key* 'insert eshell-mode-map
"\C-d" #'+eshell/quit-or-delete-char
"\C-p" #'eshell-previous-input
"\C-n" #'eshell-next-input))
(define-key! eshell-mode-map
[remap split-window-below] #'+eshell/split-below
[remap split-window-right] #'+eshell/split-right
[remap doom/backward-to-bol-or-indent] #'eshell-bol
[remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input
[remap evil-window-split] #'+eshell/split-below
[remap evil-window-vsplit] #'+eshell/split-right))
(add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap))

View file

@ -63,6 +63,8 @@ variable for an explanation of the defaults (in comments). See
(add-hook 'doom-post-init-hook #'evil-mode)
(evil-select-search-module 'evil-search-module 'evil-search)
(put 'evil-define-key* 'lisp-indent-function 'defun)
(set! :popup "^\\*evil-registers" '((size . 0.3)))
(set! :popup "^\\*Command Line" '((size . 8)))
@ -77,12 +79,14 @@ variable for an explanation of the defaults (in comments). See
;; --- keybind fixes ----------------------
(map! (:after wgrep
(after! wgrep
;; A wrapper that invokes `wgrep-mark-deletion' across lines you use
;; `evil-delete' in wgrep buffers.
:map wgrep-mode-map [remap evil-delete] #'+evil-delete)
(define-key! wgrep-mode-map
[remap evil-delete] #'+evil-delete))
;; replace native folding commands
(define-key! 'global
[remap evil-toggle-fold] #'+evil:fold-toggle
[remap evil-close-fold] #'+evil:fold-close
[remap evil-open-fold] #'+evil:fold-open
@ -234,7 +238,7 @@ variable for an explanation of the defaults (in comments). See
evil-escape-key-sequence "jk"
evil-escape-delay 0.25)
(add-hook 'pre-command-hook #'evil-escape-pre-command-hook)
(map! :irvo "C-g" #'evil-escape)
(evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape)
:config
;; no `evil-escape' in minibuffer
(add-hook 'evil-escape-inhibit-functions #'minibufferp))
@ -259,8 +263,9 @@ variable for an explanation of the defaults (in comments). See
evilmi-outer-text-object evilmi-inner-text-object)
:config (global-evil-matchit-mode 1)
:init
(map! [remap evil-jump-item] #'evilmi-jump-items
:textobj "%" #'evilmi-inner-text-object #'evilmi-outer-text-object)
(define-key! 'global [remap evil-jump-item] #'evilmi-jump-items)
(define-key evil-inner-text-objects-map "%" #'evilmi-inner-text-object)
(define-key evil-outer-text-objects-map "%" #'evilmi-outer-text-object)
:config
;; Fixes #519 where d% wouldn't leave a dangling end-parenthesis
(evil-set-command-properties 'evilmi-jump-items :type 'inclusive :jump t)
@ -374,8 +379,9 @@ the new algorithm is confusing, like in python or ruby."
evil-visualstar/begin-search-forward
evil-visualstar/begin-search-backward)
:init
(map! :v "*" #'evil-visualstar/begin-search-forward
:v "#" #'evil-visualstar/begin-search-backward)
(evil-define-key* 'visual 'global
"*" #'evil-visualstar/begin-search-forward
"#" #'evil-visualstar/begin-search-backward)
:config
(global-evil-visualstar-mode 1))
@ -402,7 +408,7 @@ the new algorithm is confusing, like in python or ruby."
;; so that any plugins that depend on multiple-cursors (which I have no control
;; over) can still use it in relative safety.
(after! multiple-cursors-core
(map! :map mc/keymap :ne "<escape>" #'mc/keyboard-quit)
(evil-define-key* '(normal emacs) [escape] #'mc/keyboard-quit)
(defvar +evil--mc-compat-evil-prev-state nil)
(defvar +evil--mc-compat-mark-was-active nil)

View file

@ -110,7 +110,7 @@ compilation database is present in the project.")
;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently.
;; The result isn't very intelligent (causes redundant characters), so just do
;; it ourselves.
(map! :map c++-mode-map "<" nil ">" nil)
(define-key! c++-mode-map "<" nil ">" nil)
;; ...and leave it to smartparens
(sp-with-modes '(c++-mode objc-mode)
@ -228,7 +228,7 @@ compilation database is present in the project.")
(add-hook! kill-emacs (ignore-errors (rtags-cancel-process)))
;; Use rtags-imenu instead of imenu/counsel-imenu
(map! :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu)
(define-key! (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu)
(when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump))
(add-hook 'rtags-after-find-file-hook #'recenter)

View file

@ -41,15 +41,16 @@
(ess-toggle-underscore t)
(set! :repl 'ess-mode #'+ess/r-repl)
(set! :lookup 'ess-mode :documentation #'ess-display-help-on-object)
(map! (:map ess-doc-map
(define-key! ess-doc-map
"h" #'ess-display-help-on-object
"p" #'ess-R-dv-pprint
"t" #'ess-R-dv-ctable)
(:map ess-mode-map
"<s-return>" #'ess-eval-line
"<up>" #'comint-next-input
"<down>" #'comint-previous-input
(:localleader
(define-key! ess-doc-map
[s-return] #'ess-eval-line
[up] #'comint-next-input
[down] #'comint-previous-input)
(map! :map ess-mode-map
:localleader
:nv "," #'ess-eval-region-or-function-or-paragraph-and-step
:n "'" #'R
:n "<tab>" #'ess-switch-to-inferior-or-script-buffer
@ -76,9 +77,9 @@
:n "cd" #'ess-eval-chunk-and-step
:n "cm" #'ess-noweb-mark-chunk
:n "cp" #'ess-noweb-previous-chunk
:n "cn" #'ess-noweb-next-chunk))))
:n "cn" #'ess-noweb-next-chunk))
;; `ess-smart-equals-mode'
(add-hook! (ess-mode inferior-ess)
(add-hook! '(ess-mode-hook inferior-ess-hook)
#'ess-smart-equals-mode)

View file

@ -52,7 +52,7 @@
LaTeX-fill-break-at-separators nil
LaTeX-item-indent 0) ; item indentation.
(map! :map LaTeX-mode-map "C-j" nil)
(define-key LaTeX-mode-map "C-j" nil)
;; Do not prompt for Master files, this allows auto-insert to add templates
;; to .tex files
@ -120,8 +120,8 @@
:config
(map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode))
(map-put TeX-view-program-selection 'output-pdf '("preview-pane"))
(map! :map doc-view-mode-map
"ESC" #'delete-window
(define-key! doc-view-mode-map
(kbd "ESC") #'delete-window
"q" #'delete-window
"k" (λ! (quit-window) (delete-window))))
@ -170,7 +170,7 @@
bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)
bibtex-completion-pdf-open-function
(lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))
(map! :map bibtex-mode-map "C-c \\" #'bibtex-fill-entry))
(define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry))
(def-package! auctex-latexmk

View file

@ -18,32 +18,35 @@
(add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing)
(add-hook 'markdown-mode-hook #'auto-fill-mode)
(map! (:map markdown-mode-map
(define-key! markdown-mode-map
[remap find-file-at-point] #'markdown-follow-thing-at-point
"M-*" #'markdown-insert-list-item
"M-b" #'markdown-insert-bold
"M-i" #'markdown-insert-italic
"M-`" #'+markdown/insert-del
:m "gj" #'markdown-next-visible-heading
:m "gk" #'markdown-previous-visible-heading
;; Assumes you have a markdown renderer plugin in chrome
:n "M-r" #'browse-url-of-file
(kbd "M-*") #'markdown-insert-list-item
(kbd "M-b") #'markdown-insert-bold
(kbd "M-i") #'markdown-insert-italic
(kbd "M-`") #'+markdown/insert-del)
(when (featurep! :feature evil +everywhere)
(evil-define-key* 'motion markdown-mode-map
"gj" #'markdown-next-visible-heading
"gk" #'markdown-previous-visible-heading
;; TODO: Make context sensitive
:m "]h" #'markdown-next-visible-heading
:m "[h" #'markdown-previous-visible-heading
:m "[p" #'markdown-promote
:m "]p" #'markdown-demote
:m "[l" #'markdown-next-link
:m "]l" #'markdown-previous-link
:i "M--" #'markdown-insert-hr
(:localleader
"]h" #'markdown-next-visible-heading
"[h" #'markdown-previous-visible-heading
"[p" #'markdown-promote
"]p" #'markdown-demote
"[l" #'markdown-next-link
"]l" #'markdown-previous-link)
(evil-define-key* 'insert markdown-mode-map
(kbd "M--") #'markdown-insert-hr)
(evil-define-key* 'normal markdown-mode-map
(kbd "M-r") #'browse-url-of-file))
(map! :map markdown-mode-map
:localleader
:nv "o" #'markdown-open
:nv "b" #'markdown-preview
(:prefix "i"
:nv "t" #'markdown-toc-generate-toc
:nv "i" #'markdown-insert-image
:nv "l" #'markdown-insert-link)))))
:nv "l" #'markdown-insert-link)))
(def-package! markdown-toc

View file

@ -41,7 +41,7 @@ string). Stops at the first function to return non-nil.")
(advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library)
;; I prefer C-c C-c for confirming over the default C-c '
(map! :map org-src-mode-map "C-c C-c" #'org-edit-src-exit)
(define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit)
;; In a recent update, `org-babel-get-header' was removed from org-mode, which
;; is something a fair number of babel plugins use. So until those plugins

View file

@ -42,9 +42,8 @@
(add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq)
;; Ace-link on notebook list buffers
(map! :after ein-notebooklist
:map ein:notebooklist-mode-map
"o" #'+ein/ace-link-ein)
(after! ein-notebooklist
(define-key ein:notebooklist-mode-map "o" #'+ein/ace-link-ein))
;; add hydra
(defhydra +ein/hydra (:hint t :color red)

View file

@ -31,12 +31,12 @@
(set! :popup "^\\*Password-Store"
'((side . left) (size . 0.25))
'((quit)))
(map! :map pass-mode-map
(define-key! pass-mode-map
"j" #'pass-next-entry
"k" #'pass-prev-entry
"d" #'pass-kill
"C-j" #'pass-next-directory
"C-k" #'pass-next-directory))
"\C-j" #'pass-next-directory
"\C-k" #'pass-next-directory))
;; Is built into Emacs 26+

View file

@ -6,9 +6,9 @@
(unless noninteractive
(pdf-tools-install))
(map! :map pdf-view-mode-map
(define-key! pdf-view-mode-map
"q" #'kill-this-buffer
doom-leader-key nil)
(kbd doom-leader-key) nil)
(setq-default pdf-view-display-size 'fit-page)
;; Turn off cua so copy works

View file

@ -9,5 +9,5 @@
(advice-add #'prodigy-services :around #'+prodigy*services)
(map! :map prodigy-mode-map "d" #'+prodigy/delete))
(define-key prodigy-mode-map "d" #'+prodigy/delete))

View file

@ -66,25 +66,36 @@ Possible values:
(cl-loop for (car . _cdr) in fringe-indicator-alist
collect (cons car nil) into alist
finally do (setq fringe-indicator-alist alist))
(add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t))
(add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)
;;
(setq-local which-key-idle-delay 0.01)
(setq-local which-key-min-display-lines 9))
(map! :map +doom-dashboard-mode-map
(define-key! +doom-dashboard-mode-map
"n" #'forward-button
:gn [down] #'forward-button
:gn "C-n" #'forward-button
:gn [tab] #'forward-button
:gn "TAB" #'forward-button
"p" #'backward-button
:gn [up] #'backward-button
:gn "C-p" #'backward-button
:gn [backtab] #'backward-button
:gn "S-TAB" #'backward-button
(:when (featurep! :feature evil)
:m "j" #'forward-button
:m "k" #'backward-button
"\C-n" #'forward-button
"\C-p" #'backward-button
[down] #'forward-button
[up] #'backward-button
[tab] #'forward-button
[backtab] #'backward-button)
(when (featurep 'evil)
(evil-define-key* 'normal +doom-dashboard-mode-map
"j" #'forward-button
"k" #'backward-button
"n" #'forward-button
"p" #'backward-button
"\C-n" #'forward-button
"\C-p" #'backward-button
[down] #'forward-button
[up] #'backward-button
[tab] #'forward-button
[backtab] #'backward-button)
(define-key! +doom-dashboard-mode-map
[remap evil-next-visual-line] #'forward-button
[remap evil-previous-visual-line] #'backward-button
[remap evil-delete] #'ignore
[remap evil-delete-line] #'ignore
[remap evil-insert] #'ignore