Fix :leader/:localleader and :prefix
Due to issues with preset prefixes in general definers and nested :prefix's supplied from a map! call not cooperating, many localleader keybinds were broken and causing errors. For :leader/:localleader keys, we now use :infix for sub-prefixes. However, with this change, the :alt-prefix property has been removed, as there is no simple way to support this without some major state gymnastics in map!. Fixes #1059
This commit is contained in:
parent
70a4db49d1
commit
d337e255d3
2 changed files with 16 additions and 35 deletions
|
@ -72,7 +72,7 @@ If any hook returns non-nil, all hooks after it are ignored.")
|
||||||
|
|
||||||
(general-create-definer define-localleader-key!
|
(general-create-definer define-localleader-key!
|
||||||
:major-modes t
|
:major-modes t
|
||||||
:keymaps 'local
|
:wk-full-keys nil
|
||||||
:prefix doom-localleader-alt-key)
|
:prefix doom-localleader-alt-key)
|
||||||
|
|
||||||
;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's
|
;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's
|
||||||
|
@ -81,7 +81,7 @@ If any hook returns non-nil, all hooks after it are ignored.")
|
||||||
(general-create-definer define-localleader-key!
|
(general-create-definer define-localleader-key!
|
||||||
:states (cdr general-describe-evil-states)
|
:states (cdr general-describe-evil-states)
|
||||||
:major-modes t
|
:major-modes t
|
||||||
:keymaps 'local
|
:wk-full-keys nil
|
||||||
:prefix doom-localleader-key
|
:prefix doom-localleader-key
|
||||||
:non-normal-prefix doom-localleader-alt-key))
|
:non-normal-prefix doom-localleader-alt-key))
|
||||||
|
|
||||||
|
@ -149,7 +149,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-fn nil)
|
||||||
(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)
|
||||||
|
@ -191,12 +191,8 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
(setq rest nil))
|
(setq rest nil))
|
||||||
(:prefix
|
(:prefix
|
||||||
(cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest))
|
(cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest))
|
||||||
(doom--map-set :prefix prefix)
|
(doom--map-set (if doom--map-fn :infix :prefix)
|
||||||
(when (stringp desc)
|
prefix)
|
||||||
(setq rest (append (list :desc desc "" nil) rest)))))
|
|
||||||
(:alt-prefix
|
|
||||||
(cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest))
|
|
||||||
(doom--map-set :non-normal-prefix prefix)
|
|
||||||
(when (stringp desc)
|
(when (stringp desc)
|
||||||
(setq rest (append (list :desc desc "" nil) rest)))))
|
(setq rest (append (list :desc desc "" nil) rest)))))
|
||||||
(:textobj
|
(:textobj
|
||||||
|
@ -210,9 +206,11 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
(condition-case e
|
(condition-case e
|
||||||
(doom--map-def (pop rest) (pop rest) (doom--keyword-to-states key) desc)
|
(doom--map-def (pop rest) (pop rest) (doom--keyword-to-states key) desc)
|
||||||
(error
|
(error
|
||||||
(error "Not a valid `map!' property: %s" key))))))
|
(error "Not a valid `map!' property: %s" key)))
|
||||||
|
(setq desc nil))))
|
||||||
|
|
||||||
((doom--map-def key (pop rest) nil desc)))))
|
((doom--map-def key (pop rest) nil desc)
|
||||||
|
(setq desc nil)))))
|
||||||
|
|
||||||
(doom--map-commit)
|
(doom--map-commit)
|
||||||
(macroexp-progn (nreverse (delq nil doom--map-forms)))))
|
(macroexp-progn (nreverse (delq nil doom--map-forms)))))
|
||||||
|
@ -226,7 +224,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
|
|
||||||
(defun doom--map-nested (wrapper rest)
|
(defun doom--map-nested (wrapper rest)
|
||||||
(doom--map-commit)
|
(doom--map-commit)
|
||||||
(let ((doom--map-parent-state (append doom--map-state doom--map-parent-state nil)))
|
(let ((doom--map-parent-state (doom--map-state)))
|
||||||
(push (if wrapper
|
(push (if wrapper
|
||||||
(append wrapper (list (doom--map-process rest)))
|
(append wrapper (list (doom--map-process rest)))
|
||||||
(doom--map-process rest))
|
(doom--map-process rest))
|
||||||
|
@ -254,14 +252,16 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
:which-key desc))))))))
|
:which-key desc))))))))
|
||||||
(dolist (state states)
|
(dolist (state states)
|
||||||
(push (list key def)
|
(push (list key def)
|
||||||
(alist-get state doom--map-batch-forms))))
|
(alist-get state doom--map-batch-forms)))
|
||||||
|
t)
|
||||||
|
|
||||||
(defun doom--map-commit ()
|
(defun doom--map-commit ()
|
||||||
(when doom--map-batch-forms
|
(when doom--map-batch-forms
|
||||||
(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 `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs
|
collect `(,(or doom--map-fn 'general-define-key)
|
||||||
|
,@(if state `(:states ',state)) ,@attrs
|
||||||
,@(mapcan #'identity (nreverse defs)))
|
,@(mapcan #'identity (nreverse defs)))
|
||||||
into forms
|
into forms
|
||||||
finally do (push (macroexp-progn forms) doom--map-forms))
|
finally do (push (macroexp-progn forms) doom--map-forms))
|
||||||
|
@ -270,7 +270,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
|
||||||
(defun doom--map-state ()
|
(defun doom--map-state ()
|
||||||
(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)
|
:infix (doom--map-append-keys :infix)
|
||||||
: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)))
|
||||||
|
|
|
@ -251,25 +251,6 @@
|
||||||
(general-define-key :prefix (general--concat nil "a" "b")
|
(general-define-key :prefix (general--concat nil "a" "b")
|
||||||
"x" #'x)))))
|
"x" #'x)))))
|
||||||
|
|
||||||
(describe ":alt-prefix"
|
|
||||||
(it "specifies a prefix for all keys"
|
|
||||||
(expect '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z)
|
|
||||||
:to-expand-into
|
|
||||||
'(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z)))
|
|
||||||
|
|
||||||
(it "overwrites previous inline :alt-prefix properties"
|
|
||||||
(expect '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z)
|
|
||||||
:to-expand-into
|
|
||||||
'(progn (general-define-key :non-normal-prefix "a" "x" #'x "y" #'y)
|
|
||||||
(general-define-key :non-normal-prefix "b" "z" #'z))))
|
|
||||||
|
|
||||||
(it "accumulates keys when nested"
|
|
||||||
(expect '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x)))
|
|
||||||
:to-expand-into
|
|
||||||
`(progn (general-define-key :non-normal-prefix "a" "x" #'x)
|
|
||||||
(general-define-key :non-normal-prefix (general--concat nil "a" "b")
|
|
||||||
"x" #'x)))))
|
|
||||||
|
|
||||||
(describe ":textobj"
|
(describe ":textobj"
|
||||||
(it "defines keys in evil-{inner,outer}-text-objects-map"
|
(it "defines keys in evil-{inner,outer}-text-objects-map"
|
||||||
(expect '(map! :textobj "a" #'inner #'outer)
|
(expect '(map! :textobj "a" #'inner #'outer)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue