From 88e2a0d5dea807487d880b36e8afab30067deb5b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 1 Mar 2026 17:34:59 -0500 Subject: [PATCH] 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 --- modules/completion/vertico/config.el | 11 +++-------- modules/editor/evil/config.el | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/modules/completion/vertico/config.el b/modules/completion/vertico/config.el index 8391480e7..78e778b26 100644 --- a/modules/completion/vertico/config.el +++ b/modules/completion/vertico/config.el @@ -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 "<" diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index 8d780eb0b..44f87bd40 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -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)