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