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 '(normal visual motion replace) doom-leader-key 'doom-leader)
|
||||||
(general-define-key :states '(emacs insert) doom-leader-alt-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)
|
(general-create-definer define-leader-key!
|
||||||
(let (general-implicit-kbd)
|
|
||||||
(general-define-key
|
|
||||||
:keymaps 'doom-leader-map
|
|
||||||
:wk-full-keys nil
|
:wk-full-keys nil
|
||||||
key orig-def)))
|
:keymaps 'doom-leader-map)
|
||||||
|
|
||||||
;; <localleader>
|
;; <localleader>
|
||||||
(defun general-localleader-define-key (state keymap key _def orig-def kargs)
|
(general-create-definer define-localleader-key!
|
||||||
(unless keymap
|
|
||||||
(signal 'wrong-type-argument (list 'keymapp keymap)))
|
|
||||||
(let (general-implicit-kbd)
|
|
||||||
(apply #'general-define-key
|
|
||||||
:major-modes t
|
:major-modes t
|
||||||
:keymaps keymap
|
:keymaps 'local
|
||||||
(append
|
:prefix doom-localleader-alt-key)
|
||||||
;; :non-normal-prefix isn't respected when evil is absent, so this
|
|
||||||
;; is necessary:
|
;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's
|
||||||
(if (featurep 'evil)
|
;; emacs state), we must redefine `define-localleader-key!' once evil is loaded
|
||||||
(list :states '(normal visual motion)
|
(after! evil
|
||||||
|
(general-create-definer define-localleader-key!
|
||||||
|
:major-modes t
|
||||||
|
:keymaps 'local
|
||||||
:prefix doom-localleader-key
|
:prefix doom-localleader-key
|
||||||
:non-normal-prefix doom-localleader-alt-key)
|
:non-normal-prefix doom-localleader-alt-key))
|
||||||
(list :prefix doom-localleader-alt-key))
|
|
||||||
(list key orig-def)
|
|
||||||
nil))))
|
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
@ -149,6 +142,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
|
|
||||||
;; specials
|
;; specials
|
||||||
(defvar doom--map-forms nil)
|
(defvar doom--map-forms nil)
|
||||||
|
(defvar doom--map-fn 'general-define-key)
|
||||||
(defvar doom--map-batch-forms nil)
|
(defvar doom--map-batch-forms nil)
|
||||||
(defvar doom--map-state '(:dummy t))
|
(defvar doom--map-state '(:dummy t))
|
||||||
(defvar doom--map-parent-state nil)
|
(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))
|
(after! evil (setq doom--map-evil-p t))
|
||||||
|
|
||||||
(defun doom--map-process (rest)
|
(defun doom--map-process (rest)
|
||||||
(let (doom--map-state
|
(let ((doom--map-fn doom--map-fn)
|
||||||
|
doom--map-state
|
||||||
doom--map-forms
|
doom--map-forms
|
||||||
desc)
|
desc)
|
||||||
(while rest
|
(while rest
|
||||||
|
@ -167,9 +162,9 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
((keywordp key)
|
((keywordp key)
|
||||||
(pcase key
|
(pcase key
|
||||||
(:leader
|
(:leader
|
||||||
(doom--map-set :definer '(quote leader)))
|
(setq doom--map-fn 'define-leader-key!))
|
||||||
(:localleader
|
(:localleader
|
||||||
(doom--map-set :definer '(quote localleader)))
|
(setq doom--map-fn 'define-localleader-key!))
|
||||||
(:after
|
(:after
|
||||||
(doom--map-nested (list 'after! (pop rest)) rest)
|
(doom--map-nested (list 'after! (pop rest)) rest)
|
||||||
(setq rest nil))
|
(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)
|
(cl-loop with attrs = (doom--map-state)
|
||||||
for (state . defs) in doom--map-batch-forms
|
for (state . defs) in doom--map-batch-forms
|
||||||
if (or doom--map-evil-p (not state))
|
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
|
into forms
|
||||||
finally do (push (macroexp-progn forms) doom--map-forms))
|
finally do (push (macroexp-progn forms) doom--map-forms))
|
||||||
(setq doom--map-batch-forms nil)))
|
(setq doom--map-batch-forms nil)))
|
||||||
|
@ -266,7 +261,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
(let ((plist
|
(let ((plist
|
||||||
(append (list :prefix (doom--map-append-keys :prefix)
|
(append (list :prefix (doom--map-append-keys :prefix)
|
||||||
:non-normal-prefix (doom--map-append-keys :non-normal-prefix)
|
:non-normal-prefix (doom--map-append-keys :non-normal-prefix)
|
||||||
:definer (plist-get doom--map-parent-state :definer)
|
|
||||||
:keymaps
|
:keymaps
|
||||||
(append (plist-get doom--map-parent-state :keymaps)
|
(append (plist-get doom--map-parent-state :keymaps)
|
||||||
(plist-get doom--map-state :keymaps)
|
(plist-get doom--map-state :keymaps)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue