(buffer_permanent_local_flags): New variable.
(init_buffer_once): Initialize it. (reset_buffer_local_variables): New argument PERMANENT_TOO. Callers changed. Now declared static.
This commit is contained in:
parent
46b3fc26d9
commit
13de9290cf
1 changed files with 39 additions and 14 deletions
53
src/buffer.c
53
src/buffer.c
|
@ -99,11 +99,16 @@ static Lisp_Object Vbuffer_local_symbols;
|
|||
buffer_slot_type_mismatch will signal an error. */
|
||||
struct buffer buffer_local_types;
|
||||
|
||||
/* Flags indicating which built-in buffer-local variables
|
||||
are permanent locals. */
|
||||
static int buffer_permanent_local_flags;
|
||||
|
||||
Lisp_Object Fset_buffer ();
|
||||
void set_buffer_internal ();
|
||||
void set_buffer_internal_1 ();
|
||||
static void call_overlay_mod_hooks ();
|
||||
static void swap_out_buffer_local_variables ();
|
||||
static void reset_buffer_local_variables ();
|
||||
|
||||
/* Alist of all buffer names vs the buffers. */
|
||||
/* This used to be a variable, but is no longer,
|
||||
|
@ -335,7 +340,7 @@ The value is never nil.")
|
|||
b->undo_list = Qt;
|
||||
|
||||
reset_buffer (b);
|
||||
reset_buffer_local_variables (b);
|
||||
reset_buffer_local_variables (b, 1);
|
||||
|
||||
/* Put this in the alist of all live buffers. */
|
||||
XSETBUFFER (buf, b);
|
||||
|
@ -399,7 +404,7 @@ NAME should be a string which is not the name of an existing buffer.")
|
|||
b->name = name;
|
||||
|
||||
reset_buffer (b);
|
||||
reset_buffer_local_variables (b);
|
||||
reset_buffer_local_variables (b, 1);
|
||||
|
||||
/* Put this in the alist of all live buffers. */
|
||||
XSETBUFFER (buf, b);
|
||||
|
@ -474,12 +479,25 @@ reset_buffer (b)
|
|||
/* Reset buffer B's local variables info.
|
||||
Don't use this on a buffer that has already been in use;
|
||||
it does not treat permanent locals consistently.
|
||||
Instead, use Fkill_all_local_variables. */
|
||||
Instead, use Fkill_all_local_variables.
|
||||
|
||||
reset_buffer_local_variables (b)
|
||||
If PERMANENT_TOO is 1, then we reset permanent built-in
|
||||
buffer-local variables. If PERMANENT_TOO is 0,
|
||||
we preserve those. */
|
||||
|
||||
static void
|
||||
reset_buffer_local_variables (b, permanent_too)
|
||||
register struct buffer *b;
|
||||
int permanent_too;
|
||||
{
|
||||
register int offset;
|
||||
int dont_reset;
|
||||
|
||||
/* Decide which built-in local variables to reset. */
|
||||
if (permanent_too)
|
||||
dont_reset = 0;
|
||||
else
|
||||
dont_reset = buffer_permanent_local_flags;
|
||||
|
||||
/* Reset the major mode to Fundamental, together with all the
|
||||
things that depend on the major mode.
|
||||
|
@ -502,7 +520,6 @@ reset_buffer_local_variables (b)
|
|||
b->upcase_table = XCHAR_TABLE (Vascii_downcase_table)->extras[0];
|
||||
b->case_canon_table = XCHAR_TABLE (Vascii_downcase_table)->extras[1];
|
||||
b->case_eqv_table = XCHAR_TABLE (Vascii_downcase_table)->extras[2];
|
||||
b->buffer_file_type = Qnil;
|
||||
b->invisibility_spec = Qt;
|
||||
|
||||
#if 0
|
||||
|
@ -510,9 +527,9 @@ reset_buffer_local_variables (b)
|
|||
b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
|
||||
#endif /* 0 */
|
||||
|
||||
/* Reset all per-buffer variables to their defaults. */
|
||||
/* Reset all (or most) per-buffer variables to their defaults. */
|
||||
b->local_var_alist = Qnil;
|
||||
b->local_var_flags = 0;
|
||||
b->local_var_flags &= dont_reset;
|
||||
|
||||
/* For each slot that has a default value,
|
||||
copy that into the slot. */
|
||||
|
@ -522,9 +539,12 @@ reset_buffer_local_variables (b)
|
|||
offset += sizeof (Lisp_Object)) /* sizeof EMACS_INT == sizeof Lisp_Object */
|
||||
{
|
||||
int flag = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags));
|
||||
if (flag > 0 || flag == -2)
|
||||
*(Lisp_Object *)(offset + (char *)b) =
|
||||
*(Lisp_Object *)(offset + (char *)&buffer_defaults);
|
||||
if ((flag > 0
|
||||
/* Don't reset a permanent local. */
|
||||
&& ! (dont_reset & flag))
|
||||
|| flag == -2)
|
||||
*(Lisp_Object *)(offset + (char *)b)
|
||||
= *(Lisp_Object *)(offset + (char *)&buffer_defaults);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1090,7 +1110,7 @@ with SIGHUP.")
|
|||
if they happened to remain encached in their symbols.
|
||||
This gets rid of them for certain. */
|
||||
swap_out_buffer_local_variables (b);
|
||||
reset_buffer_local_variables (b);
|
||||
reset_buffer_local_variables (b, 1);
|
||||
|
||||
b->name = Qnil;
|
||||
|
||||
|
@ -1553,7 +1573,7 @@ the normal hook `change-major-mode-hook'.")
|
|||
|
||||
/* Actually eliminate all local bindings of this buffer. */
|
||||
|
||||
reset_buffer_local_variables (current_buffer);
|
||||
reset_buffer_local_variables (current_buffer, 0);
|
||||
|
||||
/* Redisplay mode lines; we are changing major mode. */
|
||||
|
||||
|
@ -3315,12 +3335,14 @@ init_buffer_once ()
|
|||
{
|
||||
register Lisp_Object tem;
|
||||
|
||||
buffer_permanent_local_flags = 0;
|
||||
|
||||
/* Make sure all markable slots in buffer_defaults
|
||||
are initialized reasonably, so mark_buffer won't choke. */
|
||||
reset_buffer (&buffer_defaults);
|
||||
reset_buffer_local_variables (&buffer_defaults);
|
||||
reset_buffer_local_variables (&buffer_defaults, 1);
|
||||
reset_buffer (&buffer_local_symbols);
|
||||
reset_buffer_local_variables (&buffer_local_symbols);
|
||||
reset_buffer_local_variables (&buffer_local_symbols, 1);
|
||||
/* Prevent GC from getting confused. */
|
||||
buffer_defaults.text = &buffer_defaults.own_text;
|
||||
buffer_local_symbols.text = &buffer_local_symbols.own_text;
|
||||
|
@ -3410,8 +3432,11 @@ init_buffer_once ()
|
|||
XSETFASTINT (buffer_local_flags.cache_long_line_scans, 0x10000);
|
||||
#ifdef DOS_NT
|
||||
XSETFASTINT (buffer_local_flags.buffer_file_type, 0x4000);
|
||||
/* Make this one a permanent local. */
|
||||
buffer_permanent_local_flags |= 0x4000;
|
||||
#endif
|
||||
|
||||
|
||||
Vbuffer_alist = Qnil;
|
||||
current_buffer = 0;
|
||||
all_buffers = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue