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