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