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