* alloc.c (make_pure_float): Align pureptr on a sizeof (double)
[bpt/emacs.git] / src / buffer.c
CommitLineData
1ab256cb 1/* Buffer manipulation primitives for GNU Emacs.
8cf9a8c6 2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
1ab256cb
RM
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
2381d133
JB
21#include <sys/types.h>
22#include <sys/stat.h>
1ab256cb
RM
23#include <sys/param.h>
24
25#ifndef MAXPATHLEN
26/* in 4.1, param.h fails to define this. */
27#define MAXPATHLEN 1024
28#endif /* not MAXPATHLEN */
29
1ab256cb
RM
30#include "config.h"
31#include "lisp.h"
21cf4cf8 32#include "intervals.h"
1ab256cb
RM
33#include "window.h"
34#include "commands.h"
35#include "buffer.h"
36#include "syntax.h"
37#include "indent.h"
38
39struct buffer *current_buffer; /* the current buffer */
40
41/* First buffer in chain of all buffers (in reverse order of creation).
42 Threaded through ->next. */
43
44struct buffer *all_buffers;
45
46/* This structure holds the default values of the buffer-local variables
47 defined with DEFVAR_PER_BUFFER, that have special slots in each buffer.
48 The default value occupies the same slot in this structure
49 as an individual buffer's value occupies in that buffer.
50 Setting the default value also goes through the alist of buffers
51 and stores into each buffer that does not say it has a local value. */
52
53struct buffer buffer_defaults;
54
55/* A Lisp_Object pointer to the above, used for staticpro */
56
57static Lisp_Object Vbuffer_defaults;
58
59/* This structure marks which slots in a buffer have corresponding
60 default values in buffer_defaults.
61 Each such slot has a nonzero value in this structure.
62 The value has only one nonzero bit.
63
64 When a buffer has its own local value for a slot,
65 the bit for that slot (found in the same slot in this structure)
66 is turned on in the buffer's local_var_flags slot.
67
68 If a slot in this structure is -1, then even though there may
69 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
70 and the corresponding slot in buffer_defaults is not used.
71
72 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it,
73 but there is a default value which is copied into each buffer.
74
75 If a slot in this structure is negative, then even though there may
76 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
77 and the corresponding slot in buffer_defaults is not used.
78
79 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is
80 zero, that is a bug */
81
82struct buffer buffer_local_flags;
83
84/* This structure holds the names of symbols whose values may be
85 buffer-local. It is indexed and accessed in the same way as the above. */
86
87struct buffer buffer_local_symbols;
88/* A Lisp_Object pointer to the above, used for staticpro */
89static Lisp_Object Vbuffer_local_symbols;
90
0fa3ba92
JB
91/* This structure holds the required types for the values in the
92 buffer-local slots. If a slot contains Qnil, then the
93 corresponding buffer slot may contain a value of any type. If a
94 slot contains an integer, then prospective values' tags must be
95 equal to that integer. When a tag does not match, the function
96 buffer_slot_type_mismatch will signal an error. */
97struct buffer buffer_local_types;
98
1ab256cb
RM
99/* Nonzero means don't allow modification of protected fields. */
100
101int check_protected_fields;
102
103Lisp_Object Fset_buffer ();
01050cb5 104void set_buffer_internal ();
1ab256cb
RM
105
106/* Alist of all buffer names vs the buffers. */
107/* This used to be a variable, but is no longer,
108 to prevent lossage due to user rplac'ing this alist or its elements. */
109Lisp_Object Vbuffer_alist;
110
111/* Functions to call before and after each text change. */
112Lisp_Object Vbefore_change_function;
113Lisp_Object Vafter_change_function;
114
dbc4e1c1
JB
115/* List of functions to call before changing an unmodified buffer. */
116Lisp_Object Vfirst_change_hook;
117Lisp_Object Qfirst_change_hook;
1ab256cb
RM
118
119Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
120
121Lisp_Object Qprotected_field;
122
123Lisp_Object QSFundamental; /* A string "Fundamental" */
124
125Lisp_Object Qkill_buffer_hook;
126
127/* For debugging; temporary. See set_buffer_internal. */
128/* Lisp_Object Qlisp_mode, Vcheck_symbol; */
129
130nsberror (spec)
131 Lisp_Object spec;
132{
133 if (XTYPE (spec) == Lisp_String)
134 error ("No buffer named %s", XSTRING (spec)->data);
135 error ("Invalid buffer argument");
136}
137\f
138DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
139 "Return a list of all existing live buffers.")
140 ()
141{
142 return Fmapcar (Qcdr, Vbuffer_alist);
143}
144
145DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
146 "Return the buffer named NAME (a string).\n\
147If there is no live buffer named NAME, return nil.\n\
148NAME may also be a buffer; if so, the value is that buffer.")
149 (name)
150 register Lisp_Object name;
151{
152 if (XTYPE (name) == Lisp_Buffer)
153 return name;
154 CHECK_STRING (name, 0);
155
156 return Fcdr (Fassoc (name, Vbuffer_alist));
157}
158
159DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
160 "Return the buffer visiting file FILENAME (a string).\n\
161If there is no such live buffer, return nil.")
162 (filename)
163 register Lisp_Object filename;
164{
165 register Lisp_Object tail, buf, tem;
166 CHECK_STRING (filename, 0);
167 filename = Fexpand_file_name (filename, Qnil);
168
169 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr)
170 {
171 buf = Fcdr (XCONS (tail)->car);
172 if (XTYPE (buf) != Lisp_Buffer) continue;
173 if (XTYPE (XBUFFER (buf)->filename) != Lisp_String) continue;
174 tem = Fstring_equal (XBUFFER (buf)->filename, filename);
265a9e55 175 if (!NILP (tem))
1ab256cb
RM
176 return buf;
177 }
178 return Qnil;
179}
180
181/* Incremented for each buffer created, to assign the buffer number. */
182int buffer_count;
183
184DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
185 "Return the buffer named NAME, or create such a buffer and return it.\n\
186A new buffer is created if there is no live buffer named NAME.\n\
b44895bc 187If NAME starts with a space, the new buffer does not keep undo information.\n\
1ab256cb
RM
188If NAME is a buffer instead of a string, then it is the value returned.\n\
189The value is never nil.")
190 (name)
191 register Lisp_Object name;
192{
193 register Lisp_Object buf, function, tem;
194 int count = specpdl_ptr - specpdl;
195 register struct buffer *b;
196
197 buf = Fget_buffer (name);
265a9e55 198 if (!NILP (buf))
1ab256cb
RM
199 return buf;
200
201 b = (struct buffer *) malloc (sizeof (struct buffer));
202 if (!b)
203 memory_full ();
204
205 BUF_GAP_SIZE (b) = 20;
206 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b));
207 if (! BUF_BEG_ADDR (b))
208 memory_full ();
209
210 BUF_PT (b) = 1;
211 BUF_GPT (b) = 1;
212 BUF_BEGV (b) = 1;
213 BUF_ZV (b) = 1;
214 BUF_Z (b) = 1;
215 BUF_MODIFF (b) = 1;
216
217 /* Put this on the chain of all buffers including killed ones. */
218 b->next = all_buffers;
219 all_buffers = b;
220
221 b->mark = Fmake_marker ();
222 /*b->number = make_number (++buffer_count);*/
223 b->name = name;
224 if (XSTRING (name)->data[0] != ' ')
225 b->undo_list = Qnil;
226 else
227 b->undo_list = Qt;
228
229 reset_buffer (b);
230
231 /* Put this in the alist of all live buffers. */
232 XSET (buf, Lisp_Buffer, b);
233 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
234
235 b->mark = Fmake_marker ();
236 b->markers = Qnil;
237 b->name = name;
238
239 function = buffer_defaults.major_mode;
265a9e55 240 if (NILP (function))
1ab256cb
RM
241 {
242 tem = Fget (current_buffer->major_mode, Qmode_class);
243 if (EQ (tem, Qnil))
244 function = current_buffer->major_mode;
245 }
246
265a9e55 247 if (NILP (function) || EQ (function, Qfundamental_mode))
1ab256cb
RM
248 return buf;
249
250 /* To select a nonfundamental mode,
251 select the buffer temporarily and then call the mode function. */
252
253 record_unwind_protect (save_excursion_restore, save_excursion_save ());
254
255 Fset_buffer (buf);
256 call0 (function);
257
258 return unbind_to (count, buf);
259}
260
261/* Reinitialize everything about a buffer except its name and contents. */
262
263void
264reset_buffer (b)
265 register struct buffer *b;
266{
267 b->filename = Qnil;
268 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
269 b->modtime = 0;
270 b->save_modified = 1;
291026b5 271 XFASTINT (b->save_length) = 0;
1ab256cb
RM
272 b->last_window_start = 1;
273 b->backed_up = Qnil;
274 b->auto_save_modified = 0;
275 b->auto_save_file_name = Qnil;
276 b->read_only = Qnil;
277 b->fieldlist = Qnil;
33f7013e
JA
278
279 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
280 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
281
1ab256cb
RM
282 reset_buffer_local_variables(b);
283}
284
285reset_buffer_local_variables(b)
286 register struct buffer *b;
287{
288 register int offset;
289
290 /* Reset the major mode to Fundamental, together with all the
291 things that depend on the major mode.
292 default-major-mode is handled at a higher level.
293 We ignore it here. */
294 b->major_mode = Qfundamental_mode;
295 b->keymap = Qnil;
296 b->abbrev_table = Vfundamental_mode_abbrev_table;
297 b->mode_name = QSFundamental;
298 b->minor_modes = Qnil;
299 b->downcase_table = Vascii_downcase_table;
300 b->upcase_table = Vascii_upcase_table;
301 b->case_canon_table = Vascii_downcase_table;
302 b->case_eqv_table = Vascii_upcase_table;
303#if 0
304 b->sort_table = XSTRING (Vascii_sort_table);
305 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
306#endif /* 0 */
307
308 /* Reset all per-buffer variables to their defaults. */
309 b->local_var_alist = Qnil;
310 b->local_var_flags = 0;
311
312 /* For each slot that has a default value,
313 copy that into the slot. */
314
315 for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags;
316 offset < sizeof (struct buffer);
317 offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */
318 if (*(int *)(offset + (char *) &buffer_local_flags) > 0
319 || *(int *)(offset + (char *) &buffer_local_flags) == -2)
320 *(Lisp_Object *)(offset + (char *)b) =
321 *(Lisp_Object *)(offset + (char *)&buffer_defaults);
322}
323
01050cb5
RM
324/* We split this away from generate-new-buffer, because rename-buffer
325 and set-visited-file-name ought to be able to use this to really
326 rename the buffer properly. */
327
328DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name,
1ab256cb 329 1, 1, 0,
01050cb5
RM
330 "Return a string that is the name of no existing buffer based on NAME.\n\
331If there is no live buffer named NAME, then return NAME.\n\
1ab256cb 332Otherwise modify name by appending `<NUMBER>', incrementing NUMBER\n\
01050cb5 333until an unused name is found, and then return that name.")
1ab256cb
RM
334 (name)
335 register Lisp_Object name;
336{
337 register Lisp_Object gentemp, tem;
338 int count;
339 char number[10];
340
341 CHECK_STRING (name, 0);
342
343 tem = Fget_buffer (name);
265a9e55 344 if (NILP (tem))
01050cb5 345 return name;
1ab256cb
RM
346
347 count = 1;
348 while (1)
349 {
350 sprintf (number, "<%d>", ++count);
351 gentemp = concat2 (name, build_string (number));
352 tem = Fget_buffer (gentemp);
265a9e55 353 if (NILP (tem))
01050cb5 354 return gentemp;
1ab256cb
RM
355 }
356}
357
358\f
359DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
360 "Return the name of BUFFER, as a string.\n\
01050cb5 361With no argument or nil as argument, return the name of the current buffer.")
1ab256cb
RM
362 (buffer)
363 register Lisp_Object buffer;
364{
265a9e55 365 if (NILP (buffer))
1ab256cb
RM
366 return current_buffer->name;
367 CHECK_BUFFER (buffer, 0);
368 return XBUFFER (buffer)->name;
369}
370
371DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
372 "Return name of file BUFFER is visiting, or nil if none.\n\
373No argument or nil as argument means use the current buffer.")
374 (buffer)
375 register Lisp_Object buffer;
376{
265a9e55 377 if (NILP (buffer))
1ab256cb
RM
378 return current_buffer->filename;
379 CHECK_BUFFER (buffer, 0);
380 return XBUFFER (buffer)->filename;
381}
382
383DEFUN ("buffer-local-variables", Fbuffer_local_variables,
384 Sbuffer_local_variables, 0, 1, 0,
385 "Return an alist of variables that are buffer-local in BUFFER.\n\
386Each element looks like (SYMBOL . VALUE) and describes one variable.\n\
387Note that storing new VALUEs in these elements doesn't change the variables.\n\
388No argument or nil as argument means use current buffer as BUFFER.")
389 (buffer)
390 register Lisp_Object buffer;
391{
392 register struct buffer *buf;
393 register Lisp_Object val;
394
265a9e55 395 if (NILP (buffer))
1ab256cb
RM
396 buf = current_buffer;
397 else
398 {
399 CHECK_BUFFER (buffer, 0);
400 buf = XBUFFER (buffer);
401 }
402
403 {
404 /* Reference each variable in the alist in our current buffer.
405 If inquiring about the current buffer, this gets the current values,
406 so store them into the alist so the alist is up to date.
407 If inquiring about some other buffer, this swaps out any values
408 for that buffer, making the alist up to date automatically. */
409 register Lisp_Object tem;
410 for (tem = buf->local_var_alist; CONSP (tem); tem = XCONS (tem)->cdr)
411 {
412 Lisp_Object v1 = Fsymbol_value (XCONS (XCONS (tem)->car)->car);
413 if (buf == current_buffer)
414 XCONS (XCONS (tem)->car)->cdr = v1;
415 }
416 }
417
418 /* Make a copy of the alist, to return it. */
419 val = Fcopy_alist (buf->local_var_alist);
420
421 /* Add on all the variables stored in special slots. */
422 {
423 register int offset, mask;
424
425 for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols;
426 offset < sizeof (struct buffer);
427 offset += (sizeof (int))) /* sizeof int == sizeof Lisp_Object */
428 {
429 mask = *(int *)(offset + (char *) &buffer_local_flags);
430 if (mask == -1 || (buf->local_var_flags & mask))
431 if (XTYPE (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols))
432 == Lisp_Symbol)
433 val = Fcons (Fcons (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols),
434 *(Lisp_Object *)(offset + (char *)buf)),
435 val);
436 }
437 }
438 return (val);
439}
440
441\f
442DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
443 0, 1, 0,
444 "Return t if BUFFER was modified since its file was last read or saved.\n\
445No argument or nil as argument means use current buffer as BUFFER.")
446 (buffer)
447 register Lisp_Object buffer;
448{
449 register struct buffer *buf;
265a9e55 450 if (NILP (buffer))
1ab256cb
RM
451 buf = current_buffer;
452 else
453 {
454 CHECK_BUFFER (buffer, 0);
455 buf = XBUFFER (buffer);
456 }
457
458 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil;
459}
460
461DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
462 1, 1, 0,
463 "Mark current buffer as modified or unmodified according to FLAG.\n\
464A non-nil FLAG means mark the buffer modified.")
465 (flag)
466 register Lisp_Object flag;
467{
468 register int already;
469 register Lisp_Object fn;
470
471#ifdef CLASH_DETECTION
472 /* If buffer becoming modified, lock the file.
473 If buffer becoming unmodified, unlock the file. */
474
475 fn = current_buffer->filename;
265a9e55 476 if (!NILP (fn))
1ab256cb
RM
477 {
478 already = current_buffer->save_modified < MODIFF;
265a9e55 479 if (!already && !NILP (flag))
1ab256cb 480 lock_file (fn);
265a9e55 481 else if (already && NILP (flag))
1ab256cb
RM
482 unlock_file (fn);
483 }
484#endif /* CLASH_DETECTION */
485
265a9e55 486 current_buffer->save_modified = NILP (flag) ? MODIFF : 0;
1ab256cb
RM
487 update_mode_lines++;
488 return flag;
489}
490
491DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
492 0, 1, 0,
493 "Return BUFFER's tick counter, incremented for each change in text.\n\
494Each buffer has a tick counter which is incremented each time the text in\n\
495that buffer is changed. It wraps around occasionally.\n\
496No argument or nil as argument means use current buffer as BUFFER.")
497 (buffer)
498 register Lisp_Object buffer;
499{
500 register struct buffer *buf;
265a9e55 501 if (NILP (buffer))
1ab256cb
RM
502 buf = current_buffer;
503 else
504 {
505 CHECK_BUFFER (buffer, 0);
506 buf = XBUFFER (buffer);
507 }
508
509 return make_number (BUF_MODIFF (buf));
510}
511\f
01050cb5 512DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2,
3bd779aa 513 "sRename buffer (to new name): \nP",
1ab256cb 514 "Change current buffer's name to NEWNAME (a string).\n\
3bd779aa 515If second arg UNIQUE is nil or omitted, it is an error if a\n\
01050cb5 516buffer named NEWNAME already exists.\n\
3bd779aa 517If UNIQUE is non-nil, come up with a new name using\n\
01050cb5 518`generate-new-buffer-name'.\n\
3bd779aa
RS
519Interactively, you can set UNIQUE with a prefix argument.\n\
520We return the name we actually gave the buffer.\n\
1ab256cb 521This does not change the name of the visited file (if any).")
3bd779aa
RS
522 (name, unique)
523 register Lisp_Object name, unique;
1ab256cb
RM
524{
525 register Lisp_Object tem, buf;
526
527 CHECK_STRING (name, 0);
528 tem = Fget_buffer (name);
01050cb5
RM
529 if (XBUFFER (tem) == current_buffer)
530 return current_buffer->name;
265a9e55 531 if (!NILP (tem))
01050cb5 532 {
3bd779aa 533 if (!NILP (unique))
01050cb5
RM
534 name = Fgenerate_new_buffer_name (name);
535 else
536 error ("Buffer name \"%s\" is in use", XSTRING (name)->data);
537 }
1ab256cb
RM
538
539 current_buffer->name = name;
76f590d7
JB
540
541 /* Catch redisplay's attention. Unless we do this, the mode lines for
542 any windows displaying current_buffer will stay unchanged. */
543 update_mode_lines++;
544
1ab256cb
RM
545 XSET (buf, Lisp_Buffer, current_buffer);
546 Fsetcar (Frassq (buf, Vbuffer_alist), name);
265a9e55 547 if (NILP (current_buffer->filename) && !NILP (current_buffer->auto_save_file_name))
1ab256cb 548 call0 (intern ("rename-auto-save-file"));
01050cb5 549 return name;
1ab256cb
RM
550}
551
a0ebb746 552DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 2, 0,
1ab256cb 553 "Return most recently selected buffer other than BUFFER.\n\
a0ebb746
JB
554Buffers not visible in windows are preferred to visible buffers,\n\
555unless optional second argument VISIBLE-OK is non-nil.\n\
1ab256cb
RM
556If no other buffer exists, the buffer `*scratch*' is returned.\n\
557If BUFFER is omitted or nil, some interesting buffer is returned.")
a0ebb746
JB
558 (buffer, visible_ok)
559 register Lisp_Object buffer, visible_ok;
1ab256cb
RM
560{
561 register Lisp_Object tail, buf, notsogood, tem;
562 notsogood = Qnil;
563
265a9e55 564 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
565 {
566 buf = Fcdr (Fcar (tail));
567 if (EQ (buf, buffer))
568 continue;
569 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
570 continue;
a0ebb746
JB
571 if (NILP (visible_ok))
572 tem = Fget_buffer_window (buf, Qnil);
573 else
574 tem = Qnil;
265a9e55 575 if (NILP (tem))
1ab256cb 576 return buf;
265a9e55 577 if (NILP (notsogood))
1ab256cb
RM
578 notsogood = buf;
579 }
265a9e55 580 if (!NILP (notsogood))
1ab256cb
RM
581 return notsogood;
582 return Fget_buffer_create (build_string ("*scratch*"));
583}
584\f
585DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, 1,1,
5860,
587 "Make BUFFER stop keeping undo information.")
ffd56f97
JB
588 (buffer)
589 register Lisp_Object buffer;
1ab256cb 590{
ffd56f97
JB
591 Lisp_Object real_buffer;
592
593 if (NILP (buffer))
594 XSET (real_buffer, Lisp_Buffer, current_buffer);
595 else
596 {
597 real_buffer = Fget_buffer (buffer);
598 if (NILP (real_buffer))
599 nsberror (buffer);
600 }
601
602 XBUFFER (real_buffer)->undo_list = Qt;
603
1ab256cb
RM
604 return Qnil;
605}
606
607DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
608 0, 1, "",
609 "Start keeping undo information for buffer BUFFER.\n\
610No argument or nil as argument means do this for the current buffer.")
ffd56f97
JB
611 (buffer)
612 register Lisp_Object buffer;
1ab256cb 613{
ffd56f97 614 Lisp_Object real_buffer;
1ab256cb 615
ffd56f97
JB
616 if (NILP (buffer))
617 XSET (real_buffer, Lisp_Buffer, current_buffer);
1ab256cb
RM
618 else
619 {
ffd56f97
JB
620 real_buffer = Fget_buffer (buffer);
621 if (NILP (real_buffer))
622 nsberror (buffer);
1ab256cb
RM
623 }
624
ffd56f97
JB
625 if (EQ (XBUFFER (real_buffer)->undo_list, Qt))
626 XBUFFER (real_buffer)->undo_list = Qnil;
1ab256cb
RM
627
628 return Qnil;
629}
630
631/*
632 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
633Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
634The buffer being killed will be current while the hook is running.\n\
635See `kill-buffer'."
636 */
637DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
638 "Kill the buffer BUFFER.\n\
639The argument may be a buffer or may be the name of a buffer.\n\
640An argument of nil means kill the current buffer.\n\n\
641Value is t if the buffer is actually killed, nil if user says no.\n\n\
642The value of `kill-buffer-hook' (which may be local to that buffer),\n\
643if not void, is a list of functions to be called, with no arguments,\n\
644before the buffer is actually killed. The buffer to be killed is current\n\
645when the hook functions are called.\n\n\
646Any processes that have this buffer as the `process-buffer' are killed\n\
647with `delete-process'.")
648 (bufname)
649 Lisp_Object bufname;
650{
651 Lisp_Object buf;
652 register struct buffer *b;
653 register Lisp_Object tem;
654 register struct Lisp_Marker *m;
655 struct gcpro gcpro1, gcpro2;
656
265a9e55 657 if (NILP (bufname))
1ab256cb
RM
658 buf = Fcurrent_buffer ();
659 else
660 buf = Fget_buffer (bufname);
265a9e55 661 if (NILP (buf))
1ab256cb
RM
662 nsberror (bufname);
663
664 b = XBUFFER (buf);
665
666 /* Query if the buffer is still modified. */
265a9e55 667 if (INTERACTIVE && !NILP (b->filename)
1ab256cb
RM
668 && BUF_MODIFF (b) > b->save_modified)
669 {
670 GCPRO2 (buf, bufname);
671 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
672 XSTRING (b->name)->data));
673 UNGCPRO;
265a9e55 674 if (NILP (tem))
1ab256cb
RM
675 return Qnil;
676 }
677
678 /* Run kill-buffer hook with the buffer to be killed the current buffer. */
679 {
680 register Lisp_Object val;
681 int count = specpdl_ptr - specpdl;
682
683 record_unwind_protect (save_excursion_restore, save_excursion_save ());
684 set_buffer_internal (b);
685 call1 (Vrun_hooks, Qkill_buffer_hook);
686 unbind_to (count, Qnil);
687 }
688
689 /* We have no more questions to ask. Verify that it is valid
690 to kill the buffer. This must be done after the questions
691 since anything can happen within do_yes_or_no_p. */
692
693 /* Don't kill the minibuffer now current. */
694 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
695 return Qnil;
696
265a9e55 697 if (NILP (b->name))
1ab256cb
RM
698 return Qnil;
699
700 /* Make this buffer not be current.
701 In the process, notice if this is the sole visible buffer
702 and give up if so. */
703 if (b == current_buffer)
704 {
172a9c1f 705 tem = Fother_buffer (buf, Qnil);
1ab256cb
RM
706 Fset_buffer (tem);
707 if (b == current_buffer)
708 return Qnil;
709 }
710
711 /* Now there is no question: we can kill the buffer. */
712
713#ifdef CLASH_DETECTION
714 /* Unlock this buffer's file, if it is locked. */
715 unlock_buffer (b);
716#endif /* CLASH_DETECTION */
717
1ab256cb 718 kill_buffer_processes (buf);
1ab256cb
RM
719
720 tem = Vinhibit_quit;
721 Vinhibit_quit = Qt;
722 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
723 Freplace_buffer_in_windows (buf);
724 Vinhibit_quit = tem;
725
726 /* Delete any auto-save file. */
727 if (XTYPE (b->auto_save_file_name) == Lisp_String)
728 {
729 Lisp_Object tem;
730 tem = Fsymbol_value (intern ("delete-auto-save-files"));
265a9e55 731 if (! NILP (tem))
1ab256cb
RM
732 unlink (XSTRING (b->auto_save_file_name)->data);
733 }
734
735 /* Unchain all markers of this buffer
736 and leave them pointing nowhere. */
737 for (tem = b->markers; !EQ (tem, Qnil); )
738 {
739 m = XMARKER (tem);
740 m->buffer = 0;
741 tem = m->chain;
742 m->chain = Qnil;
743 }
744 b->markers = Qnil;
745
33f7013e
JA
746 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
747 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
748 /* Perhaps we should explicitly free the interval tree here... */
749
1ab256cb
RM
750 b->name = Qnil;
751 BUFFER_FREE (BUF_BEG_ADDR (b));
752 b->undo_list = Qnil;
753
754 return Qt;
755}
756\f
36a8c287
JB
757/* Move the assoc for buffer BUF to the front of buffer-alist. Since
758 we do this each time BUF is selected visibly, the more recently
759 selected buffers are always closer to the front of the list. This
760 means that other_buffer is more likely to choose a relevant buffer. */
1ab256cb
RM
761
762record_buffer (buf)
763 Lisp_Object buf;
764{
765 register Lisp_Object link, prev;
766
767 prev = Qnil;
768 for (link = Vbuffer_alist; CONSP (link); link = XCONS (link)->cdr)
769 {
770 if (EQ (XCONS (XCONS (link)->car)->cdr, buf))
771 break;
772 prev = link;
773 }
774
36a8c287
JB
775 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
776 we cannot use Fdelq itself here because it allows quitting. */
1ab256cb 777
265a9e55 778 if (NILP (prev))
1ab256cb
RM
779 Vbuffer_alist = XCONS (Vbuffer_alist)->cdr;
780 else
781 XCONS (prev)->cdr = XCONS (XCONS (prev)->cdr)->cdr;
782
783 XCONS(link)->cdr = Vbuffer_alist;
784 Vbuffer_alist = link;
785}
786
787DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
788 "Select buffer BUFFER in the current window.\n\
789BUFFER may be a buffer or a buffer name.\n\
790Optional second arg NORECORD non-nil means\n\
791do not put this buffer at the front of the list of recently selected ones.\n\
792\n\
793WARNING: This is NOT the way to work on another buffer temporarily\n\
794within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\
795the window-buffer correspondences.")
796 (bufname, norecord)
797 Lisp_Object bufname, norecord;
798{
799 register Lisp_Object buf;
800 Lisp_Object tem;
801
802 if (EQ (minibuf_window, selected_window))
803 error ("Cannot switch buffers in minibuffer window");
804 tem = Fwindow_dedicated_p (selected_window);
265a9e55 805 if (!NILP (tem))
1ab256cb
RM
806 error ("Cannot switch buffers in a dedicated window");
807
265a9e55 808 if (NILP (bufname))
172a9c1f 809 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
810 else
811 buf = Fget_buffer_create (bufname);
812 Fset_buffer (buf);
265a9e55 813 if (NILP (norecord))
1ab256cb
RM
814 record_buffer (buf);
815
816 Fset_window_buffer (EQ (selected_window, minibuf_window)
817 ? Fnext_window (minibuf_window, Qnil) : selected_window,
818 buf);
819
820 return Qnil;
821}
822
823DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0,
824 "Select buffer BUFFER in some window, preferably a different one.\n\
825If BUFFER is nil, then some other buffer is chosen.\n\
826If `pop-up-windows' is non-nil, windows can be split to do this.\n\
827If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
828window even if BUFFER is already visible in the selected window.")
829 (bufname, other)
830 Lisp_Object bufname, other;
831{
832 register Lisp_Object buf;
265a9e55 833 if (NILP (bufname))
172a9c1f 834 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
835 else
836 buf = Fget_buffer_create (bufname);
837 Fset_buffer (buf);
838 record_buffer (buf);
839 Fselect_window (Fdisplay_buffer (buf, other));
840 return Qnil;
841}
842
843DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
844 "Return the current buffer as a Lisp object.")
845 ()
846{
847 register Lisp_Object buf;
848 XSET (buf, Lisp_Buffer, current_buffer);
849 return buf;
850}
851\f
852/* Set the current buffer to b */
853
854void
855set_buffer_internal (b)
856 register struct buffer *b;
857{
858 register struct buffer *old_buf;
859 register Lisp_Object tail, valcontents;
860 enum Lisp_Type tem;
861
862 if (current_buffer == b)
863 return;
864
865 windows_or_buffers_changed = 1;
866 old_buf = current_buffer;
867 current_buffer = b;
868 last_known_column_point = -1; /* invalidate indentation cache */
869
870 /* Look down buffer's list of local Lisp variables
871 to find and update any that forward into C variables. */
872
265a9e55 873 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
874 {
875 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
876 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
877 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
878 && (tem = XTYPE (XCONS (valcontents)->car),
879 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
880 || tem == Lisp_Objfwd)))
881 /* Just reference the variable
882 to cause it to become set for this buffer. */
883 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
884 }
885
886 /* Do the same with any others that were local to the previous buffer */
887
888 if (old_buf)
265a9e55 889 for (tail = old_buf->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
890 {
891 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
892 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
893 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
894 && (tem = XTYPE (XCONS (valcontents)->car),
895 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
896 || tem == Lisp_Objfwd)))
897 /* Just reference the variable
898 to cause it to become set for this buffer. */
899 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
900 }
901}
902
903DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
904 "Make the buffer BUFFER current for editing operations.\n\
905BUFFER may be a buffer or the name of an existing buffer.\n\
906See also `save-excursion' when you want to make a buffer current temporarily.\n\
907This function does not display the buffer, so its effect ends\n\
908when the current command terminates.\n\
909Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
910 (bufname)
911 register Lisp_Object bufname;
912{
913 register Lisp_Object buffer;
914 buffer = Fget_buffer (bufname);
265a9e55 915 if (NILP (buffer))
1ab256cb 916 nsberror (bufname);
265a9e55 917 if (NILP (XBUFFER (buffer)->name))
1ab256cb
RM
918 error ("Selecting deleted buffer");
919 set_buffer_internal (XBUFFER (buffer));
920 return buffer;
921}
922\f
923DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
924 Sbarf_if_buffer_read_only, 0, 0, 0,
925 "Signal a `buffer-read-only' error if the current buffer is read-only.")
926 ()
927{
265a9e55 928 while (!NILP (current_buffer->read_only))
1ab256cb
RM
929 Fsignal (Qbuffer_read_only, (Fcons (Fcurrent_buffer (), Qnil)));
930 return Qnil;
931}
932
933DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "",
934 "Put BUFFER at the end of the list of all buffers.\n\
935There it is the least likely candidate for `other-buffer' to return;\n\
528415e7 936thus, the least likely buffer for \\[switch-to-buffer] to select by default.\n\
a5611885
JB
937If BUFFER is nil or omitted, bury the current buffer.\n\
938Also, if BUFFER is nil or omitted, remove the current buffer from the\n\
939selected window if it is displayed there.")
1ab256cb
RM
940 (buf)
941 register Lisp_Object buf;
942{
b271272a 943 /* Figure out what buffer we're going to bury. */
265a9e55 944 if (NILP (buf))
a5611885
JB
945 {
946 XSET (buf, Lisp_Buffer, current_buffer);
947
948 /* If we're burying the current buffer, unshow it. */
949 Fswitch_to_buffer (Fother_buffer (buf), Qnil);
950 }
1ab256cb
RM
951 else
952 {
953 Lisp_Object buf1;
954
955 buf1 = Fget_buffer (buf);
265a9e55 956 if (NILP (buf1))
1ab256cb
RM
957 nsberror (buf);
958 buf = buf1;
b271272a
JB
959 }
960
a5611885 961 /* Move buf to the end of the buffer list. */
b271272a
JB
962 {
963 register Lisp_Object aelt, link;
964
965 aelt = Frassq (buf, Vbuffer_alist);
966 link = Fmemq (aelt, Vbuffer_alist);
967 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
968 XCONS (link)->cdr = Qnil;
969 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
970 }
1ab256cb 971
1ab256cb
RM
972 return Qnil;
973}
974\f
975DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, 0,
976 "Delete the entire contents of the current buffer.\n\
a5611885 977Any clipping restriction in effect (see `narrow-to-region') is removed,\n\
1ab256cb
RM
978so the buffer is truly empty after this.")
979 ()
980{
981 Fwiden ();
982 del_range (BEG, Z);
983 current_buffer->last_window_start = 1;
984 /* Prevent warnings, or suspension of auto saving, that would happen
985 if future size is less than past size. Use of erase-buffer
986 implies that the future text is not really related to the past text. */
987 XFASTINT (current_buffer->save_length) = 0;
988 return Qnil;
989}
990
991validate_region (b, e)
992 register Lisp_Object *b, *e;
993{
994 register int i;
995
996 CHECK_NUMBER_COERCE_MARKER (*b, 0);
997 CHECK_NUMBER_COERCE_MARKER (*e, 1);
998
999 if (XINT (*b) > XINT (*e))
1000 {
1001 i = XFASTINT (*b); /* This is legit even if *b is < 0 */
1002 *b = *e;
1003 XFASTINT (*e) = i; /* because this is all we do with i. */
1004 }
1005
1006 if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e)
1007 && XINT (*e) <= ZV))
1008 args_out_of_range (*b, *e);
1009}
1010\f
1011Lisp_Object
1012list_buffers_1 (files)
1013 Lisp_Object files;
1014{
1015 register Lisp_Object tail, tem, buf;
1016 Lisp_Object col1, col2, col3, minspace;
1017 register struct buffer *old = current_buffer, *b;
1018 int desired_point = 0;
1019 Lisp_Object other_file_symbol;
1020
1021 other_file_symbol = intern ("list-buffers-directory");
1022
1023 XFASTINT (col1) = 19;
1024 XFASTINT (col2) = 25;
1025 XFASTINT (col3) = 40;
1026 XFASTINT (minspace) = 1;
1027
1028 Fset_buffer (Vstandard_output);
1029
1030 tail = intern ("Buffer-menu-mode");
1031 if (!EQ (tail, current_buffer->major_mode)
265a9e55 1032 && (tem = Ffboundp (tail), !NILP (tem)))
1ab256cb
RM
1033 call0 (tail);
1034 Fbuffer_disable_undo (Vstandard_output);
1035 current_buffer->read_only = Qnil;
1036
1037 write_string ("\
1038 MR Buffer Size Mode File\n\
1039 -- ------ ---- ---- ----\n", -1);
1040
265a9e55 1041 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
1042 {
1043 buf = Fcdr (Fcar (tail));
1044 b = XBUFFER (buf);
1045 /* Don't mention the minibuffers. */
1046 if (XSTRING (b->name)->data[0] == ' ')
1047 continue;
1048 /* Optionally don't mention buffers that lack files. */
265a9e55 1049 if (!NILP (files) && NILP (b->filename))
1ab256cb
RM
1050 continue;
1051 /* Identify the current buffer. */
1052 if (b == old)
1053 desired_point = point;
1054 write_string (b == old ? "." : " ", -1);
1055 /* Identify modified buffers */
1056 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1);
265a9e55 1057 write_string (NILP (b->read_only) ? " " : "% ", -1);
1ab256cb
RM
1058 Fprinc (b->name, Qnil);
1059 Findent_to (col1, make_number (2));
1060 XFASTINT (tem) = BUF_Z (b) - BUF_BEG (b);
1061 Fprin1 (tem, Qnil);
1062 Findent_to (col2, minspace);
1063 Fprinc (b->mode_name, Qnil);
1064 Findent_to (col3, minspace);
1065
265a9e55 1066 if (!NILP (b->filename))
1ab256cb
RM
1067 Fprinc (b->filename, Qnil);
1068 else
1069 {
1070 /* No visited file; check local value of list-buffers-directory. */
1071 Lisp_Object tem;
1072 set_buffer_internal (b);
1073 tem = Fboundp (other_file_symbol);
265a9e55 1074 if (!NILP (tem))
1ab256cb
RM
1075 {
1076 tem = Fsymbol_value (other_file_symbol);
1077 Fset_buffer (Vstandard_output);
1078 if (XTYPE (tem) == Lisp_String)
1079 Fprinc (tem, Qnil);
1080 }
1081 else
1082 Fset_buffer (Vstandard_output);
1083 }
1084 write_string ("\n", -1);
1085 }
1086
1087 current_buffer->read_only = Qt;
1088 set_buffer_internal (old);
1089/* Foo. This doesn't work since temp_output_buffer_show sets point to 1
1090 if (desired_point)
1091 XBUFFER (Vstandard_output)->text.pointloc = desired_point;
1092 */
1093 return Qnil;
1094}
1095
1096DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "P",
1097 "Display a list of names of existing buffers.\n\
1098The list is displayed in a buffer named `*Buffer List*'.\n\
1099Note that buffers with names starting with spaces are omitted.\n\
1100Non-null optional arg FILES-ONLY means mention only file buffers.\n\
1101\n\
1102The M column contains a * for buffers that are modified.\n\
1103The R column contains a % for buffers that are read-only.")
1104 (files)
1105 Lisp_Object files;
1106{
1107 internal_with_output_to_temp_buffer ("*Buffer List*",
1108 list_buffers_1, files);
1109 return Qnil;
1110}
1111
1112DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
1113 0, 0, 0,
1114 "Switch to Fundamental mode by killing current buffer's local variables.\n\
1115Most local variable bindings are eliminated so that the default values\n\
1116become effective once more. Also, the syntax table is set from\n\
1117`standard-syntax-table', the local keymap is set to nil,\n\
1118and the abbrev table from `fundamental-mode-abbrev-table'.\n\
1119This function also forces redisplay of the mode line.\n\
1120\n\
1121Every function to select a new major mode starts by\n\
1122calling this function.\n\n\
1123As a special exception, local variables whose names have\n\
1124a non-nil `permanent-local' property are not eliminated by this function.")
1125 ()
1126{
1127 register Lisp_Object alist, sym, tem;
1128 Lisp_Object oalist;
1129 oalist = current_buffer->local_var_alist;
1130
1131 /* Make sure no local variables remain set up with this buffer
1132 for their current values. */
1133
265a9e55 1134 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1135 {
1136 sym = XCONS (XCONS (alist)->car)->car;
1137
1138 /* Need not do anything if some other buffer's binding is now encached. */
1139 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car;
1140 if (XBUFFER (tem) == current_buffer)
1141 {
1142 /* Symbol is set up for this buffer's old local value.
1143 Set it up for the current buffer with the default value. */
1144
1145 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr;
1146 XCONS (tem)->car = tem;
1147 XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer ();
1148 store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car,
1149 XCONS (tem)->cdr);
1150 }
1151 }
1152
1153 /* Actually eliminate all local bindings of this buffer. */
1154
1155 reset_buffer_local_variables (current_buffer);
1156
1157 /* Redisplay mode lines; we are changing major mode. */
1158
1159 update_mode_lines++;
1160
1161 /* Any which are supposed to be permanent,
1162 make local again, with the same values they had. */
1163
265a9e55 1164 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1165 {
1166 sym = XCONS (XCONS (alist)->car)->car;
1167 tem = Fget (sym, Qpermanent_local);
265a9e55 1168 if (! NILP (tem))
01050cb5
RM
1169 {
1170 Fmake_local_variable (sym);
1171 Fset (sym, XCONS (XCONS (alist)->car)->cdr);
1172 }
1ab256cb
RM
1173 }
1174
1175 /* Force mode-line redisplay. Useful here because all major mode
1176 commands call this function. */
1177 update_mode_lines++;
1178
1179 return Qnil;
1180}
1181\f
1182DEFUN ("region-fields", Fregion_fields, Sregion_fields, 2, 4, "",
1183 "Return list of fields overlapping a given portion of a buffer.\n\
1184The portion is specified by arguments START, END and BUFFER.\n\
1185BUFFER defaults to the current buffer.\n\
1186Optional 4th arg ERROR-CHECK non nil means just report an error\n\
1187if any protected fields overlap this portion.")
1188 (start, end, buffer, error_check)
1189 Lisp_Object start, end, buffer, error_check;
1190{
1191 register int start_loc, end_loc;
1192 Lisp_Object fieldlist;
1193 Lisp_Object collector;
1194
265a9e55 1195 if (NILP (buffer))
1ab256cb
RM
1196 fieldlist = current_buffer->fieldlist;
1197 else
1198 {
1199 CHECK_BUFFER (buffer, 1);
1200 fieldlist = XBUFFER (buffer)->fieldlist;
1201 }
1202
1203 CHECK_NUMBER_COERCE_MARKER (start, 2);
1204 start_loc = XINT (start);
1205
1206 CHECK_NUMBER_COERCE_MARKER (end, 2);
1207 end_loc = XINT (end);
1208
1209 collector = Qnil;
1210
1211 while (XTYPE (fieldlist) == Lisp_Cons)
1212 {
1213 register Lisp_Object field;
1214 register int field_start, field_end;
1215
1216 field = XCONS (fieldlist)->car;
1217 field_start = marker_position (FIELD_START_MARKER (field)) - 1;
1218 field_end = marker_position (FIELD_END_MARKER (field));
1219
1220 if ((start_loc < field_start && end_loc > field_start)
1221 || (start_loc >= field_start && start_loc < field_end))
1222 {
265a9e55 1223 if (!NILP (error_check))
1ab256cb 1224 {
265a9e55 1225 if (!NILP (FIELD_PROTECTED_FLAG (field)))
1ab256cb
RM
1226 {
1227 struct gcpro gcpro1;
1228 GCPRO1 (fieldlist);
1229 Fsignal (Qprotected_field, Fcons (field, Qnil));
1230 UNGCPRO;
1231 }
1232 }
1233 else
1234 collector = Fcons (field, collector);
1235 }
1236
1237 fieldlist = XCONS (fieldlist)->cdr;
1238 }
1239
1240 return collector;
1241}
1242\f
0fa3ba92
JB
1243/* Somebody has tried to store NEWVAL into the buffer-local slot with
1244 offset XUINT (valcontents), and NEWVAL has an unacceptable type. */
1245void
1246buffer_slot_type_mismatch (valcontents, newval)
1247 Lisp_Object valcontents, newval;
1248{
1249 unsigned int offset = XUINT (valcontents);
1250 char *symbol_name =
1251 (XSYMBOL (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols))
1252 ->name->data);
1253 char *type_name;
1254
1255 switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types)))
1256 {
1257 case Lisp_Int: type_name = "integers"; break;
1258 case Lisp_String: type_name = "strings"; break;
1259 case Lisp_Marker: type_name = "markers"; break;
1260 case Lisp_Symbol: type_name = "symbols"; break;
1261 case Lisp_Cons: type_name = "lists"; break;
1262 case Lisp_Vector: type_name = "vector"; break;
1263 default:
1264 abort ();
1265 }
1266
1267 error ("only %s should be stored in the buffer-local variable %s",
1268 type_name, symbol_name);
1269}
1270\f
1ab256cb
RM
1271init_buffer_once ()
1272{
1273 register Lisp_Object tem;
1274
1275 /* Make sure all markable slots in buffer_defaults
1276 are initialized reasonably, so mark_buffer won't choke. */
1277 reset_buffer (&buffer_defaults);
1278 reset_buffer (&buffer_local_symbols);
1279 XSET (Vbuffer_defaults, Lisp_Buffer, &buffer_defaults);
1280 XSET (Vbuffer_local_symbols, Lisp_Buffer, &buffer_local_symbols);
1281
1282 /* Set up the default values of various buffer slots. */
1283 /* Must do these before making the first buffer! */
1284
1285 /* real setup is done in loaddefs.el */
1286 buffer_defaults.mode_line_format = build_string ("%-");
1287 buffer_defaults.abbrev_mode = Qnil;
1288 buffer_defaults.overwrite_mode = Qnil;
1289 buffer_defaults.case_fold_search = Qt;
1290 buffer_defaults.auto_fill_function = Qnil;
1291 buffer_defaults.selective_display = Qnil;
1292#ifndef old
1293 buffer_defaults.selective_display_ellipses = Qt;
1294#endif
1295 buffer_defaults.abbrev_table = Qnil;
1296 buffer_defaults.display_table = Qnil;
1297 buffer_defaults.fieldlist = Qnil;
1298 buffer_defaults.undo_list = Qnil;
1299
1300 XFASTINT (buffer_defaults.tab_width) = 8;
1301 buffer_defaults.truncate_lines = Qnil;
1302 buffer_defaults.ctl_arrow = Qt;
1303
1304 XFASTINT (buffer_defaults.fill_column) = 70;
1305 XFASTINT (buffer_defaults.left_margin) = 0;
1306
1307 /* Assign the local-flags to the slots that have default values.
1308 The local flag is a bit that is used in the buffer
1309 to say that it has its own local value for the slot.
1310 The local flag bits are in the local_var_flags slot of the buffer. */
1311
1312 /* Nothing can work if this isn't true */
1313 if (sizeof (int) != sizeof (Lisp_Object)) abort ();
1314
1315 /* 0 means not a lisp var, -1 means always local, else mask */
1316 bzero (&buffer_local_flags, sizeof buffer_local_flags);
1317 XFASTINT (buffer_local_flags.filename) = -1;
1318 XFASTINT (buffer_local_flags.directory) = -1;
1319 XFASTINT (buffer_local_flags.backed_up) = -1;
1320 XFASTINT (buffer_local_flags.save_length) = -1;
1321 XFASTINT (buffer_local_flags.auto_save_file_name) = -1;
1322 XFASTINT (buffer_local_flags.read_only) = -1;
1323 XFASTINT (buffer_local_flags.major_mode) = -1;
1324 XFASTINT (buffer_local_flags.mode_name) = -1;
1325 XFASTINT (buffer_local_flags.undo_list) = -1;
1326
1327 XFASTINT (buffer_local_flags.mode_line_format) = 1;
1328 XFASTINT (buffer_local_flags.abbrev_mode) = 2;
1329 XFASTINT (buffer_local_flags.overwrite_mode) = 4;
1330 XFASTINT (buffer_local_flags.case_fold_search) = 8;
1331 XFASTINT (buffer_local_flags.auto_fill_function) = 0x10;
1332 XFASTINT (buffer_local_flags.selective_display) = 0x20;
1333#ifndef old
1334 XFASTINT (buffer_local_flags.selective_display_ellipses) = 0x40;
1335#endif
1336 XFASTINT (buffer_local_flags.tab_width) = 0x80;
1337 XFASTINT (buffer_local_flags.truncate_lines) = 0x100;
1338 XFASTINT (buffer_local_flags.ctl_arrow) = 0x200;
1339 XFASTINT (buffer_local_flags.fill_column) = 0x400;
1340 XFASTINT (buffer_local_flags.left_margin) = 0x800;
1341 XFASTINT (buffer_local_flags.abbrev_table) = 0x1000;
1342 XFASTINT (buffer_local_flags.display_table) = 0x2000;
1343 XFASTINT (buffer_local_flags.fieldlist) = 0x4000;
1344 XFASTINT (buffer_local_flags.syntax_table) = 0x8000;
1345
1346 Vbuffer_alist = Qnil;
1347 current_buffer = 0;
1348 all_buffers = 0;
1349
1350 QSFundamental = build_string ("Fundamental");
1351
1352 Qfundamental_mode = intern ("fundamental-mode");
1353 buffer_defaults.major_mode = Qfundamental_mode;
1354
1355 Qmode_class = intern ("mode-class");
1356
1357 Qprotected_field = intern ("protected-field");
1358
1359 Qpermanent_local = intern ("permanent-local");
1360
1361 Qkill_buffer_hook = intern ("kill-buffer-hook");
1362
1363 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
1364 /* super-magic invisible buffer */
1365 Vbuffer_alist = Qnil;
1366
ffd56f97 1367 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1ab256cb
RM
1368}
1369
1370init_buffer ()
1371{
1372 char buf[MAXPATHLEN+1];
2381d133
JB
1373 char *pwd;
1374 struct stat dotstat, pwdstat;
1ab256cb
RM
1375
1376 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
2381d133
JB
1377
1378 /* If PWD is accurate, use it instead of calling getwd. This is faster
1379 when PWD is right, and may avoid a fatal error. */
1380 if ((pwd = getenv ("PWD")) != 0 && *pwd == '/'
1381 && stat (pwd, &pwdstat) == 0
1382 && stat (".", &dotstat) == 0
1383 && dotstat.st_ino == pwdstat.st_ino
1384 && dotstat.st_dev == pwdstat.st_dev
1385 && strlen (pwd) < MAXPATHLEN)
1386 strcpy (buf, pwd);
1387 else if (getwd (buf) == 0)
1ab256cb
RM
1388 fatal ("`getwd' failed: %s.\n", buf);
1389
1390#ifndef VMS
1391 /* Maybe this should really use some standard subroutine
1392 whose definition is filename syntax dependent. */
1393 if (buf[strlen (buf) - 1] != '/')
1394 strcat (buf, "/");
1395#endif /* not VMS */
1396 current_buffer->directory = build_string (buf);
1397}
1398
1399/* initialize the buffer routines */
1400syms_of_buffer ()
1401{
1402 staticpro (&Vbuffer_defaults);
1403 staticpro (&Vbuffer_local_symbols);
1404 staticpro (&Qfundamental_mode);
1405 staticpro (&Qmode_class);
1406 staticpro (&QSFundamental);
1407 staticpro (&Vbuffer_alist);
1408 staticpro (&Qprotected_field);
1409 staticpro (&Qpermanent_local);
1410 staticpro (&Qkill_buffer_hook);
1411
1412 Fput (Qprotected_field, Qerror_conditions,
1413 Fcons (Qprotected_field, Fcons (Qerror, Qnil)));
1414 Fput (Qprotected_field, Qerror_message,
1415 build_string ("Attempt to modify a protected field"));
1416
1417 /* All these use DEFVAR_LISP_NOPRO because the slots in
1418 buffer_defaults will all be marked via Vbuffer_defaults. */
1419
1420 DEFVAR_LISP_NOPRO ("default-mode-line-format",
1421 &buffer_defaults.mode_line_format,
1422 "Default value of `mode-line-format' for buffers that don't override it.\n\
1423This is the same as (default-value 'mode-line-format).");
1424
1425 DEFVAR_LISP_NOPRO ("default-abbrev-mode",
1426 &buffer_defaults.abbrev_mode,
1427 "Default value of `abbrev-mode' for buffers that do not override it.\n\
1428This is the same as (default-value 'abbrev-mode).");
1429
1430 DEFVAR_LISP_NOPRO ("default-ctl-arrow",
1431 &buffer_defaults.ctl_arrow,
1432 "Default value of `ctl-arrow' for buffers that do not override it.\n\
1433This is the same as (default-value 'ctl-arrow).");
1434
1435 DEFVAR_LISP_NOPRO ("default-truncate-lines",
1436 &buffer_defaults.truncate_lines,
1437 "Default value of `truncate-lines' for buffers that do not override it.\n\
1438This is the same as (default-value 'truncate-lines).");
1439
1440 DEFVAR_LISP_NOPRO ("default-fill-column",
1441 &buffer_defaults.fill_column,
1442 "Default value of `fill-column' for buffers that do not override it.\n\
1443This is the same as (default-value 'fill-column).");
1444
1445 DEFVAR_LISP_NOPRO ("default-left-margin",
1446 &buffer_defaults.left_margin,
1447 "Default value of `left-margin' for buffers that do not override it.\n\
1448This is the same as (default-value 'left-margin).");
1449
1450 DEFVAR_LISP_NOPRO ("default-tab-width",
1451 &buffer_defaults.tab_width,
1452 "Default value of `tab-width' for buffers that do not override it.\n\
1453This is the same as (default-value 'tab-width).");
1454
1455 DEFVAR_LISP_NOPRO ("default-case-fold-search",
1456 &buffer_defaults.case_fold_search,
1457 "Default value of `case-fold-search' for buffers that don't override it.\n\
1458This is the same as (default-value 'case-fold-search).");
1459
0fa3ba92
JB
1460 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
1461 Qnil, 0);
1ab256cb
RM
1462
1463/* This doc string is too long for cpp; cpp dies if it isn't in a comment.
1464 But make-docfile finds it!
1465 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
1466 "Template for displaying mode line for current buffer.\n\
1467Each buffer has its own value of this variable.\n\
1468Value may be a string, a symbol or a list or cons cell.\n\
1469For a symbol, its value is used (but it is ignored if t or nil).\n\
1470 A string appearing directly as the value of a symbol is processed verbatim\n\
1471 in that the %-constructs below are not recognized.\n\
1472For a list whose car is a symbol, the symbol's value is taken,\n\
1473 and if that is non-nil, the cadr of the list is processed recursively.\n\
1474 Otherwise, the caddr of the list (if there is one) is processed.\n\
1475For a list whose car is a string or list, each element is processed\n\
1476 recursively and the results are effectively concatenated.\n\
1477For a list whose car is an integer, the cdr of the list is processed\n\
1478 and padded (if the number is positive) or truncated (if negative)\n\
1479 to the width specified by that number.\n\
1480A string is printed verbatim in the mode line except for %-constructs:\n\
1481 (%-constructs are allowed when the string is the entire mode-line-format\n\
1482 or when it is found in a cons-cell or a list)\n\
1483 %b -- print buffer name. %f -- print visited file name.\n\
1484 %* -- print *, % or hyphen. %m -- print value of mode-name (obsolete).\n\
1485 %s -- print process status. %M -- print value of global-mode-string. (obs)\n\
1486 %p -- print percent of buffer above top of window, or top, bot or all.\n\
1487 %n -- print Narrow if appropriate.\n\
1488 %[ -- print one [ for each recursive editing level. %] similar.\n\
1489 %% -- print %. %- -- print infinitely many dashes.\n\
1490Decimal digits after the % specify field width to which to pad.");
1491*/
1492
1493 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode,
1494 "*Major mode for new buffers. Defaults to `fundamental-mode'.\n\
1495nil here means use current buffer's major mode.");
1496
1497 DEFVAR_PER_BUFFER ("major-mode", &current_buffer->major_mode,
0fa3ba92 1498 make_number (Lisp_Symbol),
1ab256cb
RM
1499 "Symbol for current buffer's major mode.");
1500
1501 DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
0fa3ba92 1502 make_number (Lisp_String),
1ab256cb
RM
1503 "Pretty name of current buffer's major mode (a string).");
1504
0fa3ba92 1505 DEFVAR_PER_BUFFER ("abbrev-mode", &current_buffer->abbrev_mode, Qnil,
1ab256cb
RM
1506 "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\
1507Automatically becomes buffer-local when set in any fashion.");
1508
1509 DEFVAR_PER_BUFFER ("case-fold-search", &current_buffer->case_fold_search,
0fa3ba92 1510 Qnil,
1ab256cb
RM
1511 "*Non-nil if searches should ignore case.\n\
1512Automatically becomes buffer-local when set in any fashion.");
1513
1514 DEFVAR_PER_BUFFER ("fill-column", &current_buffer->fill_column,
0fa3ba92 1515 make_number (Lisp_Int),
1ab256cb
RM
1516 "*Column beyond which automatic line-wrapping should happen.\n\
1517Automatically becomes buffer-local when set in any fashion.");
1518
1519 DEFVAR_PER_BUFFER ("left-margin", &current_buffer->left_margin,
0fa3ba92 1520 make_number (Lisp_Int),
1ab256cb
RM
1521 "*Column for the default indent-line-function to indent to.\n\
1522Linefeed indents to this column in Fundamental mode.\n\
1523Automatically becomes buffer-local when set in any fashion.");
1524
1525 DEFVAR_PER_BUFFER ("tab-width", &current_buffer->tab_width,
0fa3ba92 1526 make_number (Lisp_Int),
1ab256cb
RM
1527 "*Distance between tab stops (for display of tab characters), in columns.\n\
1528Automatically becomes buffer-local when set in any fashion.");
1529
0fa3ba92 1530 DEFVAR_PER_BUFFER ("ctl-arrow", &current_buffer->ctl_arrow, Qnil,
1ab256cb
RM
1531 "*Non-nil means display control chars with uparrow.\n\
1532Nil means use backslash and octal digits.\n\
1533Automatically becomes buffer-local when set in any fashion.\n\
1534This variable does not apply to characters whose display is specified\n\
1535in the current display table (if there is one).");
1536
0fa3ba92 1537 DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
1ab256cb
RM
1538 "*Non-nil means do not display continuation lines;\n\
1539give each line of text one screen line.\n\
1540Automatically becomes buffer-local when set in any fashion.\n\
1541\n\
1542Note that this is overridden by the variable\n\
1543`truncate-partial-width-windows' if that variable is non-nil\n\
502b9b64 1544and this buffer is not full-frame width.");
1ab256cb
RM
1545
1546 DEFVAR_PER_BUFFER ("default-directory", &current_buffer->directory,
0fa3ba92 1547 make_number (Lisp_String),
1ab256cb
RM
1548 "Name of default directory of current buffer. Should end with slash.\n\
1549Each buffer has its own value of this variable.");
1550
1551 DEFVAR_PER_BUFFER ("auto-fill-function", &current_buffer->auto_fill_function,
0fa3ba92 1552 Qnil,
1ab256cb
RM
1553 "Function called (if non-nil) to perform auto-fill.\n\
1554It is called after self-inserting a space at a column beyond `fill-column'.\n\
1555Each buffer has its own value of this variable.\n\
1556NOTE: This variable is not an ordinary hook;\n\
1557It may not be a list of functions.");
1558
1559 DEFVAR_PER_BUFFER ("buffer-file-name", &current_buffer->filename,
0fa3ba92 1560 make_number (Lisp_String),
1ab256cb
RM
1561 "Name of file visited in current buffer, or nil if not visiting a file.\n\
1562Each buffer has its own value of this variable.");
1563
1564 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
3f5fcd47 1565 &current_buffer->auto_save_file_name,
0fa3ba92 1566 make_number (Lisp_String),
1ab256cb
RM
1567 "Name of file for auto-saving current buffer,\n\
1568or nil if buffer should not be auto-saved.\n\
1569Each buffer has its own value of this variable.");
1570
0fa3ba92 1571 DEFVAR_PER_BUFFER ("buffer-read-only", &current_buffer->read_only, Qnil,
1ab256cb
RM
1572 "Non-nil if this buffer is read-only.\n\
1573Each buffer has its own value of this variable.");
1574
0fa3ba92 1575 DEFVAR_PER_BUFFER ("buffer-backed-up", &current_buffer->backed_up, Qnil,
1ab256cb
RM
1576 "Non-nil if this buffer's file has been backed up.\n\
1577Backing up is done before the first time the file is saved.\n\
1578Each buffer has its own value of this variable.");
1579
1580 DEFVAR_PER_BUFFER ("buffer-saved-size", &current_buffer->save_length,
0fa3ba92 1581 make_number (Lisp_Int),
1ab256cb
RM
1582 "Length of current buffer when last read in, saved or auto-saved.\n\
15830 initially.\n\
1584Each buffer has its own value of this variable.");
1585
1586 DEFVAR_PER_BUFFER ("selective-display", &current_buffer->selective_display,
0fa3ba92 1587 Qnil,
1ab256cb
RM
1588 "Non-nil enables selective display:\n\
1589Integer N as value means display only lines\n\
1590 that start with less than n columns of space.\n\
1591A value of t means, after a ^M, all the rest of the line is invisible.\n\
1592 Then ^M's in the file are written into files as newlines.\n\n\
1593Automatically becomes buffer-local when set in any fashion.");
1594
1595#ifndef old
1596 DEFVAR_PER_BUFFER ("selective-display-ellipses",
1597 &current_buffer->selective_display_ellipses,
0fa3ba92 1598 Qnil,
1ab256cb
RM
1599 "t means display ... on previous line when a line is invisible.\n\
1600Automatically becomes buffer-local when set in any fashion.");
1601#endif
1602
0fa3ba92 1603 DEFVAR_PER_BUFFER ("overwrite-mode", &current_buffer->overwrite_mode, Qnil,
1ab256cb
RM
1604 "Non-nil if self-insertion should replace existing text.\n\
1605Automatically becomes buffer-local when set in any fashion.");
1606
1607 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
5d305367 1608 Qnil,
1ab256cb
RM
1609 "Display table that controls display of the contents of current buffer.\n\
1610Automatically becomes buffer-local when set in any fashion.\n\
1611The display table is a vector created with `make-display-table'.\n\
1612The first 256 elements control how to display each possible text character.\n\
1613The value should be a \"rope\" (see `make-rope') or nil;\n\
1614nil means display the character in the default fashion.\n\
1615The remaining five elements are ropes that control the display of\n\
1616 the end of a truncated screen line (element 256);\n\
1617 the end of a continued line (element 257);\n\
1618 the escape character used to display character codes in octal (element 258);\n\
1619 the character used as an arrow for control characters (element 259);\n\
1620 the decoration indicating the presence of invisible lines (element 260).\n\
1621If this variable is nil, the value of `standard-display-table' is used.\n\
1622Each window can have its own, overriding display table.");
1623
3f5fcd47 1624 DEFVAR_PER_BUFFER ("buffer-field-list", &current_buffer->fieldlist, Qnil,
1ab256cb
RM
1625 "List of fields in the current buffer. See `add-field'.");
1626
1627 DEFVAR_BOOL ("check-protected-fields", check_protected_fields,
1628 "Non-nil means don't allow modification of a protected field.\n\
1629See `add-field'.");
1630 check_protected_fields = 0;
1631
1632/*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
1633 "Don't ask.");
1634*/
01050cb5 1635 DEFVAR_LISP ("before-change-function", &Vbefore_change_function,
1ab256cb
RM
1636 "Function to call before each text change.\n\
1637Two arguments are passed to the function: the positions of\n\
1638the beginning and end of the range of old text to be changed.\n\
1639\(For an insertion, the beginning and end are at the same place.)\n\
1640No information is given about the length of the text after the change.\n\
1641position of the change\n\
1642\n\
1643While executing the `before-change-function', changes to buffers do not\n\
1644cause calls to any `before-change-function' or `after-change-function'.");
1645 Vbefore_change_function = Qnil;
1646
1647 DEFVAR_LISP ("after-change-function", &Vafter_change_function,
1648 "Function to call after each text change.\n\
1649Three arguments are passed to the function: the positions of\n\
1650the beginning and end of the range of changed text,\n\
1651and the length of the pre-change text replaced by that range.\n\
1652\(For an insertion, the pre-change length is zero;\n\
1653for a deletion, that length is the number of characters deleted,\n\
1654and the post-change beginning and end are at the same place.)\n\
1655\n\
1656While executing the `after-change-function', changes to buffers do not\n\
1657cause calls to any `before-change-function' or `after-change-function'.");
1658 Vafter_change_function = Qnil;
1659
dbc4e1c1
JB
1660 DEFVAR_LISP ("first-change-hook", &Vfirst_change_hook,
1661 "A list of functions to call before changing a buffer which is unmodified.\n\
1662The functions are run using the `run-hooks' function.");
1663 Vfirst_change_hook = Qnil;
1664 Qfirst_change_hook = intern ("first-change-hook");
1665 staticpro (&Qfirst_change_hook);
1ab256cb 1666
3f5fcd47 1667 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list, Qnil,
1ab256cb
RM
1668 "List of undo entries in current buffer.\n\
1669Recent changes come first; older changes follow newer.\n\
1670\n\
1671An entry (START . END) represents an insertion which begins at\n\
1672position START and ends at position END.\n\
1673\n\
1674An entry (TEXT . POSITION) represents the deletion of the string TEXT\n\
1675from (abs POSITION). If POSITION is positive, point was at the front\n\
1676of the text being deleted; if negative, point was at the end.\n\
1677\n\
1678An entry (t HIGHWORD LOWWORD) indicates that the buffer had been\n\
1679previously unmodified. HIGHWORD and LOWWORD are the high and low\n\
168016-bit words of the buffer's modification count at the time. If the\n\
1681modification count of the most recent save is different, this entry is\n\
1682obsolete.\n\
1683\n\
1684nil marks undo boundaries. The undo command treats the changes\n\
1685between two undo boundaries as a single step to be undone.\n\
1686\n\
1687If the value of the variable is t, undo information is not recorded.\n\
1688");
1689
1690 defsubr (&Sbuffer_list);
1691 defsubr (&Sget_buffer);
1692 defsubr (&Sget_file_buffer);
1693 defsubr (&Sget_buffer_create);
01050cb5 1694 defsubr (&Sgenerate_new_buffer_name);
1ab256cb
RM
1695 defsubr (&Sbuffer_name);
1696/*defsubr (&Sbuffer_number);*/
1697 defsubr (&Sbuffer_file_name);
1698 defsubr (&Sbuffer_local_variables);
1699 defsubr (&Sbuffer_modified_p);
1700 defsubr (&Sset_buffer_modified_p);
1701 defsubr (&Sbuffer_modified_tick);
1702 defsubr (&Srename_buffer);
1703 defsubr (&Sother_buffer);
1704 defsubr (&Sbuffer_disable_undo);
1705 defsubr (&Sbuffer_enable_undo);
1706 defsubr (&Skill_buffer);
1707 defsubr (&Serase_buffer);
1708 defsubr (&Sswitch_to_buffer);
1709 defsubr (&Spop_to_buffer);
1710 defsubr (&Scurrent_buffer);
1711 defsubr (&Sset_buffer);
1712 defsubr (&Sbarf_if_buffer_read_only);
1713 defsubr (&Sbury_buffer);
1714 defsubr (&Slist_buffers);
1715 defsubr (&Skill_all_local_variables);
1716 defsubr (&Sregion_fields);
1717}
1718
1719keys_of_buffer ()
1720{
1721 initial_define_key (control_x_map, 'b', "switch-to-buffer");
1722 initial_define_key (control_x_map, 'k', "kill-buffer");
1723 initial_define_key (control_x_map, Ctl ('B'), "list-buffers");
1724}