1 /* Buffer manipulation primitives for GNU Emacs.
2 Copyright (C) 1985, 1986, 1987, 1988, 1989 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)
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>
24 /* in 4.1, param.h fails to define this. */
25 #define MAXPATHLEN 1024
26 #endif /* not MAXPATHLEN */
39 struct buffer
*current_buffer
; /* the current buffer */
41 /* First buffer in chain of all buffers (in reverse order of creation).
42 Threaded through ->next. */
44 struct buffer
*all_buffers
;
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. */
53 struct buffer buffer_defaults
;
55 /* A Lisp_Object pointer to the above, used for staticpro */
57 static Lisp_Object Vbuffer_defaults
;
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.
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.
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.
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.
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.
79 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is
80 zero, that is a bug */
82 struct buffer buffer_local_flags
;
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. */
87 struct buffer buffer_local_symbols
;
88 /* A Lisp_Object pointer to the above, used for staticpro */
89 static Lisp_Object Vbuffer_local_symbols
;
91 /* Nonzero means don't allow modification of protected fields. */
93 int check_protected_fields
;
95 Lisp_Object
Fset_buffer ();
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. */
100 Lisp_Object Vbuffer_alist
;
102 /* Functions to call before and after each text change. */
103 Lisp_Object Vbefore_change_function
;
104 Lisp_Object Vafter_change_function
;
106 /* Function to call before changing an unmodified buffer. */
107 Lisp_Object Vfirst_change_function
;
109 Lisp_Object Qfundamental_mode
, Qmode_class
, Qpermanent_local
;
111 Lisp_Object Qprotected_field
;
113 Lisp_Object QSFundamental
; /* A string "Fundamental" */
115 Lisp_Object Qkill_buffer_hook
;
117 /* For debugging; temporary. See set_buffer_internal. */
118 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */
123 if (XTYPE (spec
) == Lisp_String
)
124 error ("No buffer named %s", XSTRING (spec
)->data
);
125 error ("Invalid buffer argument");
128 DEFUN ("buffer-list", Fbuffer_list
, Sbuffer_list
, 0, 0, 0,
129 "Return a list of all existing live buffers.")
132 return Fmapcar (Qcdr
, Vbuffer_alist
);
135 DEFUN ("get-buffer", Fget_buffer
, Sget_buffer
, 1, 1, 0,
136 "Return the buffer named NAME (a string).\n\
137 If there is no live buffer named NAME, return nil.\n\
138 NAME may also be a buffer; if so, the value is that buffer.")
140 register Lisp_Object name
;
142 if (XTYPE (name
) == Lisp_Buffer
)
144 CHECK_STRING (name
, 0);
146 return Fcdr (Fassoc (name
, Vbuffer_alist
));
149 DEFUN ("get-file-buffer", Fget_file_buffer
, Sget_file_buffer
, 1, 1, 0,
150 "Return the buffer visiting file FILENAME (a string).\n\
151 If there is no such live buffer, return nil.")
153 register Lisp_Object filename
;
155 register Lisp_Object tail
, buf
, tem
;
156 CHECK_STRING (filename
, 0);
157 filename
= Fexpand_file_name (filename
, Qnil
);
159 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
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
);
171 /* Incremented for each buffer created, to assign the buffer number. */
174 DEFUN ("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\
176 A new buffer is created if there is no live buffer named NAME.\n\
177 If NAME is a buffer instead of a string, then it is the value returned.\n\
178 The value is never nil.")
180 register Lisp_Object name
;
182 register Lisp_Object buf
, function
, tem
;
183 int count
= specpdl_ptr
- specpdl
;
184 register struct buffer
*b
;
186 buf
= Fget_buffer (name
);
190 b
= (struct buffer
*) malloc (sizeof (struct buffer
));
194 BUF_GAP_SIZE (b
) = 20;
195 BUFFER_ALLOC (BUF_BEG_ADDR (b
), BUF_GAP_SIZE (b
));
196 if (! BUF_BEG_ADDR (b
))
206 /* Put this on the chain of all buffers including killed ones. */
207 b
->next
= all_buffers
;
210 b
->mark
= Fmake_marker ();
211 /*b->number = make_number (++buffer_count);*/
213 if (XSTRING (name
)->data
[0] != ' ')
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
));
224 b
->mark
= Fmake_marker ();
228 function
= buffer_defaults
.major_mode
;
231 tem
= Fget (current_buffer
->major_mode
, Qmode_class
);
233 function
= current_buffer
->major_mode
;
236 if (NULL (function
) || EQ (function
, Qfundamental_mode
))
239 /* To select a nonfundamental mode,
240 select the buffer temporarily and then call the mode function. */
242 record_unwind_protect (save_excursion_restore
, save_excursion_save ());
247 return unbind_to (count
, buf
);
250 /* Reinitialize everything about a buffer except its name and contents. */
254 register struct buffer
*b
;
257 b
->directory
= (current_buffer
) ? current_buffer
->directory
: Qnil
;
259 b
->save_modified
= 1;
261 b
->last_window_start
= 1;
263 b
->auto_save_modified
= 0;
264 b
->auto_save_file_name
= Qnil
;
267 reset_buffer_local_variables(b
);
270 reset_buffer_local_variables(b
)
271 register struct buffer
*b
;
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
;
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
;
289 b
->sort_table
= XSTRING (Vascii_sort_table
);
290 b
->folding_sort_table
= XSTRING (Vascii_folding_sort_table
);
293 /* Reset all per-buffer variables to their defaults. */
294 b
->local_var_alist
= Qnil
;
295 b
->local_var_flags
= 0;
297 /* For each slot that has a default value,
298 copy that into the slot. */
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
);
309 DEFUN ("generate-new-buffer", Fgenerate_new_buffer
, Sgenerate_new_buffer
,
311 "Create and return a buffer with a name based on NAME.\n\
312 If there is no live buffer named NAME, then one is created.\n\
313 Otherwise modify name by appending `<NUMBER>', incrementing NUMBER\n\
314 until an unused name is found, and then create a buffer.")
316 register Lisp_Object name
;
318 register Lisp_Object gentemp
, tem
;
322 CHECK_STRING (name
, 0);
324 tem
= Fget_buffer (name
);
326 return Fget_buffer_create (name
);
331 sprintf (number
, "<%d>", ++count
);
332 gentemp
= concat2 (name
, build_string (number
));
333 tem
= Fget_buffer (gentemp
);
335 return Fget_buffer_create (gentemp
);
340 DEFUN ("buffer-name", Fbuffer_name
, Sbuffer_name
, 0, 1, 0,
341 "Return the name of BUFFER, as a string.\n\
342 Wyth no argument or nil as argument, return the name of the current buffer.")
344 register Lisp_Object buffer
;
347 return current_buffer
->name
;
348 CHECK_BUFFER (buffer
, 0);
349 return XBUFFER (buffer
)->name
;
352 DEFUN ("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\
354 No argument or nil as argument means use the current buffer.")
356 register Lisp_Object buffer
;
359 return current_buffer
->filename
;
360 CHECK_BUFFER (buffer
, 0);
361 return XBUFFER (buffer
)->filename
;
364 DEFUN ("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\
367 Each element looks like (SYMBOL . VALUE) and describes one variable.\n\
368 Note that storing new VALUEs in these elements doesn't change the variables.\n\
369 No argument or nil as argument means use current buffer as BUFFER.")
371 register Lisp_Object buffer
;
373 register struct buffer
*buf
;
374 register Lisp_Object val
;
377 buf
= current_buffer
;
380 CHECK_BUFFER (buffer
, 0);
381 buf
= XBUFFER (buffer
);
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
)
393 Lisp_Object v1
= Fsymbol_value (XCONS (XCONS (tem
)->car
)->car
);
394 if (buf
== current_buffer
)
395 XCONS (XCONS (tem
)->car
)->cdr
= v1
;
399 /* Make a copy of the alist, to return it. */
400 val
= Fcopy_alist (buf
->local_var_alist
);
402 /* Add on all the variables stored in special slots. */
404 register int offset
, mask
;
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 */
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
))
414 val
= Fcons (Fcons (*(Lisp_Object
*)(offset
+ (char *)&buffer_local_symbols
),
415 *(Lisp_Object
*)(offset
+ (char *)buf
)),
423 DEFUN ("buffer-modified-p", Fbuffer_modified_p
, Sbuffer_modified_p
,
425 "Return t if BUFFER was modified since its file was last read or saved.\n\
426 No argument or nil as argument means use current buffer as BUFFER.")
428 register Lisp_Object buffer
;
430 register struct buffer
*buf
;
432 buf
= current_buffer
;
435 CHECK_BUFFER (buffer
, 0);
436 buf
= XBUFFER (buffer
);
439 return buf
->save_modified
< BUF_MODIFF (buf
) ? Qt
: Qnil
;
442 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p
, Sset_buffer_modified_p
,
444 "Mark current buffer as modified or unmodified according to FLAG.\n\
445 A non-nil FLAG means mark the buffer modified.")
447 register Lisp_Object flag
;
449 register int already
;
450 register Lisp_Object fn
;
452 #ifdef CLASH_DETECTION
453 /* If buffer becoming modified, lock the file.
454 If buffer becoming unmodified, unlock the file. */
456 fn
= current_buffer
->filename
;
459 already
= current_buffer
->save_modified
< MODIFF
;
460 if (!already
&& !NULL (flag
))
462 else if (already
&& NULL (flag
))
465 #endif /* CLASH_DETECTION */
467 current_buffer
->save_modified
= NULL (flag
) ? MODIFF
: 0;
472 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick
, Sbuffer_modified_tick
,
474 "Return BUFFER's tick counter, incremented for each change in text.\n\
475 Each buffer has a tick counter which is incremented each time the text in\n\
476 that buffer is changed. It wraps around occasionally.\n\
477 No argument or nil as argument means use current buffer as BUFFER.")
479 register Lisp_Object buffer
;
481 register struct buffer
*buf
;
483 buf
= current_buffer
;
486 CHECK_BUFFER (buffer
, 0);
487 buf
= XBUFFER (buffer
);
490 return make_number (BUF_MODIFF (buf
));
493 DEFUN ("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\
496 It is an error if a buffer named NEWNAME already exists.\n\
497 This does not change the name of the visited file (if any).")
499 register Lisp_Object name
;
501 register Lisp_Object tem
, buf
;
503 CHECK_STRING (name
, 0);
504 tem
= Fget_buffer (name
);
506 error ("Buffer name \"%s\" is in use", XSTRING (name
)->data
);
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"));
516 DEFUN ("other-buffer", Fother_buffer
, Sother_buffer
, 0, 1, 0,
517 "Return most recently selected buffer other than BUFFER.\n\
518 Buffers not visible in windows are preferred to visible buffers.\n\
519 If no other buffer exists, the buffer `*scratch*' is returned.\n\
520 If BUFFER is omitted or nil, some interesting buffer is returned.")
522 register Lisp_Object buffer
;
524 register Lisp_Object tail
, buf
, notsogood
, tem
;
527 for (tail
= Vbuffer_alist
; !NULL (tail
); tail
= Fcdr (tail
))
529 buf
= Fcdr (Fcar (tail
));
530 if (EQ (buf
, buffer
))
532 if (XSTRING (XBUFFER (buf
)->name
)->data
[0] == ' ')
534 tem
= Fget_buffer_window (buf
, Qnil
);
537 if (NULL (notsogood
))
540 if (!NULL (notsogood
))
542 return Fget_buffer_create (build_string ("*scratch*"));
545 DEFUN ("buffer-disable-undo", Fbuffer_disable_undo
, Sbuffer_disable_undo
, 1,1,
547 "Make BUFFER stop keeping undo information.")
549 register Lisp_Object buf
;
551 CHECK_BUFFER (buf
, 0);
552 XBUFFER (buf
)->undo_list
= Qt
;
556 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo
, Sbuffer_enable_undo
,
558 "Start keeping undo information for buffer BUFFER.\n\
559 No argument or nil as argument means do this for the current buffer.")
561 register Lisp_Object buf
;
563 register struct buffer
*b
;
564 register Lisp_Object buf1
;
570 buf1
= Fget_buffer (buf
);
571 if (NULL (buf1
)) nsberror (buf
);
575 if (EQ (b
->undo_list
, Qt
))
582 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
583 Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
584 The buffer being killed will be current while the hook is running.\n\
587 DEFUN ("kill-buffer", Fkill_buffer
, Skill_buffer
, 1, 1, "bKill buffer: ",
588 "Kill the buffer BUFFER.\n\
589 The argument may be a buffer or may be the name of a buffer.\n\
590 An argument of nil means kill the current buffer.\n\n\
591 Value is t if the buffer is actually killed, nil if user says no.\n\n\
592 The value of `kill-buffer-hook' (which may be local to that buffer),\n\
593 if not void, is a list of functions to be called, with no arguments,\n\
594 before the buffer is actually killed. The buffer to be killed is current\n\
595 when the hook functions are called.\n\n\
596 Any processes that have this buffer as the `process-buffer' are killed\n\
597 with `delete-process'.")
602 register struct buffer
*b
;
603 register Lisp_Object tem
;
604 register struct Lisp_Marker
*m
;
605 struct gcpro gcpro1
, gcpro2
;
608 buf
= Fcurrent_buffer ();
610 buf
= Fget_buffer (bufname
);
616 /* Query if the buffer is still modified. */
617 if (INTERACTIVE
&& !NULL (b
->filename
)
618 && BUF_MODIFF (b
) > b
->save_modified
)
620 GCPRO2 (buf
, bufname
);
621 tem
= do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
622 XSTRING (b
->name
)->data
));
628 /* Run kill-buffer hook with the buffer to be killed the current buffer. */
630 register Lisp_Object val
;
631 int count
= specpdl_ptr
- specpdl
;
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
);
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. */
643 /* Don't kill the minibuffer now current. */
644 if (EQ (buf
, XWINDOW (minibuf_window
)->buffer
))
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
)
655 tem
= Fother_buffer (buf
);
657 if (b
== current_buffer
)
661 /* Now there is no question: we can kill the buffer. */
663 #ifdef CLASH_DETECTION
664 /* Unlock this buffer's file, if it is locked. */
666 #endif /* CLASH_DETECTION */
669 kill_buffer_processes (buf
);
670 #endif /* subprocesses */
674 Vbuffer_alist
= Fdelq (Frassq (buf
, Vbuffer_alist
), Vbuffer_alist
);
675 Freplace_buffer_in_windows (buf
);
678 /* Delete any auto-save file. */
679 if (XTYPE (b
->auto_save_file_name
) == Lisp_String
)
682 tem
= Fsymbol_value (intern ("delete-auto-save-files"));
684 unlink (XSTRING (b
->auto_save_file_name
)->data
);
687 /* Unchain all markers of this buffer
688 and leave them pointing nowhere. */
689 for (tem
= b
->markers
; !EQ (tem
, Qnil
); )
699 BUFFER_FREE (BUF_BEG_ADDR (b
));
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. */
713 register Lisp_Object link
, prev
;
716 for (link
= Vbuffer_alist
; CONSP (link
); link
= XCONS (link
)->cdr
)
718 if (EQ (XCONS (XCONS (link
)->car
)->cdr
, buf
))
723 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist)
724 but cannot use Fdelq here it that allows quitting. */
727 Vbuffer_alist
= XCONS (Vbuffer_alist
)->cdr
;
729 XCONS (prev
)->cdr
= XCONS (XCONS (prev
)->cdr
)->cdr
;
731 XCONS(link
)->cdr
= Vbuffer_alist
;
732 Vbuffer_alist
= link
;
735 DEFUN ("switch-to-buffer", Fswitch_to_buffer
, Sswitch_to_buffer
, 1, 2, "BSwitch to buffer: ",
736 "Select buffer BUFFER in the current window.\n\
737 BUFFER may be a buffer or a buffer name.\n\
738 Optional second arg NORECORD non-nil means\n\
739 do not put this buffer at the front of the list of recently selected ones.\n\
741 WARNING: This is NOT the way to work on another buffer temporarily\n\
742 within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\
743 the window-buffer correspondences.")
745 Lisp_Object bufname
, norecord
;
747 register Lisp_Object buf
;
750 if (EQ (minibuf_window
, selected_window
))
751 error ("Cannot switch buffers in minibuffer window");
752 tem
= Fwindow_dedicated_p (selected_window
);
754 error ("Cannot switch buffers in a dedicated window");
757 buf
= Fother_buffer (Fcurrent_buffer ());
759 buf
= Fget_buffer_create (bufname
);
764 Fset_window_buffer (EQ (selected_window
, minibuf_window
)
765 ? Fnext_window (minibuf_window
, Qnil
) : selected_window
,
771 DEFUN ("pop-to-buffer", Fpop_to_buffer
, Spop_to_buffer
, 1, 2, 0,
772 "Select buffer BUFFER in some window, preferably a different one.\n\
773 If BUFFER is nil, then some other buffer is chosen.\n\
774 If `pop-up-windows' is non-nil, windows can be split to do this.\n\
775 If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
776 window even if BUFFER is already visible in the selected window.")
778 Lisp_Object bufname
, other
;
780 register Lisp_Object buf
;
782 buf
= Fother_buffer (Fcurrent_buffer ());
784 buf
= Fget_buffer_create (bufname
);
787 Fselect_window (Fdisplay_buffer (buf
, other
));
791 DEFUN ("current-buffer", Fcurrent_buffer
, Scurrent_buffer
, 0, 0, 0,
792 "Return the current buffer as a Lisp object.")
795 register Lisp_Object buf
;
796 XSET (buf
, Lisp_Buffer
, current_buffer
);
800 /* Set the current buffer to b */
803 set_buffer_internal (b
)
804 register struct buffer
*b
;
806 register struct buffer
*old_buf
;
807 register Lisp_Object tail
, valcontents
;
810 if (current_buffer
== b
)
813 windows_or_buffers_changed
= 1;
814 old_buf
= current_buffer
;
816 last_known_column_point
= -1; /* invalidate indentation cache */
818 /* Look down buffer's list of local Lisp variables
819 to find and update any that forward into C variables. */
821 for (tail
= b
->local_var_alist
; !NULL (tail
); tail
= XCONS (tail
)->cdr
)
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
);
834 /* Do the same with any others that were local to the previous buffer */
837 for (tail
= old_buf
->local_var_alist
; !NULL (tail
); tail
= XCONS (tail
)->cdr
)
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
);
851 DEFUN ("set-buffer", Fset_buffer
, Sset_buffer
, 1, 1, 0,
852 "Make the buffer BUFFER current for editing operations.\n\
853 BUFFER may be a buffer or the name of an existing buffer.\n\
854 See also `save-excursion' when you want to make a buffer current temporarily.\n\
855 This function does not display the buffer, so its effect ends\n\
856 when the current command terminates.\n\
857 Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
859 register Lisp_Object bufname
;
861 register Lisp_Object buffer
;
862 buffer
= Fget_buffer (bufname
);
865 if (NULL (XBUFFER (buffer
)->name
))
866 error ("Selecting deleted buffer");
867 set_buffer_internal (XBUFFER (buffer
));
871 DEFUN ("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.")
876 while (!NULL (current_buffer
->read_only
))
877 Fsignal (Qbuffer_read_only
, (Fcons (Fcurrent_buffer (), Qnil
)));
881 DEFUN ("bury-buffer", Fbury_buffer
, Sbury_buffer
, 0, 1, "",
882 "Put BUFFER at the end of the list of all buffers.\n\
883 There it is the least likely candidate for `other-buffer' to return;\n\
884 thus, the least likely buffer for \\[switch-to-buffer] to select by default.")
886 register Lisp_Object buf
;
888 register Lisp_Object aelt
, link
;
892 XSET (buf
, Lisp_Buffer
, current_buffer
);
893 Fswitch_to_buffer (Fother_buffer (buf
), Qnil
);
899 buf1
= Fget_buffer (buf
);
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
);
913 DEFUN ("erase-buffer", Ferase_buffer
, Serase_buffer
, 0, 0, 0,
914 "Delete the entire contents of the current buffer.\n\
915 Any clipping restriction in effect (see `narrow-to-buffer') is removed,\n\
916 so the buffer is truly empty after this.")
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;
929 validate_region (b
, e
)
930 register Lisp_Object
*b
, *e
;
934 CHECK_NUMBER_COERCE_MARKER (*b
, 0);
935 CHECK_NUMBER_COERCE_MARKER (*e
, 1);
937 if (XINT (*b
) > XINT (*e
))
939 i
= XFASTINT (*b
); /* This is legit even if *b is < 0 */
941 XFASTINT (*e
) = i
; /* because this is all we do with i. */
944 if (!(BEGV
<= XINT (*b
) && XINT (*b
) <= XINT (*e
)
946 args_out_of_range (*b
, *e
);
950 list_buffers_1 (files
)
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
;
959 other_file_symbol
= intern ("list-buffers-directory");
961 XFASTINT (col1
) = 19;
962 XFASTINT (col2
) = 25;
963 XFASTINT (col3
) = 40;
964 XFASTINT (minspace
) = 1;
966 Fset_buffer (Vstandard_output
);
968 tail
= intern ("Buffer-menu-mode");
969 if (!EQ (tail
, current_buffer
->major_mode
)
970 && (tem
= Ffboundp (tail
), !NULL (tem
)))
972 Fbuffer_disable_undo (Vstandard_output
);
973 current_buffer
->read_only
= Qnil
;
976 MR Buffer Size Mode File\n\
977 -- ------ ---- ---- ----\n", -1);
979 for (tail
= Vbuffer_alist
; !NULL (tail
); tail
= Fcdr (tail
))
981 buf
= Fcdr (Fcar (tail
));
983 /* Don't mention the minibuffers. */
984 if (XSTRING (b
->name
)->data
[0] == ' ')
986 /* Optionally don't mention buffers that lack files. */
987 if (!NULL (files
) && NULL (b
->filename
))
989 /* Identify the current buffer. */
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
);
1000 Findent_to (col2
, minspace
);
1001 Fprinc (b
->mode_name
, Qnil
);
1002 Findent_to (col3
, minspace
);
1004 if (!NULL (b
->filename
))
1005 Fprinc (b
->filename
, Qnil
);
1008 /* No visited file; check local value of list-buffers-directory. */
1010 set_buffer_internal (b
);
1011 tem
= Fboundp (other_file_symbol
);
1014 tem
= Fsymbol_value (other_file_symbol
);
1015 Fset_buffer (Vstandard_output
);
1016 if (XTYPE (tem
) == Lisp_String
)
1020 Fset_buffer (Vstandard_output
);
1022 write_string ("\n", -1);
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
1029 XBUFFER (Vstandard_output)->text.pointloc = desired_point;
1034 DEFUN ("list-buffers", Flist_buffers
, Slist_buffers
, 0, 1, "P",
1035 "Display a list of names of existing buffers.\n\
1036 The list is displayed in a buffer named `*Buffer List*'.\n\
1037 Note that buffers with names starting with spaces are omitted.\n\
1038 Non-null optional arg FILES-ONLY means mention only file buffers.\n\
1040 The M column contains a * for buffers that are modified.\n\
1041 The R column contains a % for buffers that are read-only.")
1045 internal_with_output_to_temp_buffer ("*Buffer List*",
1046 list_buffers_1
, files
);
1050 DEFUN ("kill-all-local-variables", Fkill_all_local_variables
, Skill_all_local_variables
,
1052 "Switch to Fundamental mode by killing current buffer's local variables.\n\
1053 Most local variable bindings are eliminated so that the default values\n\
1054 become effective once more. Also, the syntax table is set from\n\
1055 `standard-syntax-table', the local keymap is set to nil,\n\
1056 and the abbrev table from `fundamental-mode-abbrev-table'.\n\
1057 This function also forces redisplay of the mode line.\n\
1059 Every function to select a new major mode starts by\n\
1060 calling this function.\n\n\
1061 As a special exception, local variables whose names have\n\
1062 a non-nil `permanent-local' property are not eliminated by this function.")
1065 register Lisp_Object alist
, sym
, tem
;
1067 oalist
= current_buffer
->local_var_alist
;
1069 /* Make sure no local variables remain set up with this buffer
1070 for their current values. */
1072 for (alist
= oalist
; !NULL (alist
); alist
= XCONS (alist
)->cdr
)
1074 sym
= XCONS (XCONS (alist
)->car
)->car
;
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
)
1080 /* Symbol is set up for this buffer's old local value.
1081 Set it up for the current buffer with the default value. */
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
,
1091 /* Actually eliminate all local bindings of this buffer. */
1093 reset_buffer_local_variables (current_buffer
);
1095 /* Redisplay mode lines; we are changing major mode. */
1097 update_mode_lines
++;
1099 /* Any which are supposed to be permanent,
1100 make local again, with the same values they had. */
1102 for (alist
= oalist
; !NULL (alist
); alist
= XCONS (alist
)->cdr
)
1104 sym
= XCONS (XCONS (alist
)->car
)->car
;
1105 tem
= Fget (sym
, Qpermanent_local
);
1107 Fmake_local_variable (sym
, XCONS (XCONS (alist
)->car
)->cdr
);
1110 /* Force mode-line redisplay. Useful here because all major mode
1111 commands call this function. */
1112 update_mode_lines
++;
1117 DEFUN ("region-fields", Fregion_fields
, Sregion_fields
, 2, 4, "",
1118 "Return list of fields overlapping a given portion of a buffer.\n\
1119 The portion is specified by arguments START, END and BUFFER.\n\
1120 BUFFER defaults to the current buffer.\n\
1121 Optional 4th arg ERROR-CHECK non nil means just report an error\n\
1122 if any protected fields overlap this portion.")
1123 (start
, end
, buffer
, error_check
)
1124 Lisp_Object start
, end
, buffer
, error_check
;
1126 register int start_loc
, end_loc
;
1127 Lisp_Object fieldlist
;
1128 Lisp_Object collector
;
1131 fieldlist
= current_buffer
->fieldlist
;
1134 CHECK_BUFFER (buffer
, 1);
1135 fieldlist
= XBUFFER (buffer
)->fieldlist
;
1138 CHECK_NUMBER_COERCE_MARKER (start
, 2);
1139 start_loc
= XINT (start
);
1141 CHECK_NUMBER_COERCE_MARKER (end
, 2);
1142 end_loc
= XINT (end
);
1146 while (XTYPE (fieldlist
) == Lisp_Cons
)
1148 register Lisp_Object field
;
1149 register int field_start
, field_end
;
1151 field
= XCONS (fieldlist
)->car
;
1152 field_start
= marker_position (FIELD_START_MARKER (field
)) - 1;
1153 field_end
= marker_position (FIELD_END_MARKER (field
));
1155 if ((start_loc
< field_start
&& end_loc
> field_start
)
1156 || (start_loc
>= field_start
&& start_loc
< field_end
))
1158 if (!NULL (error_check
))
1160 if (!NULL (FIELD_PROTECTED_FLAG (field
)))
1162 struct gcpro gcpro1
;
1164 Fsignal (Qprotected_field
, Fcons (field
, Qnil
));
1169 collector
= Fcons (field
, collector
);
1172 fieldlist
= XCONS (fieldlist
)->cdr
;
1180 register Lisp_Object tem
;
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
);
1189 /* Set up the default values of various buffer slots. */
1190 /* Must do these before making the first buffer! */
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
;
1200 buffer_defaults
.selective_display_ellipses
= Qt
;
1202 buffer_defaults
.abbrev_table
= Qnil
;
1203 buffer_defaults
.display_table
= Qnil
;
1204 buffer_defaults
.fieldlist
= Qnil
;
1205 buffer_defaults
.undo_list
= Qnil
;
1207 XFASTINT (buffer_defaults
.tab_width
) = 8;
1208 buffer_defaults
.truncate_lines
= Qnil
;
1209 buffer_defaults
.ctl_arrow
= Qt
;
1211 XFASTINT (buffer_defaults
.fill_column
) = 70;
1212 XFASTINT (buffer_defaults
.left_margin
) = 0;
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. */
1219 /* Nothing can work if this isn't true */
1220 if (sizeof (int) != sizeof (Lisp_Object
)) abort ();
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;
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;
1241 XFASTINT (buffer_local_flags
.selective_display_ellipses
) = 0x40;
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;
1253 Vbuffer_alist
= Qnil
;
1257 QSFundamental
= build_string ("Fundamental");
1259 Qfundamental_mode
= intern ("fundamental-mode");
1260 buffer_defaults
.major_mode
= Qfundamental_mode
;
1262 Qmode_class
= intern ("mode-class");
1264 Qprotected_field
= intern ("protected-field");
1266 Qpermanent_local
= intern ("permanent-local");
1268 Qkill_buffer_hook
= intern ("kill-buffer-hook");
1270 Vprin1_to_string_buffer
= Fget_buffer_create (build_string (" prin1"));
1271 /* super-magic invisible buffer */
1272 Vbuffer_alist
= Qnil
;
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
);
1282 char buf
[MAXPATHLEN
+1];
1284 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1285 if (getwd (buf
) == 0)
1286 fatal ("`getwd' failed: %s.\n", buf
);
1289 /* Maybe this should really use some standard subroutine
1290 whose definition is filename syntax dependent. */
1291 if (buf
[strlen (buf
) - 1] != '/')
1293 #endif /* not VMS */
1294 current_buffer
->directory
= build_string (buf
);
1297 /* initialize the buffer routines */
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
);
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"));
1315 /* All these use DEFVAR_LISP_NOPRO because the slots in
1316 buffer_defaults will all be marked via Vbuffer_defaults. */
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\
1321 This is the same as (default-value 'mode-line-format).");
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\
1326 This is the same as (default-value 'abbrev-mode).");
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\
1331 This is the same as (default-value 'ctl-arrow).");
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\
1336 This is the same as (default-value 'truncate-lines).");
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\
1341 This is the same as (default-value 'fill-column).");
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\
1346 This is the same as (default-value 'left-margin).");
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\
1351 This is the same as (default-value 'tab-width).");
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\
1356 This is the same as (default-value 'case-fold-search).");
1358 DEFVAR_PER_BUFFER ("mode-line-format", ¤t_buffer
->mode_line_format
, 0);
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", ¤t_buffer->mode_line_format,
1363 "Template for displaying mode line for current buffer.\n\
1364 Each buffer has its own value of this variable.\n\
1365 Value may be a string, a symbol or a list or cons cell.\n\
1366 For 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\
1369 For 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\
1372 For a list whose car is a string or list, each element is processed\n\
1373 recursively and the results are effectively concatenated.\n\
1374 For 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\
1377 A 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\
1387 Decimal digits after the % specify field width to which to pad.");
1390 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults
.major_mode
,
1391 "*Major mode for new buffers. Defaults to `fundamental-mode'.\n\
1392 nil here means use current buffer's major mode.");
1394 DEFVAR_PER_BUFFER ("major-mode", ¤t_buffer
->major_mode
,
1395 "Symbol for current buffer's major mode.");
1397 DEFVAR_PER_BUFFER ("mode-name", ¤t_buffer
->mode_name
,
1398 "Pretty name of current buffer's major mode (a string).");
1400 DEFVAR_PER_BUFFER ("abbrev-mode", ¤t_buffer
->abbrev_mode
,
1401 "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\
1402 Automatically becomes buffer-local when set in any fashion.");
1404 DEFVAR_PER_BUFFER ("case-fold-search", ¤t_buffer
->case_fold_search
,
1405 "*Non-nil if searches should ignore case.\n\
1406 Automatically becomes buffer-local when set in any fashion.");
1408 DEFVAR_PER_BUFFER ("fill-column", ¤t_buffer
->fill_column
,
1409 "*Column beyond which automatic line-wrapping should happen.\n\
1410 Automatically becomes buffer-local when set in any fashion.");
1412 DEFVAR_PER_BUFFER ("left-margin", ¤t_buffer
->left_margin
,
1413 "*Column for the default indent-line-function to indent to.\n\
1414 Linefeed indents to this column in Fundamental mode.\n\
1415 Automatically becomes buffer-local when set in any fashion.");
1417 DEFVAR_PER_BUFFER ("tab-width", ¤t_buffer
->tab_width
,
1418 "*Distance between tab stops (for display of tab characters), in columns.\n\
1419 Automatically becomes buffer-local when set in any fashion.");
1421 DEFVAR_PER_BUFFER ("ctl-arrow", ¤t_buffer
->ctl_arrow
,
1422 "*Non-nil means display control chars with uparrow.\n\
1423 Nil means use backslash and octal digits.\n\
1424 Automatically becomes buffer-local when set in any fashion.\n\
1425 This variable does not apply to characters whose display is specified\n\
1426 in the current display table (if there is one).");
1428 DEFVAR_PER_BUFFER ("truncate-lines", ¤t_buffer
->truncate_lines
,
1429 "*Non-nil means do not display continuation lines;\n\
1430 give each line of text one screen line.\n\
1431 Automatically becomes buffer-local when set in any fashion.\n\
1433 Note that this is overridden by the variable\n\
1434 `truncate-partial-width-windows' if that variable is non-nil\n\
1435 and this buffer is not full-screen width.");
1437 DEFVAR_PER_BUFFER ("default-directory", ¤t_buffer
->directory
,
1438 "Name of default directory of current buffer. Should end with slash.\n\
1439 Each buffer has its own value of this variable.");
1441 DEFVAR_PER_BUFFER ("auto-fill-function", ¤t_buffer
->auto_fill_function
,
1442 "Function called (if non-nil) to perform auto-fill.\n\
1443 It is called after self-inserting a space at a column beyond `fill-column'.\n\
1444 Each buffer has its own value of this variable.\n\
1445 NOTE: This variable is not an ordinary hook;\n\
1446 It may not be a list of functions.");
1448 DEFVAR_PER_BUFFER ("buffer-file-name", ¤t_buffer
->filename
,
1449 "Name of file visited in current buffer, or nil if not visiting a file.\n\
1450 Each buffer has its own value of this variable.");
1452 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
1453 ¤t_buffer
->auto_save_file_name
,
1454 "Name of file for auto-saving current buffer,\n\
1455 or nil if buffer should not be auto-saved.\n\
1456 Each buffer has its own value of this variable.");
1458 DEFVAR_PER_BUFFER ("buffer-read-only", ¤t_buffer
->read_only
,
1459 "Non-nil if this buffer is read-only.\n\
1460 Each buffer has its own value of this variable.");
1462 DEFVAR_PER_BUFFER ("buffer-backed-up", ¤t_buffer
->backed_up
,
1463 "Non-nil if this buffer's file has been backed up.\n\
1464 Backing up is done before the first time the file is saved.\n\
1465 Each buffer has its own value of this variable.");
1467 DEFVAR_PER_BUFFER ("buffer-saved-size", ¤t_buffer
->save_length
,
1468 "Length of current buffer when last read in, saved or auto-saved.\n\
1470 Each buffer has its own value of this variable.");
1472 DEFVAR_PER_BUFFER ("selective-display", ¤t_buffer
->selective_display
,
1473 "Non-nil enables selective display:\n\
1474 Integer N as value means display only lines\n\
1475 that start with less than n columns of space.\n\
1476 A 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\
1478 Automatically becomes buffer-local when set in any fashion.");
1481 DEFVAR_PER_BUFFER ("selective-display-ellipses",
1482 ¤t_buffer
->selective_display_ellipses
,
1483 "t means display ... on previous line when a line is invisible.\n\
1484 Automatically becomes buffer-local when set in any fashion.");
1487 DEFVAR_PER_BUFFER ("overwrite-mode", ¤t_buffer
->overwrite_mode
,
1488 "Non-nil if self-insertion should replace existing text.\n\
1489 Automatically becomes buffer-local when set in any fashion.");
1491 DEFVAR_PER_BUFFER ("buffer-display-table", ¤t_buffer
->display_table
,
1492 "Display table that controls display of the contents of current buffer.\n\
1493 Automatically becomes buffer-local when set in any fashion.\n\
1494 The display table is a vector created with `make-display-table'.\n\
1495 The first 256 elements control how to display each possible text character.\n\
1496 The value should be a \"rope\" (see `make-rope') or nil;\n\
1497 nil means display the character in the default fashion.\n\
1498 The 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\
1504 If this variable is nil, the value of `standard-display-table' is used.\n\
1505 Each window can have its own, overriding display table.");
1507 DEFVAR_PER_BUFFER ("buffer-field-list", ¤t_buffer
->fieldlist
,
1508 "List of fields in the current buffer. See `add-field'.");
1510 DEFVAR_BOOL ("check-protected-fields", check_protected_fields
,
1511 "Non-nil means don't allow modification of a protected field.\n\
1513 check_protected_fields
= 0;
1515 /*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
1518 DEFVAR_LISP ("bgfore-change-function", &Vbefore_change_function
,
1519 "Function to call before each text change.\n\
1520 Two arguments are passed to the function: the positions of\n\
1521 the 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\
1523 No information is given about the length of the text after the change.\n\
1524 position of the change\n\
1526 While executing the `before-change-function', changes to buffers do not\n\
1527 cause calls to any `before-change-function' or `after-change-function'.");
1528 Vbefore_change_function
= Qnil
;
1530 DEFVAR_LISP ("after-change-function", &Vafter_change_function
,
1531 "Function to call after each text change.\n\
1532 Three arguments are passed to the function: the positions of\n\
1533 the beginning and end of the range of changed text,\n\
1534 and the length of the pre-change text replaced by that range.\n\
1535 \(For an insertion, the pre-change length is zero;\n\
1536 for a deletion, that length is the number of characters deleted,\n\
1537 and the post-change beginning and end are at the same place.)\n\
1539 While executing the `after-change-function', changes to buffers do not\n\
1540 cause calls to any `before-change-function' or `after-change-function'.");
1541 Vafter_change_function
= Qnil
;
1543 DEFVAR_LISP ("first-change-function", &Vfirst_change_function
,
1544 "Function to call before changing a buffer which is unmodified.\n\
1545 The function is called, with no arguments, if it is non-nil.");
1546 Vfirst_change_function
= Qnil
;
1548 DEFVAR_PER_BUFFER ("buffer-undo-list", ¤t_buffer
->undo_list
,
1549 "List of undo entries in current buffer.\n\
1550 Recent changes come first; older changes follow newer.\n\
1552 An entry (START . END) represents an insertion which begins at\n\
1553 position START and ends at position END.\n\
1555 An entry (TEXT . POSITION) represents the deletion of the string TEXT\n\
1556 from (abs POSITION). If POSITION is positive, point was at the front\n\
1557 of the text being deleted; if negative, point was at the end.\n\
1559 An entry (t HIGHWORD LOWWORD) indicates that the buffer had been\n\
1560 previously unmodified. HIGHWORD and LOWWORD are the high and low\n\
1561 16-bit words of the buffer's modification count at the time. If the\n\
1562 modification count of the most recent save is different, this entry is\n\
1565 nil marks undo boundaries. The undo command treats the changes\n\
1566 between two undo boundaries as a single step to be undone.\n\
1568 If the value of the variable is t, undo information is not recorded.\n\
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
);
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");