From b4fabb316dfe59c75525cd37eaf87020582a9d12 Mon Sep 17 00:00:00 2001 From: jakanakaevangeli Date: Tue, 20 Jul 2021 16:31:24 +0200 Subject: [PATCH] Make `kill-all-local-variables' also remove lambda from hooks * src/buffer.c (reset_buffer_local_variables): Also remove non-symbol elements from hook variables (bug#46407). --- etc/NEWS | 8 ++++++++ src/buffer.c | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index df09d81bcfe..8fa43b83b54 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2829,6 +2829,14 @@ This is to keep the same behavior as Eshell. * Incompatible Lisp Changes in Emacs 28.1 +--- +** 'kill-all-local-variables' has changed how it handles non-symbol hooks. +The function is documented to eliminated all buffer-local bindings +except variables with a 'permanent-local' property, or hooks that +have elements with a 'permanent-local-hook' property. In addition, it +would also keep lambda expressions in hooks sometimes. The latter has +now been changed: The function will now also remove these. + --- ** Some floating-point numbers are now handled differently by the Lisp reader. In previous versions of Emacs, numbers with a trailing dot and an exponent diff --git a/src/buffer.c b/src/buffer.c index 335523de604..b177c5eaa7f 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1084,12 +1084,12 @@ reset_buffer_local_variables (struct buffer *b, bool permanent_too) for (newlist = Qnil; CONSP (list); list = XCDR (list)) { Lisp_Object elt = XCAR (list); - /* Preserve element ELT if it's t, - if it is a function with a `permanent-local-hook' property, - or if it's not a symbol. */ - if (! SYMBOLP (elt) - || EQ (elt, Qt) - || !NILP (Fget (elt, Qpermanent_local_hook))) + /* Preserve element ELT if it's t, or if it is a + function with a `permanent-local-hook' + property. */ + if (EQ (elt, Qt) + || (SYMBOLP (elt) + && !NILP (Fget (elt, Qpermanent_local_hook)))) newlist = Fcons (elt, newlist); } newlist = Fnreverse (newlist);