diff --git a/core/core-popups.el b/core/core-popups.el index dff10b502..4bf7f965a 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -249,7 +249,7 @@ properties." (define-key map [remap evil-window-vsplit] 'ignore) (define-key map [remap evil-force-normal-state] 'doom/popup-close-maybe)) - (defun doom*popup-close-all-maybe () + (defun doom|popup-close-all-maybe () "Close popups with an :autoclose property when pressing ESC from normal mode in any evil-mode buffer." (unless (or (doom-popup-p) @@ -257,7 +257,7 @@ mode in any evil-mode buffer." (and (bound-and-true-p evil-mode) (evil-ex-hl-active-p 'evil-ex-search))) (doom/popup-close-all))) - (advice-add #'evil-force-normal-state :after #'doom*popup-close-all-maybe) + (add-hook '+evil-esc-hook #'doom|popup-close-all-maybe) ;; Make evil-mode cooperate with popups (advice-add #'evil-command-window :override #'doom*popup-evil-command-window) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5e9609c8f..dfef7f063 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -94,13 +94,26 @@ ;; evil hacks ;; -(defun +evil*esc () - "Disable search highlights and quit the minibuffer if open." +(defvar +evil-esc-hook nil + "A hook run after ESC is pressed in normal mode (invoked by +`evil-force-normal-state').") + +(defun +evil*attach-escape-hook () + "Run the `+evil-esc-hook'." + (run-hooks '+evil-esc-hook)) +(advice-add #'evil-force-normal-state :after #'+evil*attach-escape-hook) + +(defun +evil|escape-minibuffer () + "Quit the minibuffer if open." (when (minibuffer-window-active-p (minibuffer-window)) - (abort-recursive-edit)) + (abort-recursive-edit))) + +(defun +evil|escape-highlights () + "Disable ex search buffer highlights." (when (evil-ex-hl-active-p 'evil-ex-search) (evil-ex-nohighlight))) -(advice-add #'evil-force-normal-state :after #'+evil*esc) + +(add-hook! '+evil-esc-hook '(+evil|escape-minibuffer +evil|escape-highlights)) (defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) "If in anything but normal or motion mode when moving to another window, @@ -272,9 +285,9 @@ across windows." (def-package! evil-exchange :commands evil-exchange :config - (defun +evil*exchange-off () + (defun +evil|escape-exchange () (if evil-exchange--overlays (evil-exchange-cancel))) - (advice-add #'evil-force-normal-state :after #'+evil*exchange-off)) + (add-hook '+evil-esc-hook #'+evil|escape-exchange)) (def-package! evil-indent-plus @@ -330,7 +343,7 @@ algorithm is just confusing, like in python or ruby." :commands (evil-textobj-anyblock-inner-block evil-textobj-anyblock-a-block) :config (global-evil-search-highlight-persist t) - (advice-add #'evil-force-normal-state :after #'evil-search-highlight-persist-remove-all)) + (add-hook '+evil-esc-hook #'evil-search-highlight-persist-remove-all)) (def-package! evil-snipe :demand t diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index ab073b2f4..8f3da9a44 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -55,7 +55,7 @@ :v "" #'+snippets/expand-on-region)) ;; Exit snippets on ESC in normal mode - (advice-add #'evil-force-normal-state :before #'yas-exit-all-snippets) + (add-hook '+evil-esc-hook #'yas-exit-all-snippets) ;; Once you're in normal mode, you're out (add-hook 'evil-normal-state-entry-hook #'yas-abort-snippet) ;; Strip out whitespace before a line selection diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 70dd70bd1..73fb95353 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -29,7 +29,7 @@ ;; Flycheck buffer on ESC in normal mode. (defun +syntax-checkers|flycheck-buffer () (if flycheck-mode (flycheck-buffer))) - (advice-add #'evil-force-normal-state :after #'+syntax-checkers|flycheck-buffer))) + (add-hook '+evil-esc-hook #'+syntax-checkers|flycheck-buffer))) (def-package! flycheck-pos-tip diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index b5ba74228..0c5778b6f 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -25,8 +25,8 @@ (add-hook 'focus-in-hook #'git-gutter:update-all-windows) (after! evil - ;; Refreshing git-gutter on ESC - (advice-add #'evil-force-normal-state :after #'git-gutter))) + ;; Refresh git-gutter on ESC + (add-hook '+evil-esc-hook #'git-gutter))) (def-package! git-timemachine diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 55f5d81d4..30fa84629 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -363,10 +363,10 @@ (IS-LINUX "xdg-open \"%s\""))))) ;; Remove highlights on ESC - (defun +org*remove-occur-highlights (&rest args) + (defun +org|remove-occur-highlights (&rest args) (when (eq major-mode 'org-mode) (org-remove-occur-highlights))) - (advice-add #'evil-force-normal-state :before #'+org*remove-occur-highlights) + (add-hook '+evil-esc-hook #'+org|remove-occur-highlights) (after! org-bullets (define-minor-mode org-bullets-mode diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 4c18c9667..8072e3271 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -46,7 +46,7 @@ ;; Ensure anzu state is cleared when searches & iedit are done (add-hook! '(kill-buffer-hook find-file-hook) #'+doom-modeline|reset-anzu) (after! evil - (advice-add #'evil-force-normal-state :after #'+doom-modeline|reset-anzu) + (add-hook '+evil-esc-hook #'+doom-modeline|reset-anzu t) (advice-add #'evil-ex-search-abort :after #'+doom-modeline|reset-anzu) (after! evil-multiedit (add-hook 'iedit-mode-end-hook #'+doom-modeline|reset-anzu))))