feat(evil,vertico): merge evil's into emacs' registers

Makes Emacs more broadly aware of Evil's registers (when Evil is
active), and fixes an issue where our advice integrating
`consult-register` with Evil registers would properly list Evil
registers, but not fetch/insert them correctly (#8698).

Fix: #8698
Close: #8699
Co-authored-by: liaowang11 <liaowang11@users.noreply.github.com>
This commit is contained in:
Henrik Lissner 2026-03-01 17:34:59 -05:00
parent a9af7810fe
commit 88e2a0d5de
No known key found for this signature in database
GPG key ID: B60957CA074D39A3
2 changed files with 30 additions and 8 deletions

View file

@ -127,14 +127,9 @@ orderless."
:before (list #'consult-recent-file #'consult-buffer)
(recentf-mode +1))
(defadvice! +vertico--use-evil-registers-a (fn &rest args)
"Use `evil-register-list' if `evil-mode' is active."
:around #'consult-register--alist
(let ((register-alist
(if (bound-and-true-p evil-local-mode)
(evil-register-list)
register-alist)))
(apply fn args)))
;; HACK: Merge Evil's registers into `consult-register' register list.
(when (modulep! :editor evil +everywhere)
(advice-add #'consult-register--alist :around #'+evil--propagate-registers-a))
(setq consult-project-function #'doom-project-root
consult-narrow-key "<"

View file

@ -186,6 +186,33 @@ directives. By default, this only recognizes C directives.")
(funcall fill-region from to justify t to-eop))
(apply fn args)))
;; HACK: Make Emacs registers recognize and treat Evil registers like their
;; own, for consistency's sake.
(when (modulep! +everywhere)
(defadvice! +evil--use-evil-registers-a (fn register)
"Merge Evil's registers into Emacs' register list (when Evil is active)."
:around #'get-register
(if (and (characterp register) ; prevent `evil-get-register' type error
(or (bound-and-true-p evil-mode)
(bound-and-true-p evil-local-mode)))
(if (char-equal register ?=) ; last expression register input
evil-last-=-register-input
(evil-get-register register t))
(funcall fn register)))
(defadvice! +evil--propagate-registers-a (fn &rest args)
"Merge Evil's registers into Emacs' register list (when Evil is active)."
:around #'register-swap-out
:around #'register-buffer-to-file-query
:around #'register-read-with-preview-fancy
:around #'list-registers
(let ((register-alist
(if (or (bound-and-true-p evil-mode)
(bound-and-true-p evil-local-mode))
(evil-register-list)
register-alist)))
(apply fn args))))
;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'.
(advice-add #'evil-force-normal-state :after #'+evil-escape-a)