Use general custom definers rather than :definer
The former approach was the cause for a huge increase in startup time (adding ~0.4s) when :leader and :localleader were used. This is because general-define-key was called for every key-def pair. This new approach batches these calls, which has decreased the performance impact by at least 80%.
This commit is contained in:
parent
d222327d24
commit
604a41527f
1 changed files with 22 additions and 28 deletions
|
@ -59,31 +59,24 @@ If any hook returns non-nil, all hooks after it are ignored.")
|
|||
(general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader)
|
||||
(general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader)
|
||||
|
||||
(defun general-leader-define-key (_state _keymap key def orig-def _kargs)
|
||||
(let (general-implicit-kbd)
|
||||
(general-define-key
|
||||
:keymaps 'doom-leader-map
|
||||
(general-create-definer define-leader-key!
|
||||
:wk-full-keys nil
|
||||
key orig-def)))
|
||||
:keymaps 'doom-leader-map)
|
||||
|
||||
;; <localleader>
|
||||
(defun general-localleader-define-key (state keymap key _def orig-def kargs)
|
||||
(unless keymap
|
||||
(signal 'wrong-type-argument (list 'keymapp keymap)))
|
||||
(let (general-implicit-kbd)
|
||||
(apply #'general-define-key
|
||||
(general-create-definer define-localleader-key!
|
||||
:major-modes t
|
||||
:keymaps keymap
|
||||
(append
|
||||
;; :non-normal-prefix isn't respected when evil is absent, so this
|
||||
;; is necessary:
|
||||
(if (featurep 'evil)
|
||||
(list :states '(normal visual motion)
|
||||
:keymaps 'local
|
||||
:prefix doom-localleader-alt-key)
|
||||
|
||||
;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's
|
||||
;; emacs state), we must redefine `define-localleader-key!' once evil is loaded
|
||||
(after! evil
|
||||
(general-create-definer define-localleader-key!
|
||||
:major-modes t
|
||||
:keymaps 'local
|
||||
:prefix doom-localleader-key
|
||||
:non-normal-prefix doom-localleader-alt-key)
|
||||
(list :prefix doom-localleader-alt-key))
|
||||
(list key orig-def)
|
||||
nil))))
|
||||
:non-normal-prefix doom-localleader-alt-key))
|
||||
|
||||
|
||||
;;
|
||||
|
@ -149,6 +142,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
|||
|
||||
;; specials
|
||||
(defvar doom--map-forms nil)
|
||||
(defvar doom--map-fn 'general-define-key)
|
||||
(defvar doom--map-batch-forms nil)
|
||||
(defvar doom--map-state '(:dummy t))
|
||||
(defvar doom--map-parent-state nil)
|
||||
|
@ -156,7 +150,8 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
|||
(after! evil (setq doom--map-evil-p t))
|
||||
|
||||
(defun doom--map-process (rest)
|
||||
(let (doom--map-state
|
||||
(let ((doom--map-fn doom--map-fn)
|
||||
doom--map-state
|
||||
doom--map-forms
|
||||
desc)
|
||||
(while rest
|
||||
|
@ -167,9 +162,9 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
|||
((keywordp key)
|
||||
(pcase key
|
||||
(:leader
|
||||
(doom--map-set :definer '(quote leader)))
|
||||
(setq doom--map-fn 'define-leader-key!))
|
||||
(:localleader
|
||||
(doom--map-set :definer '(quote localleader)))
|
||||
(setq doom--map-fn 'define-localleader-key!))
|
||||
(:after
|
||||
(doom--map-nested (list 'after! (pop rest)) rest)
|
||||
(setq rest nil))
|
||||
|
@ -257,7 +252,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
|||
(cl-loop with attrs = (doom--map-state)
|
||||
for (state . defs) in doom--map-batch-forms
|
||||
if (or doom--map-evil-p (not state))
|
||||
collect `(general-define-key ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs))
|
||||
collect `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs))
|
||||
into forms
|
||||
finally do (push (macroexp-progn forms) doom--map-forms))
|
||||
(setq doom--map-batch-forms nil)))
|
||||
|
@ -266,7 +261,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
|||
(let ((plist
|
||||
(append (list :prefix (doom--map-append-keys :prefix)
|
||||
:non-normal-prefix (doom--map-append-keys :non-normal-prefix)
|
||||
:definer (plist-get doom--map-parent-state :definer)
|
||||
:keymaps
|
||||
(append (plist-get doom--map-parent-state :keymaps)
|
||||
(plist-get doom--map-state :keymaps)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue