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