From: Štěpán Němec Date: Mon, 6 Apr 2020 11:30:11 +0000 (+0200) Subject: unload-feature: Handle local hooks (bug#5293) X-Git-Tag: emacs-28.0.90~5497 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5c266a71c160ed823e9ef69d2ff44fb0bb81ff77;p=emacs.git unload-feature: Handle local hooks (bug#5293) Buffer-local hooks were introduced in 1994-09-30T20:47:13+00:00!rms@gnu.org 0e4d378b32 (add-hook): Initialize default value and local value. but 'unload-feature' has not been updated to handle them. * lisp/loadhist.el (unload-feature): Handle local hooks (bug#5293). --- 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