changeset 87977:0f04103be3bf

(reset_buffer_local_variables): Implement `permanent-local-hook'. (Qpermanent_local_hook): New variable. (syms_of_buffer): init and staticpro it.
author Richard M. Stallman <rms@gnu.org>
date Fri, 25 Jan 2008 22:56:30 +0000
parents d56fb4ed60d1
children 6116c13fed46
files src/buffer.c
diffstat 1 files changed, 33 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c	Fri Jan 25 22:52:50 2008 +0000
+++ b/src/buffer.c	Fri Jan 25 22:56:30 2008 +0000
@@ -153,6 +153,7 @@
 int inhibit_modification_hooks;
 
 Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
+Lisp_Object Qpermanent_local_hook;
 
 Lisp_Object Qprotected_field;
 
@@ -761,13 +762,38 @@
     b->local_var_alist = Qnil;
   else
     {
-      Lisp_Object tmp, last = Qnil;
+      Lisp_Object tmp, prop, last = Qnil;
       for (tmp = b->local_var_alist; CONSP (tmp); tmp = XCDR (tmp))
 	if (CONSP (XCAR (tmp))
 	    && SYMBOLP (XCAR (XCAR (tmp)))
-	    && !NILP (Fget (XCAR (XCAR (tmp)), Qpermanent_local)))
-	  /* If permanent-local, keep it.  */
-	  last = tmp;
+	    && !NILP (prop = Fget (XCAR (XCAR (tmp)), Qpermanent_local)))
+	  {
+	    /* If permanent-local, keep it.  */
+	    last = tmp;
+	    if (EQ (prop, Qpermanent_local_hook))
+	      {
+		/* This is a partially permanent hook variable.
+		   Preserve only the elements that want to be preserved.  */
+		Lisp_Object list, newlist;
+		list = XCDR (XCAR (tmp));
+		if (!CONSP (list))
+		  newlist = list;
+		else
+		  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)))
+			newlist = Fcons (elt, newlist);
+		    }
+		XSETCDR (XCAR (tmp), Fnreverse (newlist));
+	      }
+	  }
+	/* Delete this local variable.  */
 	else if (NILP (last))
 	  b->local_var_alist = XCDR (tmp);
 	else
@@ -5292,6 +5318,8 @@
   staticpro (&Vbuffer_alist);
   staticpro (&Qprotected_field);
   staticpro (&Qpermanent_local);
+  Qpermanent_local_hook = intern ("permanent-local-hook");
+  staticpro (&Qpermanent_local_hook);
   staticpro (&Qkill_buffer_hook);
   Qoverlayp = intern ("overlayp");
   staticpro (&Qoverlayp);
@@ -5319,6 +5347,7 @@
   staticpro (&Qbefore_change_functions);
   Qafter_change_functions = intern ("after-change-functions");
   staticpro (&Qafter_change_functions);
+  /* The next one is initialized in init_buffer_once.  */
   staticpro (&Qucs_set_table_for_input);
 
   Qkill_buffer_query_functions = intern ("kill-buffer-query-functions");