diff src/buffer.c @ 91367:c70e45a7acfd

Merge from emacs--devo--0 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-324
author Miles Bader <miles@gnu.org>
date Wed, 30 Jan 2008 07:57:28 +0000
parents 606f2d163a64 0f04103be3bf
children d1e53221c4aa
line wrap: on
line diff
--- a/src/buffer.c	Wed Jan 30 06:40:42 2008 +0000
+++ b/src/buffer.c	Wed Jan 30 07:57:28 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;
 
@@ -762,13 +763,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
@@ -5308,6 +5334,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);
@@ -5335,6 +5363,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");
@@ -5575,7 +5604,8 @@
 
   DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
                      Qnil,
-		     doc: /* Pretty name of current buffer's major mode (a string).  */);
+		     doc: /* Pretty name of current buffer's major mode.
+Usually a string.  See `mode-line-format' for other possible forms.  */);
 
   DEFVAR_PER_BUFFER ("local-abbrev-table", &current_buffer->abbrev_table, Qnil,
 		     doc: /* Local (mode-specific) abbrev table of current buffer.  */);