(name)
register Lisp_Object name;
{
- register Lisp_Object buf, function, tem;
- int count = specpdl_ptr - specpdl;
+ register Lisp_Object buf;
register struct buffer *b;
buf = Fget_buffer (name);
b->mark = Fmake_marker ();
b->markers = Qnil;
b->name = name;
-
- function = buffer_defaults.major_mode;
- if (NILP (function))
- {
- tem = Fget (current_buffer->major_mode, Qmode_class);
- if (EQ (tem, Qnil))
- function = current_buffer->major_mode;
- }
-
- if (NILP (function) || EQ (function, Qfundamental_mode))
- return buf;
-
- /* To select a nonfundamental mode,
- select the buffer temporarily and then call the mode function. */
-
- record_unwind_protect (save_excursion_restore, save_excursion_save ());
-
- Fset_buffer (buf);
- call0 (function);
-
- return unbind_to (count, buf);
+ return buf;
}
/* Reinitialize everything about a buffer except its name and contents
Vbuffer_alist = link;
}
+DEFUN ("set-buffer-major-mode", Fset_buffer_major_mode, Sset_buffer_major_mode, 1, 1, 0,
+ "Set an appropriate major mode for BUFFER, according to `default-major-mode'.\n\
+Use this function before selecting the buffer, since it may need to inspect\n\
+the current buffer's major mode.")
+ (buf)
+ Lisp_Object buf;
+{
+ int count;
+ Lisp_Object function;
+
+ function = buffer_defaults.major_mode;
+ if (NILP (function) && NILP (Fget (current_buffer->major_mode, Qmode_class)))
+ function = current_buffer->major_mode;
+
+ if (NILP (function) || EQ (function, Qfundamental_mode))
+ return Qnil;
+
+ count = specpdl_ptr - specpdl;
+
+ /* To select a nonfundamental mode,
+ select the buffer temporarily and then call the mode function. */
+
+ record_unwind_protect (save_excursion_restore, save_excursion_save ());
+
+ Fset_buffer (buf);
+ call0 (function);
+
+ return unbind_to (count, Qnil);
+}
+
DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
"Select buffer BUFFER in the current window.\n\
BUFFER may be a buffer or a buffer name.\n\
if (NILP (bufname))
buf = Fother_buffer (Fcurrent_buffer (), Qnil);
else
- buf = Fget_buffer_create (bufname);
+ {
+ buf = Fget_buffer (bufname);
+ if (NILP (buf))
+ {
+ buf = Fget_buffer_create (bufname);
+ Fset_buffer_major_mode (buf);
+ }
+ }
Fset_buffer (buf);
if (NILP (norecord))
record_buffer (buf);
defsubr (&Sbuffer_enable_undo);
defsubr (&Skill_buffer);
defsubr (&Serase_buffer);
+ defsubr (&Sset_buffer_major_mode);
defsubr (&Sswitch_to_buffer);
defsubr (&Spop_to_buffer);
defsubr (&Scurrent_buffer);