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