From 0f3be2a6e803f5868e83cac16ce04680fe8a63a8 Mon Sep 17 00:00:00 2001 From: "Aaron L. Zeng" Date: Wed, 26 Nov 2025 15:47:13 -0500 Subject: [PATCH] Ensure overriding minor mode is enabled in the correct buffer Hook onto window-state-change-functions instead of buffer-list-update-hook, since the latter does not guarantee that a just-created buffer is actually current. So, a command like the following would create, display, and select a buffer wherein the ensure-override-mode-func is never executed: (defun display-results () (interactive) (let ((buffer (get-buffer-create "*results*"))) (with-current-buffer buffer (insert "I ran a command, and here are the results...")) (display-buffer buffer '(display-buffer-same-window)))) This change also has the nice side benefit of skipping the hook if a buffer is never displayed, or the window displaying it is never selected. --- bind-map.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/bind-map.el b/bind-map.el index fd7cb05..1e932d4 100644 --- a/bind-map.el +++ b/bind-map.el @@ -407,16 +407,18 @@ mode maps. Set up by bind-map.el." map)) (add-hook ',(intern (format "%s-hook" override-mode)) #'evil-normalize-keymaps)) ;; Defensive hook to ensure the mode is enabled in buffers that may - ;; have been created in unusual ways (e.g., programmatically via - ;; get-buffer-create). This catches cases where after-change-major-mode-hook - ;; might not fire or fires before the global mode is enabled. - (defun ,ensure-override-mode-func () + ;; have been created in unusual ways (e.g., without ever calling a + ;; major mode function). This catches cases where + ;; `after-change-major-mode-hook' might not fire or fires before the + ;; global mode is enabled. + (defun ,ensure-override-mode-func (frame) ,ensure-override-mode-doc - (when (and ,global-override-mode - (not ,override-mode) - (not (minibufferp))) - (,override-mode 1))) - (add-hook 'buffer-list-update-hook #',ensure-override-mode-func))) + (with-current-buffer (window-buffer (frame-selected-window frame)) + (when (and ,global-override-mode + (not ,override-mode) + (not (minibufferp))) + (,override-mode 1)))) + (add-hook 'window-state-change-functions #',ensure-override-mode-func))) (if (or minor-modes major-modes) ;; only bind keys in root-map