diff --git a/etc/NEWS b/etc/NEWS index f3e3d9a1b6e..2aed5751595 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1748,6 +1748,9 @@ to lexical binding, where dynamic (special) variables bound in one file can affect code in another. For details, see the manual section '(Elisp) Converting to Lexical Binding'. +--- +** 'unload-feature' now also tries to undo additions to buffer-local hooks. + * Changes in Emacs 28.1 on Non-Free Operating Systems diff --git a/lisp/loadhist.el b/lisp/loadhist.el index 60da00cceb2..81576679c35 100644 --- a/lisp/loadhist.el +++ b/lisp/loadhist.el @@ -300,6 +300,15 @@ something strange, such as redefining an Emacs function." (memq x unload-feature-special-hooks))) (dolist (func removables) (remove-hook x func))))) + (save-current-buffer + (dolist (buffer (buffer-list)) + (pcase-dolist (`(,sym . ,val) (buffer-local-variables buffer)) + (when (or (and (consp val) + (string-match "-hooks?\\'" (symbol-name sym))) + (memq sym unload-feature-special-hooks)) + (set-buffer buffer) + (dolist (func removables) + (remove-hook sym func t)))))) ;; Remove any feature-symbols from auto-mode-alist as well. (dolist (func removables) (setq auto-mode-alist