(rmail-select-summary): Add a save-excursion.
[bpt/emacs.git] / src / buffer.c
CommitLineData
1ab256cb 1/* Buffer manipulation primitives for GNU Emacs.
c6c5df7f 2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993
c922bc55 3 Free Software Foundation, Inc.
1ab256cb
RM
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
c922bc55 9the Free Software Foundation; either version 2, or (at your option)
1ab256cb
RM
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
2381d133
JB
22#include <sys/types.h>
23#include <sys/stat.h>
1ab256cb
RM
24#include <sys/param.h>
25
26#ifndef MAXPATHLEN
27/* in 4.1, param.h fails to define this. */
28#define MAXPATHLEN 1024
29#endif /* not MAXPATHLEN */
30
1ab256cb
RM
31#include "config.h"
32#include "lisp.h"
21cf4cf8 33#include "intervals.h"
1ab256cb
RM
34#include "window.h"
35#include "commands.h"
36#include "buffer.h"
37#include "syntax.h"
38#include "indent.h"
d014bf88 39#include "blockinput.h"
1ab256cb
RM
40
41struct buffer *current_buffer; /* the current buffer */
42
43/* First buffer in chain of all buffers (in reverse order of creation).
44 Threaded through ->next. */
45
46struct buffer *all_buffers;
47
48/* This structure holds the default values of the buffer-local variables
49 defined with DEFVAR_PER_BUFFER, that have special slots in each buffer.
50 The default value occupies the same slot in this structure
51 as an individual buffer's value occupies in that buffer.
52 Setting the default value also goes through the alist of buffers
53 and stores into each buffer that does not say it has a local value. */
54
55struct buffer buffer_defaults;
56
57/* A Lisp_Object pointer to the above, used for staticpro */
58
59static Lisp_Object Vbuffer_defaults;
60
61/* This structure marks which slots in a buffer have corresponding
62 default values in buffer_defaults.
63 Each such slot has a nonzero value in this structure.
64 The value has only one nonzero bit.
65
66 When a buffer has its own local value for a slot,
67 the bit for that slot (found in the same slot in this structure)
68 is turned on in the buffer's local_var_flags slot.
69
70 If a slot in this structure is -1, then even though there may
71 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
72 and the corresponding slot in buffer_defaults is not used.
73
74 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it,
75 but there is a default value which is copied into each buffer.
76
77 If a slot in this structure is negative, then even though there may
78 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
79 and the corresponding slot in buffer_defaults is not used.
80
81 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is
82 zero, that is a bug */
83
84struct buffer buffer_local_flags;
85
86/* This structure holds the names of symbols whose values may be
87 buffer-local. It is indexed and accessed in the same way as the above. */
88
89struct buffer buffer_local_symbols;
90/* A Lisp_Object pointer to the above, used for staticpro */
91static Lisp_Object Vbuffer_local_symbols;
92
0fa3ba92
JB
93/* This structure holds the required types for the values in the
94 buffer-local slots. If a slot contains Qnil, then the
95 corresponding buffer slot may contain a value of any type. If a
96 slot contains an integer, then prospective values' tags must be
97 equal to that integer. When a tag does not match, the function
98 buffer_slot_type_mismatch will signal an error. */
99struct buffer buffer_local_types;
100
1ab256cb 101Lisp_Object Fset_buffer ();
01050cb5 102void set_buffer_internal ();
1ab256cb
RM
103
104/* Alist of all buffer names vs the buffers. */
105/* This used to be a variable, but is no longer,
106 to prevent lossage due to user rplac'ing this alist or its elements. */
107Lisp_Object Vbuffer_alist;
108
109/* Functions to call before and after each text change. */
110Lisp_Object Vbefore_change_function;
111Lisp_Object Vafter_change_function;
112
c48f61ef
RS
113Lisp_Object Vtransient_mark_mode;
114
dbc4e1c1
JB
115/* List of functions to call before changing an unmodified buffer. */
116Lisp_Object Vfirst_change_hook;
117Lisp_Object Qfirst_change_hook;
1ab256cb
RM
118
119Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
120
121Lisp_Object Qprotected_field;
122
123Lisp_Object QSFundamental; /* A string "Fundamental" */
124
125Lisp_Object Qkill_buffer_hook;
126
52f8ec73
JB
127Lisp_Object Qoverlayp;
128
1ab256cb
RM
129/* For debugging; temporary. See set_buffer_internal. */
130/* Lisp_Object Qlisp_mode, Vcheck_symbol; */
131
132nsberror (spec)
133 Lisp_Object spec;
134{
135 if (XTYPE (spec) == Lisp_String)
136 error ("No buffer named %s", XSTRING (spec)->data);
137 error ("Invalid buffer argument");
138}
139\f
140DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
141 "Return a list of all existing live buffers.")
142 ()
143{
144 return Fmapcar (Qcdr, Vbuffer_alist);
145}
146
147DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
148 "Return the buffer named NAME (a string).\n\
149If there is no live buffer named NAME, return nil.\n\
150NAME may also be a buffer; if so, the value is that buffer.")
151 (name)
152 register Lisp_Object name;
153{
154 if (XTYPE (name) == Lisp_Buffer)
155 return name;
156 CHECK_STRING (name, 0);
157
158 return Fcdr (Fassoc (name, Vbuffer_alist));
159}
160
161DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
162 "Return the buffer visiting file FILENAME (a string).\n\
163If there is no such live buffer, return nil.")
164 (filename)
165 register Lisp_Object filename;
166{
167 register Lisp_Object tail, buf, tem;
168 CHECK_STRING (filename, 0);
169 filename = Fexpand_file_name (filename, Qnil);
170
171 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr)
172 {
173 buf = Fcdr (XCONS (tail)->car);
174 if (XTYPE (buf) != Lisp_Buffer) continue;
175 if (XTYPE (XBUFFER (buf)->filename) != Lisp_String) continue;
176 tem = Fstring_equal (XBUFFER (buf)->filename, filename);
265a9e55 177 if (!NILP (tem))
1ab256cb
RM
178 return buf;
179 }
180 return Qnil;
181}
182
183/* Incremented for each buffer created, to assign the buffer number. */
184int buffer_count;
185
186DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
187 "Return the buffer named NAME, or create such a buffer and return it.\n\
188A new buffer is created if there is no live buffer named NAME.\n\
b44895bc 189If NAME starts with a space, the new buffer does not keep undo information.\n\
1ab256cb
RM
190If NAME is a buffer instead of a string, then it is the value returned.\n\
191The value is never nil.")
192 (name)
193 register Lisp_Object name;
194{
195 register Lisp_Object buf, function, tem;
196 int count = specpdl_ptr - specpdl;
197 register struct buffer *b;
198
199 buf = Fget_buffer (name);
265a9e55 200 if (!NILP (buf))
1ab256cb
RM
201 return buf;
202
9ac0d9e0 203 b = (struct buffer *) xmalloc (sizeof (struct buffer));
1ab256cb
RM
204
205 BUF_GAP_SIZE (b) = 20;
9ac0d9e0 206 BLOCK_INPUT;
1ab256cb 207 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b));
9ac0d9e0 208 UNBLOCK_INPUT;
1ab256cb
RM
209 if (! BUF_BEG_ADDR (b))
210 memory_full ();
211
212 BUF_PT (b) = 1;
213 BUF_GPT (b) = 1;
214 BUF_BEGV (b) = 1;
215 BUF_ZV (b) = 1;
216 BUF_Z (b) = 1;
217 BUF_MODIFF (b) = 1;
218
219 /* Put this on the chain of all buffers including killed ones. */
220 b->next = all_buffers;
221 all_buffers = b;
222
223 b->mark = Fmake_marker ();
224 /*b->number = make_number (++buffer_count);*/
225 b->name = name;
226 if (XSTRING (name)->data[0] != ' ')
227 b->undo_list = Qnil;
228 else
229 b->undo_list = Qt;
230
231 reset_buffer (b);
232
233 /* Put this in the alist of all live buffers. */
234 XSET (buf, Lisp_Buffer, b);
235 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
236
237 b->mark = Fmake_marker ();
238 b->markers = Qnil;
239 b->name = name;
240
241 function = buffer_defaults.major_mode;
265a9e55 242 if (NILP (function))
1ab256cb
RM
243 {
244 tem = Fget (current_buffer->major_mode, Qmode_class);
245 if (EQ (tem, Qnil))
246 function = current_buffer->major_mode;
247 }
248
265a9e55 249 if (NILP (function) || EQ (function, Qfundamental_mode))
1ab256cb
RM
250 return buf;
251
252 /* To select a nonfundamental mode,
253 select the buffer temporarily and then call the mode function. */
254
255 record_unwind_protect (save_excursion_restore, save_excursion_save ());
256
257 Fset_buffer (buf);
258 call0 (function);
259
260 return unbind_to (count, buf);
261}
262
263/* Reinitialize everything about a buffer except its name and contents. */
264
265void
266reset_buffer (b)
267 register struct buffer *b;
268{
269 b->filename = Qnil;
270 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
271 b->modtime = 0;
272 b->save_modified = 1;
291026b5 273 XFASTINT (b->save_length) = 0;
1ab256cb
RM
274 b->last_window_start = 1;
275 b->backed_up = Qnil;
276 b->auto_save_modified = 0;
277 b->auto_save_file_name = Qnil;
278 b->read_only = Qnil;
2eec3b4e
RS
279 b->overlays_before = Qnil;
280 b->overlays_after = Qnil;
281 XFASTINT (b->overlay_center) = 1;
dfda7a7f 282 b->mark_active = Qnil;
33f7013e
JA
283
284 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
285 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
286
1ab256cb
RM
287 reset_buffer_local_variables(b);
288}
289
c48f61ef 290reset_buffer_local_variables (b)
1ab256cb
RM
291 register struct buffer *b;
292{
293 register int offset;
294
295 /* Reset the major mode to Fundamental, together with all the
296 things that depend on the major mode.
297 default-major-mode is handled at a higher level.
298 We ignore it here. */
299 b->major_mode = Qfundamental_mode;
300 b->keymap = Qnil;
301 b->abbrev_table = Vfundamental_mode_abbrev_table;
302 b->mode_name = QSFundamental;
303 b->minor_modes = Qnil;
304 b->downcase_table = Vascii_downcase_table;
305 b->upcase_table = Vascii_upcase_table;
306 b->case_canon_table = Vascii_downcase_table;
307 b->case_eqv_table = Vascii_upcase_table;
308#if 0
309 b->sort_table = XSTRING (Vascii_sort_table);
310 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
311#endif /* 0 */
312
313 /* Reset all per-buffer variables to their defaults. */
314 b->local_var_alist = Qnil;
315 b->local_var_flags = 0;
316
317 /* For each slot that has a default value,
318 copy that into the slot. */
319
320 for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags;
321 offset < sizeof (struct buffer);
322 offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */
323 if (*(int *)(offset + (char *) &buffer_local_flags) > 0
324 || *(int *)(offset + (char *) &buffer_local_flags) == -2)
325 *(Lisp_Object *)(offset + (char *)b) =
326 *(Lisp_Object *)(offset + (char *)&buffer_defaults);
327}
328
01050cb5
RM
329/* We split this away from generate-new-buffer, because rename-buffer
330 and set-visited-file-name ought to be able to use this to really
331 rename the buffer properly. */
332
333DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name,
c273e647 334 1, 2, 0,
01050cb5
RM
335 "Return a string that is the name of no existing buffer based on NAME.\n\
336If there is no live buffer named NAME, then return NAME.\n\
1ab256cb 337Otherwise modify name by appending `<NUMBER>', incrementing NUMBER\n\
c273e647 338until an unused name is found, and then return that name.\n\
03bdd54c 339Optional second argument IGNORE specifies a name that is okay to use\n\
c273e647 340\(if it is in the sequence to be tried)\n\
e8b3a22d 341even if a buffer with that name exists.")
c273e647
RS
342 (name, ignore)
343 register Lisp_Object name, ignore;
1ab256cb
RM
344{
345 register Lisp_Object gentemp, tem;
346 int count;
347 char number[10];
348
349 CHECK_STRING (name, 0);
350
351 tem = Fget_buffer (name);
265a9e55 352 if (NILP (tem))
01050cb5 353 return name;
1ab256cb
RM
354
355 count = 1;
356 while (1)
357 {
358 sprintf (number, "<%d>", ++count);
359 gentemp = concat2 (name, build_string (number));
c273e647
RS
360 tem = Fstring_equal (name, ignore);
361 if (!NILP (tem))
362 return gentemp;
1ab256cb 363 tem = Fget_buffer (gentemp);
265a9e55 364 if (NILP (tem))
01050cb5 365 return gentemp;
1ab256cb
RM
366 }
367}
368
369\f
370DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
371 "Return the name of BUFFER, as a string.\n\
01050cb5 372With no argument or nil as argument, return the name of the current buffer.")
1ab256cb
RM
373 (buffer)
374 register Lisp_Object buffer;
375{
265a9e55 376 if (NILP (buffer))
1ab256cb
RM
377 return current_buffer->name;
378 CHECK_BUFFER (buffer, 0);
379 return XBUFFER (buffer)->name;
380}
381
382DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
383 "Return name of file BUFFER is visiting, or nil if none.\n\
384No argument or nil as argument means use the current buffer.")
385 (buffer)
386 register Lisp_Object buffer;
387{
265a9e55 388 if (NILP (buffer))
1ab256cb
RM
389 return current_buffer->filename;
390 CHECK_BUFFER (buffer, 0);
391 return XBUFFER (buffer)->filename;
392}
393
394DEFUN ("buffer-local-variables", Fbuffer_local_variables,
395 Sbuffer_local_variables, 0, 1, 0,
396 "Return an alist of variables that are buffer-local in BUFFER.\n\
397Each element looks like (SYMBOL . VALUE) and describes one variable.\n\
398Note that storing new VALUEs in these elements doesn't change the variables.\n\
399No argument or nil as argument means use current buffer as BUFFER.")
400 (buffer)
401 register Lisp_Object buffer;
402{
403 register struct buffer *buf;
404 register Lisp_Object val;
405
265a9e55 406 if (NILP (buffer))
1ab256cb
RM
407 buf = current_buffer;
408 else
409 {
410 CHECK_BUFFER (buffer, 0);
411 buf = XBUFFER (buffer);
412 }
413
414 {
415 /* Reference each variable in the alist in our current buffer.
416 If inquiring about the current buffer, this gets the current values,
417 so store them into the alist so the alist is up to date.
418 If inquiring about some other buffer, this swaps out any values
419 for that buffer, making the alist up to date automatically. */
420 register Lisp_Object tem;
421 for (tem = buf->local_var_alist; CONSP (tem); tem = XCONS (tem)->cdr)
422 {
423 Lisp_Object v1 = Fsymbol_value (XCONS (XCONS (tem)->car)->car);
424 if (buf == current_buffer)
425 XCONS (XCONS (tem)->car)->cdr = v1;
426 }
427 }
428
429 /* Make a copy of the alist, to return it. */
430 val = Fcopy_alist (buf->local_var_alist);
431
432 /* Add on all the variables stored in special slots. */
433 {
434 register int offset, mask;
435
436 for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols;
437 offset < sizeof (struct buffer);
438 offset += (sizeof (int))) /* sizeof int == sizeof Lisp_Object */
439 {
440 mask = *(int *)(offset + (char *) &buffer_local_flags);
441 if (mask == -1 || (buf->local_var_flags & mask))
442 if (XTYPE (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols))
443 == Lisp_Symbol)
444 val = Fcons (Fcons (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols),
445 *(Lisp_Object *)(offset + (char *)buf)),
446 val);
447 }
448 }
449 return (val);
450}
451
452\f
453DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
454 0, 1, 0,
455 "Return t if BUFFER was modified since its file was last read or saved.\n\
456No argument or nil as argument means use current buffer as BUFFER.")
457 (buffer)
458 register Lisp_Object buffer;
459{
460 register struct buffer *buf;
265a9e55 461 if (NILP (buffer))
1ab256cb
RM
462 buf = current_buffer;
463 else
464 {
465 CHECK_BUFFER (buffer, 0);
466 buf = XBUFFER (buffer);
467 }
468
469 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil;
470}
471
472DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
473 1, 1, 0,
474 "Mark current buffer as modified or unmodified according to FLAG.\n\
475A non-nil FLAG means mark the buffer modified.")
476 (flag)
477 register Lisp_Object flag;
478{
479 register int already;
480 register Lisp_Object fn;
481
482#ifdef CLASH_DETECTION
483 /* If buffer becoming modified, lock the file.
484 If buffer becoming unmodified, unlock the file. */
485
486 fn = current_buffer->filename;
265a9e55 487 if (!NILP (fn))
1ab256cb
RM
488 {
489 already = current_buffer->save_modified < MODIFF;
265a9e55 490 if (!already && !NILP (flag))
1ab256cb 491 lock_file (fn);
265a9e55 492 else if (already && NILP (flag))
1ab256cb
RM
493 unlock_file (fn);
494 }
495#endif /* CLASH_DETECTION */
496
265a9e55 497 current_buffer->save_modified = NILP (flag) ? MODIFF : 0;
1ab256cb
RM
498 update_mode_lines++;
499 return flag;
500}
501
502DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
503 0, 1, 0,
504 "Return BUFFER's tick counter, incremented for each change in text.\n\
505Each buffer has a tick counter which is incremented each time the text in\n\
506that buffer is changed. It wraps around occasionally.\n\
507No argument or nil as argument means use current buffer as BUFFER.")
508 (buffer)
509 register Lisp_Object buffer;
510{
511 register struct buffer *buf;
265a9e55 512 if (NILP (buffer))
1ab256cb
RM
513 buf = current_buffer;
514 else
515 {
516 CHECK_BUFFER (buffer, 0);
517 buf = XBUFFER (buffer);
518 }
519
520 return make_number (BUF_MODIFF (buf));
521}
522\f
01050cb5 523DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2,
3bd779aa 524 "sRename buffer (to new name): \nP",
1ab256cb 525 "Change current buffer's name to NEWNAME (a string).\n\
3bd779aa 526If second arg UNIQUE is nil or omitted, it is an error if a\n\
01050cb5 527buffer named NEWNAME already exists.\n\
3bd779aa 528If UNIQUE is non-nil, come up with a new name using\n\
01050cb5 529`generate-new-buffer-name'.\n\
3bd779aa
RS
530Interactively, you can set UNIQUE with a prefix argument.\n\
531We return the name we actually gave the buffer.\n\
1ab256cb 532This does not change the name of the visited file (if any).")
3bd779aa
RS
533 (name, unique)
534 register Lisp_Object name, unique;
1ab256cb
RM
535{
536 register Lisp_Object tem, buf;
537
538 CHECK_STRING (name, 0);
539 tem = Fget_buffer (name);
01050cb5
RM
540 if (XBUFFER (tem) == current_buffer)
541 return current_buffer->name;
265a9e55 542 if (!NILP (tem))
01050cb5 543 {
3bd779aa 544 if (!NILP (unique))
c273e647 545 name = Fgenerate_new_buffer_name (name, current_buffer->name);
01050cb5
RM
546 else
547 error ("Buffer name \"%s\" is in use", XSTRING (name)->data);
548 }
1ab256cb
RM
549
550 current_buffer->name = name;
76f590d7
JB
551
552 /* Catch redisplay's attention. Unless we do this, the mode lines for
553 any windows displaying current_buffer will stay unchanged. */
554 update_mode_lines++;
555
1ab256cb
RM
556 XSET (buf, Lisp_Buffer, current_buffer);
557 Fsetcar (Frassq (buf, Vbuffer_alist), name);
265a9e55 558 if (NILP (current_buffer->filename) && !NILP (current_buffer->auto_save_file_name))
1ab256cb 559 call0 (intern ("rename-auto-save-file"));
01050cb5 560 return name;
1ab256cb
RM
561}
562
a0ebb746 563DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 2, 0,
1ab256cb 564 "Return most recently selected buffer other than BUFFER.\n\
a0ebb746
JB
565Buffers not visible in windows are preferred to visible buffers,\n\
566unless optional second argument VISIBLE-OK is non-nil.\n\
1ab256cb
RM
567If no other buffer exists, the buffer `*scratch*' is returned.\n\
568If BUFFER is omitted or nil, some interesting buffer is returned.")
a0ebb746
JB
569 (buffer, visible_ok)
570 register Lisp_Object buffer, visible_ok;
1ab256cb
RM
571{
572 register Lisp_Object tail, buf, notsogood, tem;
573 notsogood = Qnil;
574
265a9e55 575 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
576 {
577 buf = Fcdr (Fcar (tail));
578 if (EQ (buf, buffer))
579 continue;
580 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
581 continue;
a0ebb746
JB
582 if (NILP (visible_ok))
583 tem = Fget_buffer_window (buf, Qnil);
584 else
585 tem = Qnil;
265a9e55 586 if (NILP (tem))
1ab256cb 587 return buf;
265a9e55 588 if (NILP (notsogood))
1ab256cb
RM
589 notsogood = buf;
590 }
265a9e55 591 if (!NILP (notsogood))
1ab256cb
RM
592 return notsogood;
593 return Fget_buffer_create (build_string ("*scratch*"));
594}
595\f
596DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, 1,1,
5970,
598 "Make BUFFER stop keeping undo information.")
ffd56f97
JB
599 (buffer)
600 register Lisp_Object buffer;
1ab256cb 601{
ffd56f97
JB
602 Lisp_Object real_buffer;
603
604 if (NILP (buffer))
605 XSET (real_buffer, Lisp_Buffer, current_buffer);
606 else
607 {
608 real_buffer = Fget_buffer (buffer);
609 if (NILP (real_buffer))
610 nsberror (buffer);
611 }
612
613 XBUFFER (real_buffer)->undo_list = Qt;
614
1ab256cb
RM
615 return Qnil;
616}
617
618DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
619 0, 1, "",
620 "Start keeping undo information for buffer BUFFER.\n\
621No argument or nil as argument means do this for the current buffer.")
ffd56f97
JB
622 (buffer)
623 register Lisp_Object buffer;
1ab256cb 624{
ffd56f97 625 Lisp_Object real_buffer;
1ab256cb 626
ffd56f97
JB
627 if (NILP (buffer))
628 XSET (real_buffer, Lisp_Buffer, current_buffer);
1ab256cb
RM
629 else
630 {
ffd56f97
JB
631 real_buffer = Fget_buffer (buffer);
632 if (NILP (real_buffer))
633 nsberror (buffer);
1ab256cb
RM
634 }
635
ffd56f97
JB
636 if (EQ (XBUFFER (real_buffer)->undo_list, Qt))
637 XBUFFER (real_buffer)->undo_list = Qnil;
1ab256cb
RM
638
639 return Qnil;
640}
641
642/*
643 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
644Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
645The buffer being killed will be current while the hook is running.\n\
646See `kill-buffer'."
647 */
648DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
649 "Kill the buffer BUFFER.\n\
650The argument may be a buffer or may be the name of a buffer.\n\
651An argument of nil means kill the current buffer.\n\n\
652Value is t if the buffer is actually killed, nil if user says no.\n\n\
653The value of `kill-buffer-hook' (which may be local to that buffer),\n\
654if not void, is a list of functions to be called, with no arguments,\n\
655before the buffer is actually killed. The buffer to be killed is current\n\
656when the hook functions are called.\n\n\
657Any processes that have this buffer as the `process-buffer' are killed\n\
658with `delete-process'.")
659 (bufname)
660 Lisp_Object bufname;
661{
662 Lisp_Object buf;
663 register struct buffer *b;
664 register Lisp_Object tem;
665 register struct Lisp_Marker *m;
666 struct gcpro gcpro1, gcpro2;
667
265a9e55 668 if (NILP (bufname))
1ab256cb
RM
669 buf = Fcurrent_buffer ();
670 else
671 buf = Fget_buffer (bufname);
265a9e55 672 if (NILP (buf))
1ab256cb
RM
673 nsberror (bufname);
674
675 b = XBUFFER (buf);
676
677 /* Query if the buffer is still modified. */
265a9e55 678 if (INTERACTIVE && !NILP (b->filename)
1ab256cb
RM
679 && BUF_MODIFF (b) > b->save_modified)
680 {
681 GCPRO2 (buf, bufname);
682 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
683 XSTRING (b->name)->data));
684 UNGCPRO;
265a9e55 685 if (NILP (tem))
1ab256cb
RM
686 return Qnil;
687 }
688
689 /* Run kill-buffer hook with the buffer to be killed the current buffer. */
690 {
691 register Lisp_Object val;
692 int count = specpdl_ptr - specpdl;
693
694 record_unwind_protect (save_excursion_restore, save_excursion_save ());
695 set_buffer_internal (b);
696 call1 (Vrun_hooks, Qkill_buffer_hook);
697 unbind_to (count, Qnil);
698 }
699
700 /* We have no more questions to ask. Verify that it is valid
701 to kill the buffer. This must be done after the questions
702 since anything can happen within do_yes_or_no_p. */
703
704 /* Don't kill the minibuffer now current. */
705 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
706 return Qnil;
707
265a9e55 708 if (NILP (b->name))
1ab256cb
RM
709 return Qnil;
710
711 /* Make this buffer not be current.
712 In the process, notice if this is the sole visible buffer
713 and give up if so. */
714 if (b == current_buffer)
715 {
172a9c1f 716 tem = Fother_buffer (buf, Qnil);
1ab256cb
RM
717 Fset_buffer (tem);
718 if (b == current_buffer)
719 return Qnil;
720 }
721
722 /* Now there is no question: we can kill the buffer. */
723
724#ifdef CLASH_DETECTION
725 /* Unlock this buffer's file, if it is locked. */
726 unlock_buffer (b);
727#endif /* CLASH_DETECTION */
728
1ab256cb 729 kill_buffer_processes (buf);
1ab256cb
RM
730
731 tem = Vinhibit_quit;
732 Vinhibit_quit = Qt;
733 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
734 Freplace_buffer_in_windows (buf);
735 Vinhibit_quit = tem;
736
737 /* Delete any auto-save file. */
738 if (XTYPE (b->auto_save_file_name) == Lisp_String)
739 {
740 Lisp_Object tem;
741 tem = Fsymbol_value (intern ("delete-auto-save-files"));
265a9e55 742 if (! NILP (tem))
1ab256cb
RM
743 unlink (XSTRING (b->auto_save_file_name)->data);
744 }
745
746 /* Unchain all markers of this buffer
747 and leave them pointing nowhere. */
748 for (tem = b->markers; !EQ (tem, Qnil); )
749 {
750 m = XMARKER (tem);
751 m->buffer = 0;
752 tem = m->chain;
753 m->chain = Qnil;
754 }
755 b->markers = Qnil;
756
33f7013e
JA
757 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
758 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
759 /* Perhaps we should explicitly free the interval tree here... */
760
1ab256cb 761 b->name = Qnil;
9ac0d9e0 762 BLOCK_INPUT;
1ab256cb 763 BUFFER_FREE (BUF_BEG_ADDR (b));
9ac0d9e0 764 UNBLOCK_INPUT;
1ab256cb
RM
765 b->undo_list = Qnil;
766
767 return Qt;
768}
769\f
36a8c287
JB
770/* Move the assoc for buffer BUF to the front of buffer-alist. Since
771 we do this each time BUF is selected visibly, the more recently
772 selected buffers are always closer to the front of the list. This
773 means that other_buffer is more likely to choose a relevant buffer. */
1ab256cb
RM
774
775record_buffer (buf)
776 Lisp_Object buf;
777{
778 register Lisp_Object link, prev;
779
780 prev = Qnil;
781 for (link = Vbuffer_alist; CONSP (link); link = XCONS (link)->cdr)
782 {
783 if (EQ (XCONS (XCONS (link)->car)->cdr, buf))
784 break;
785 prev = link;
786 }
787
36a8c287
JB
788 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
789 we cannot use Fdelq itself here because it allows quitting. */
1ab256cb 790
265a9e55 791 if (NILP (prev))
1ab256cb
RM
792 Vbuffer_alist = XCONS (Vbuffer_alist)->cdr;
793 else
794 XCONS (prev)->cdr = XCONS (XCONS (prev)->cdr)->cdr;
795
796 XCONS(link)->cdr = Vbuffer_alist;
797 Vbuffer_alist = link;
798}
799
800DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
801 "Select buffer BUFFER in the current window.\n\
802BUFFER may be a buffer or a buffer name.\n\
803Optional second arg NORECORD non-nil means\n\
804do not put this buffer at the front of the list of recently selected ones.\n\
805\n\
806WARNING: This is NOT the way to work on another buffer temporarily\n\
807within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\
808the window-buffer correspondences.")
809 (bufname, norecord)
810 Lisp_Object bufname, norecord;
811{
812 register Lisp_Object buf;
813 Lisp_Object tem;
814
815 if (EQ (minibuf_window, selected_window))
816 error ("Cannot switch buffers in minibuffer window");
817 tem = Fwindow_dedicated_p (selected_window);
265a9e55 818 if (!NILP (tem))
1ab256cb
RM
819 error ("Cannot switch buffers in a dedicated window");
820
265a9e55 821 if (NILP (bufname))
172a9c1f 822 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
823 else
824 buf = Fget_buffer_create (bufname);
825 Fset_buffer (buf);
265a9e55 826 if (NILP (norecord))
1ab256cb
RM
827 record_buffer (buf);
828
829 Fset_window_buffer (EQ (selected_window, minibuf_window)
5fcd022d
JB
830 ? Fnext_window (minibuf_window, Qnil, Qnil)
831 : selected_window,
1ab256cb
RM
832 buf);
833
e8b3a22d 834 return buf;
1ab256cb
RM
835}
836
837DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0,
838 "Select buffer BUFFER in some window, preferably a different one.\n\
839If BUFFER is nil, then some other buffer is chosen.\n\
840If `pop-up-windows' is non-nil, windows can be split to do this.\n\
841If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
842window even if BUFFER is already visible in the selected window.")
843 (bufname, other)
844 Lisp_Object bufname, other;
845{
846 register Lisp_Object buf;
265a9e55 847 if (NILP (bufname))
172a9c1f 848 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
849 else
850 buf = Fget_buffer_create (bufname);
851 Fset_buffer (buf);
852 record_buffer (buf);
853 Fselect_window (Fdisplay_buffer (buf, other));
e8b3a22d 854 return buf;
1ab256cb
RM
855}
856
857DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
858 "Return the current buffer as a Lisp object.")
859 ()
860{
861 register Lisp_Object buf;
862 XSET (buf, Lisp_Buffer, current_buffer);
863 return buf;
864}
865\f
866/* Set the current buffer to b */
867
868void
869set_buffer_internal (b)
870 register struct buffer *b;
871{
872 register struct buffer *old_buf;
873 register Lisp_Object tail, valcontents;
874 enum Lisp_Type tem;
875
876 if (current_buffer == b)
877 return;
878
879 windows_or_buffers_changed = 1;
880 old_buf = current_buffer;
881 current_buffer = b;
882 last_known_column_point = -1; /* invalidate indentation cache */
883
884 /* Look down buffer's list of local Lisp variables
885 to find and update any that forward into C variables. */
886
265a9e55 887 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
888 {
889 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
890 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
891 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
892 && (tem = XTYPE (XCONS (valcontents)->car),
893 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
894 || tem == Lisp_Objfwd)))
895 /* Just reference the variable
896 to cause it to become set for this buffer. */
897 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
898 }
899
900 /* Do the same with any others that were local to the previous buffer */
901
902 if (old_buf)
265a9e55 903 for (tail = old_buf->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
904 {
905 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
906 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
907 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
908 && (tem = XTYPE (XCONS (valcontents)->car),
909 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
910 || tem == Lisp_Objfwd)))
911 /* Just reference the variable
912 to cause it to become set for this buffer. */
913 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
914 }
915}
916
917DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
918 "Make the buffer BUFFER current for editing operations.\n\
919BUFFER may be a buffer or the name of an existing buffer.\n\
920See also `save-excursion' when you want to make a buffer current temporarily.\n\
921This function does not display the buffer, so its effect ends\n\
922when the current command terminates.\n\
923Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
924 (bufname)
925 register Lisp_Object bufname;
926{
927 register Lisp_Object buffer;
928 buffer = Fget_buffer (bufname);
265a9e55 929 if (NILP (buffer))
1ab256cb 930 nsberror (bufname);
265a9e55 931 if (NILP (XBUFFER (buffer)->name))
1ab256cb
RM
932 error ("Selecting deleted buffer");
933 set_buffer_internal (XBUFFER (buffer));
934 return buffer;
935}
936\f
937DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
938 Sbarf_if_buffer_read_only, 0, 0, 0,
939 "Signal a `buffer-read-only' error if the current buffer is read-only.")
940 ()
941{
265a9e55 942 while (!NILP (current_buffer->read_only))
1ab256cb
RM
943 Fsignal (Qbuffer_read_only, (Fcons (Fcurrent_buffer (), Qnil)));
944 return Qnil;
945}
946
947DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "",
948 "Put BUFFER at the end of the list of all buffers.\n\
949There it is the least likely candidate for `other-buffer' to return;\n\
528415e7 950thus, the least likely buffer for \\[switch-to-buffer] to select by default.\n\
a5611885
JB
951If BUFFER is nil or omitted, bury the current buffer.\n\
952Also, if BUFFER is nil or omitted, remove the current buffer from the\n\
953selected window if it is displayed there.")
1ab256cb
RM
954 (buf)
955 register Lisp_Object buf;
956{
b271272a 957 /* Figure out what buffer we're going to bury. */
265a9e55 958 if (NILP (buf))
a5611885
JB
959 {
960 XSET (buf, Lisp_Buffer, current_buffer);
961
962 /* If we're burying the current buffer, unshow it. */
5fcd022d 963 Fswitch_to_buffer (Fother_buffer (buf, Qnil), Qnil);
a5611885 964 }
1ab256cb
RM
965 else
966 {
967 Lisp_Object buf1;
968
969 buf1 = Fget_buffer (buf);
265a9e55 970 if (NILP (buf1))
1ab256cb
RM
971 nsberror (buf);
972 buf = buf1;
b271272a
JB
973 }
974
a5611885 975 /* Move buf to the end of the buffer list. */
b271272a
JB
976 {
977 register Lisp_Object aelt, link;
978
979 aelt = Frassq (buf, Vbuffer_alist);
980 link = Fmemq (aelt, Vbuffer_alist);
981 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
982 XCONS (link)->cdr = Qnil;
983 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
984 }
1ab256cb 985
1ab256cb
RM
986 return Qnil;
987}
988\f
c922bc55 989DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, "*",
1ab256cb 990 "Delete the entire contents of the current buffer.\n\
a5611885 991Any clipping restriction in effect (see `narrow-to-region') is removed,\n\
1ab256cb
RM
992so the buffer is truly empty after this.")
993 ()
994{
995 Fwiden ();
996 del_range (BEG, Z);
997 current_buffer->last_window_start = 1;
998 /* Prevent warnings, or suspension of auto saving, that would happen
999 if future size is less than past size. Use of erase-buffer
1000 implies that the future text is not really related to the past text. */
1001 XFASTINT (current_buffer->save_length) = 0;
1002 return Qnil;
1003}
1004
1005validate_region (b, e)
1006 register Lisp_Object *b, *e;
1007{
1008 register int i;
1009
1010 CHECK_NUMBER_COERCE_MARKER (*b, 0);
1011 CHECK_NUMBER_COERCE_MARKER (*e, 1);
1012
1013 if (XINT (*b) > XINT (*e))
1014 {
1015 i = XFASTINT (*b); /* This is legit even if *b is < 0 */
1016 *b = *e;
1017 XFASTINT (*e) = i; /* because this is all we do with i. */
1018 }
1019
1020 if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e)
1021 && XINT (*e) <= ZV))
1022 args_out_of_range (*b, *e);
1023}
1024\f
1025Lisp_Object
1026list_buffers_1 (files)
1027 Lisp_Object files;
1028{
1029 register Lisp_Object tail, tem, buf;
1030 Lisp_Object col1, col2, col3, minspace;
1031 register struct buffer *old = current_buffer, *b;
1032 int desired_point = 0;
1033 Lisp_Object other_file_symbol;
1034
1035 other_file_symbol = intern ("list-buffers-directory");
1036
1037 XFASTINT (col1) = 19;
1038 XFASTINT (col2) = 25;
1039 XFASTINT (col3) = 40;
1040 XFASTINT (minspace) = 1;
1041
1042 Fset_buffer (Vstandard_output);
1043
1044 tail = intern ("Buffer-menu-mode");
1045 if (!EQ (tail, current_buffer->major_mode)
265a9e55 1046 && (tem = Ffboundp (tail), !NILP (tem)))
1ab256cb
RM
1047 call0 (tail);
1048 Fbuffer_disable_undo (Vstandard_output);
1049 current_buffer->read_only = Qnil;
1050
1051 write_string ("\
1052 MR Buffer Size Mode File\n\
1053 -- ------ ---- ---- ----\n", -1);
1054
265a9e55 1055 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
1056 {
1057 buf = Fcdr (Fcar (tail));
1058 b = XBUFFER (buf);
1059 /* Don't mention the minibuffers. */
1060 if (XSTRING (b->name)->data[0] == ' ')
1061 continue;
1062 /* Optionally don't mention buffers that lack files. */
265a9e55 1063 if (!NILP (files) && NILP (b->filename))
1ab256cb
RM
1064 continue;
1065 /* Identify the current buffer. */
1066 if (b == old)
1067 desired_point = point;
1068 write_string (b == old ? "." : " ", -1);
1069 /* Identify modified buffers */
1070 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1);
265a9e55 1071 write_string (NILP (b->read_only) ? " " : "% ", -1);
1ab256cb
RM
1072 Fprinc (b->name, Qnil);
1073 Findent_to (col1, make_number (2));
1074 XFASTINT (tem) = BUF_Z (b) - BUF_BEG (b);
1075 Fprin1 (tem, Qnil);
1076 Findent_to (col2, minspace);
1077 Fprinc (b->mode_name, Qnil);
1078 Findent_to (col3, minspace);
1079
265a9e55 1080 if (!NILP (b->filename))
1ab256cb
RM
1081 Fprinc (b->filename, Qnil);
1082 else
1083 {
1084 /* No visited file; check local value of list-buffers-directory. */
1085 Lisp_Object tem;
1086 set_buffer_internal (b);
1087 tem = Fboundp (other_file_symbol);
265a9e55 1088 if (!NILP (tem))
1ab256cb
RM
1089 {
1090 tem = Fsymbol_value (other_file_symbol);
1091 Fset_buffer (Vstandard_output);
1092 if (XTYPE (tem) == Lisp_String)
1093 Fprinc (tem, Qnil);
1094 }
1095 else
1096 Fset_buffer (Vstandard_output);
1097 }
1098 write_string ("\n", -1);
1099 }
1100
1101 current_buffer->read_only = Qt;
1102 set_buffer_internal (old);
1103/* Foo. This doesn't work since temp_output_buffer_show sets point to 1
1104 if (desired_point)
1105 XBUFFER (Vstandard_output)->text.pointloc = desired_point;
1106 */
1107 return Qnil;
1108}
1109
1110DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "P",
1111 "Display a list of names of existing buffers.\n\
1112The list is displayed in a buffer named `*Buffer List*'.\n\
1113Note that buffers with names starting with spaces are omitted.\n\
1114Non-null optional arg FILES-ONLY means mention only file buffers.\n\
1115\n\
1116The M column contains a * for buffers that are modified.\n\
1117The R column contains a % for buffers that are read-only.")
1118 (files)
1119 Lisp_Object files;
1120{
1121 internal_with_output_to_temp_buffer ("*Buffer List*",
1122 list_buffers_1, files);
1123 return Qnil;
1124}
1125
1126DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
1127 0, 0, 0,
1128 "Switch to Fundamental mode by killing current buffer's local variables.\n\
1129Most local variable bindings are eliminated so that the default values\n\
1130become effective once more. Also, the syntax table is set from\n\
1131`standard-syntax-table', the local keymap is set to nil,\n\
1132and the abbrev table from `fundamental-mode-abbrev-table'.\n\
1133This function also forces redisplay of the mode line.\n\
1134\n\
1135Every function to select a new major mode starts by\n\
1136calling this function.\n\n\
1137As a special exception, local variables whose names have\n\
1138a non-nil `permanent-local' property are not eliminated by this function.")
1139 ()
1140{
1141 register Lisp_Object alist, sym, tem;
1142 Lisp_Object oalist;
1143 oalist = current_buffer->local_var_alist;
1144
1145 /* Make sure no local variables remain set up with this buffer
1146 for their current values. */
1147
265a9e55 1148 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1149 {
1150 sym = XCONS (XCONS (alist)->car)->car;
1151
1152 /* Need not do anything if some other buffer's binding is now encached. */
1153 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car;
1154 if (XBUFFER (tem) == current_buffer)
1155 {
1156 /* Symbol is set up for this buffer's old local value.
1157 Set it up for the current buffer with the default value. */
1158
1159 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr;
542143d7
RS
1160 /* Store the symbol's current value into the alist entry
1161 it is currently set up for. This is so that, if the
1162 local is marked permanent, and we make it local again below,
1163 we don't lose the value. */
1164 XCONS (XCONS (tem)->car)->cdr = XCONS (XSYMBOL (sym)->value)->car;
1165 /* Switch to the symbol's default-value alist entry. */
1ab256cb 1166 XCONS (tem)->car = tem;
542143d7 1167 /* Mark it as current for the current buffer. */
1ab256cb 1168 XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer ();
542143d7 1169 /* Store the current value into any forwarding in the symbol. */
1ab256cb
RM
1170 store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car,
1171 XCONS (tem)->cdr);
1172 }
1173 }
1174
1175 /* Actually eliminate all local bindings of this buffer. */
1176
1177 reset_buffer_local_variables (current_buffer);
1178
1179 /* Redisplay mode lines; we are changing major mode. */
1180
1181 update_mode_lines++;
1182
1183 /* Any which are supposed to be permanent,
1184 make local again, with the same values they had. */
1185
265a9e55 1186 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1187 {
1188 sym = XCONS (XCONS (alist)->car)->car;
1189 tem = Fget (sym, Qpermanent_local);
265a9e55 1190 if (! NILP (tem))
01050cb5
RM
1191 {
1192 Fmake_local_variable (sym);
1193 Fset (sym, XCONS (XCONS (alist)->car)->cdr);
1194 }
1ab256cb
RM
1195 }
1196
1197 /* Force mode-line redisplay. Useful here because all major mode
1198 commands call this function. */
1199 update_mode_lines++;
1200
1201 return Qnil;
1202}
1203\f
2eec3b4e
RS
1204/* Find all the overlays in the current buffer that contain position POS.
1205 Return the number found, and store them in a vector in *VEC_PTR.
1206 Store in *LEN_PTR the size allocated for the vector.
52f8ec73
JB
1207 Store in *NEXT_PTR the next position after POS where an overlay starts,
1208 or ZV if there are no more overlays.
2eec3b4e
RS
1209
1210 *VEC_PTR and *LEN_PTR should contain a valid vector and size
61d54cd5
RS
1211 when this function is called.
1212
1213 If EXTEND is non-zero, we make the vector bigger if necessary.
1214 If EXTEND is zero, we never extend the vector,
1215 and we store only as many overlays as will fit.
1216 But we still return the total number of overlays. */
2eec3b4e
RS
1217
1218int
61d54cd5 1219overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr)
2eec3b4e 1220 int pos;
61d54cd5 1221 int extend;
2eec3b4e
RS
1222 Lisp_Object **vec_ptr;
1223 int *len_ptr;
1224 int *next_ptr;
1ab256cb 1225{
2eec3b4e
RS
1226 Lisp_Object tail, overlay, start, end, result;
1227 int idx = 0;
1228 int len = *len_ptr;
1229 Lisp_Object *vec = *vec_ptr;
1230 int next = ZV;
61d54cd5
RS
1231 int inhibit_storing = 0;
1232
2eec3b4e
RS
1233 for (tail = current_buffer->overlays_before;
1234 CONSP (tail);
1235 tail = XCONS (tail)->cdr)
1236 {
52f8ec73
JB
1237 int startpos;
1238
2eec3b4e
RS
1239 overlay = XCONS (tail)->car;
1240 if (! OVERLAY_VALID (overlay))
52f8ec73 1241 abort ();
1ab256cb 1242
2eec3b4e
RS
1243 start = OVERLAY_START (overlay);
1244 end = OVERLAY_END (overlay);
1245 if (OVERLAY_POSITION (end) <= pos)
1246 break;
1247 startpos = OVERLAY_POSITION (start);
1248 if (startpos <= pos)
1249 {
1250 if (idx == len)
1251 {
61d54cd5
RS
1252 /* The supplied vector is full.
1253 Either make it bigger, or don't store any more in it. */
1254 if (extend)
1255 {
1256 *len_ptr = len *= 2;
1257 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
1258 *vec_ptr = vec;
1259 }
1260 else
1261 inhibit_storing = 1;
2eec3b4e 1262 }
61d54cd5
RS
1263
1264 if (!inhibit_storing)
1265 vec[idx] = overlay;
1266 /* Keep counting overlays even if we can't return them all. */
1267 idx++;
2eec3b4e
RS
1268 }
1269 else if (startpos < next)
1270 next = startpos;
1271 }
1272
1273 for (tail = current_buffer->overlays_after;
1274 CONSP (tail);
1275 tail = XCONS (tail)->cdr)
1ab256cb 1276 {
52f8ec73
JB
1277 int startpos;
1278
2eec3b4e
RS
1279 overlay = XCONS (tail)->car;
1280 if (! OVERLAY_VALID (overlay))
52f8ec73 1281 abort ();
2eec3b4e
RS
1282
1283 start = OVERLAY_START (overlay);
1284 end = OVERLAY_END (overlay);
1285 startpos = OVERLAY_POSITION (start);
52f8ec73 1286 if (pos < startpos)
2eec3b4e
RS
1287 {
1288 if (startpos < next)
1289 next = startpos;
1290 break;
1291 }
52f8ec73 1292 if (pos < OVERLAY_POSITION (end))
2eec3b4e
RS
1293 {
1294 if (idx == len)
1295 {
61d54cd5
RS
1296 if (extend)
1297 {
1298 *len_ptr = len *= 2;
1299 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
1300 *vec_ptr = vec;
1301 }
1302 else
1303 inhibit_storing = 1;
2eec3b4e 1304 }
61d54cd5
RS
1305
1306 if (!inhibit_storing)
1307 vec[idx] = overlay;
1308 idx++;
2eec3b4e 1309 }
1ab256cb
RM
1310 }
1311
2eec3b4e
RS
1312 *next_ptr = next;
1313 return idx;
1314}
1315\f
5c4f68f1 1316/* Shift overlays in BUF's overlay lists, to center the lists at POS. */
1ab256cb 1317
2eec3b4e 1318void
5c4f68f1
JB
1319recenter_overlay_lists (buf, pos)
1320 struct buffer *buf;
2eec3b4e
RS
1321 int pos;
1322{
1323 Lisp_Object overlay, tail, next, prev, beg, end;
1324
1325 /* See if anything in overlays_before should move to overlays_after. */
1326
1327 /* We don't strictly need prev in this loop; it should always be nil.
1328 But we use it for symmetry and in case that should cease to be true
1329 with some future change. */
1330 prev = Qnil;
5c4f68f1 1331 for (tail = buf->overlays_before;
2eec3b4e
RS
1332 CONSP (tail);
1333 prev = tail, tail = next)
1ab256cb 1334 {
2eec3b4e
RS
1335 next = XCONS (tail)->cdr;
1336 overlay = XCONS (tail)->car;
1337
1338 /* If the overlay is not valid, get rid of it. */
1339 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
1340#if 1
1341 abort ();
1342#else
2eec3b4e
RS
1343 {
1344 /* Splice the cons cell TAIL out of overlays_before. */
1345 if (!NILP (prev))
1346 XCONS (prev)->cdr = next;
1347 else
5c4f68f1 1348 buf->overlays_before = next;
2eec3b4e
RS
1349 tail = prev;
1350 continue;
1351 }
52f8ec73 1352#endif
1ab256cb 1353
2eec3b4e
RS
1354 beg = OVERLAY_START (overlay);
1355 end = OVERLAY_END (overlay);
1ab256cb 1356
2eec3b4e 1357 if (OVERLAY_POSITION (end) > pos)
1ab256cb 1358 {
2eec3b4e
RS
1359 /* OVERLAY needs to be moved. */
1360 int where = OVERLAY_POSITION (beg);
1361 Lisp_Object other, other_prev;
1362
1363 /* Splice the cons cell TAIL out of overlays_before. */
1364 if (!NILP (prev))
1365 XCONS (prev)->cdr = next;
1366 else
5c4f68f1 1367 buf->overlays_before = next;
2eec3b4e
RS
1368
1369 /* Search thru overlays_after for where to put it. */
1370 other_prev = Qnil;
5c4f68f1 1371 for (other = buf->overlays_after;
2eec3b4e
RS
1372 CONSP (other);
1373 other_prev = other, other = XCONS (other)->cdr)
1ab256cb 1374 {
2eec3b4e
RS
1375 Lisp_Object otherbeg, otheroverlay, follower;
1376 int win;
1377
1378 otheroverlay = XCONS (other)->car;
1379 if (! OVERLAY_VALID (otheroverlay))
52f8ec73 1380 abort ();
2eec3b4e
RS
1381
1382 otherbeg = OVERLAY_START (otheroverlay);
1383 if (OVERLAY_POSITION (otherbeg) >= where)
1384 break;
1ab256cb 1385 }
2eec3b4e
RS
1386
1387 /* Add TAIL to overlays_after before OTHER. */
1388 XCONS (tail)->cdr = other;
1389 if (!NILP (other_prev))
1390 XCONS (other_prev)->cdr = tail;
1ab256cb 1391 else
5c4f68f1 1392 buf->overlays_after = tail;
2eec3b4e 1393 tail = prev;
1ab256cb 1394 }
2eec3b4e
RS
1395 else
1396 /* We've reached the things that should stay in overlays_before.
1397 All the rest of overlays_before must end even earlier,
1398 so stop now. */
1399 break;
1400 }
1401
1402 /* See if anything in overlays_after should be in overlays_before. */
1403 prev = Qnil;
5c4f68f1 1404 for (tail = buf->overlays_after;
2eec3b4e
RS
1405 CONSP (tail);
1406 prev = tail, tail = next)
1407 {
1408 next = XCONS (tail)->cdr;
1409 overlay = XCONS (tail)->car;
1410
1411 /* If the overlay is not valid, get rid of it. */
1412 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
1413#if 1
1414 abort ();
1415#else
2eec3b4e
RS
1416 {
1417 /* Splice the cons cell TAIL out of overlays_after. */
1418 if (!NILP (prev))
1419 XCONS (prev)->cdr = next;
1420 else
5c4f68f1 1421 buf->overlays_after = next;
2eec3b4e
RS
1422 tail = prev;
1423 continue;
1424 }
52f8ec73 1425#endif
2eec3b4e
RS
1426
1427 beg = OVERLAY_START (overlay);
1428 end = OVERLAY_END (overlay);
1429
1430 /* Stop looking, when we know that nothing further
1431 can possibly end before POS. */
1432 if (OVERLAY_POSITION (beg) > pos)
1433 break;
1434
1435 if (OVERLAY_POSITION (end) <= pos)
1436 {
1437 /* OVERLAY needs to be moved. */
1438 int where = OVERLAY_POSITION (end);
1439 Lisp_Object other, other_prev;
1440
1441 /* Splice the cons cell TAIL out of overlays_after. */
1442 if (!NILP (prev))
1443 XCONS (prev)->cdr = next;
1444 else
5c4f68f1 1445 buf->overlays_after = next;
2eec3b4e
RS
1446
1447 /* Search thru overlays_before for where to put it. */
1448 other_prev = Qnil;
5c4f68f1 1449 for (other = buf->overlays_before;
2eec3b4e
RS
1450 CONSP (other);
1451 other_prev = other, other = XCONS (other)->cdr)
1452 {
1453 Lisp_Object otherend, otheroverlay;
1454 int win;
1455
1456 otheroverlay = XCONS (other)->car;
1457 if (! OVERLAY_VALID (otheroverlay))
52f8ec73 1458 abort ();
2eec3b4e
RS
1459
1460 otherend = OVERLAY_END (otheroverlay);
1461 if (OVERLAY_POSITION (otherend) <= where)
1462 break;
1463 }
1464
1465 /* Add TAIL to overlays_before before OTHER. */
1466 XCONS (tail)->cdr = other;
1467 if (!NILP (other_prev))
1468 XCONS (other_prev)->cdr = tail;
1469 else
5c4f68f1 1470 buf->overlays_before = tail;
2eec3b4e
RS
1471 tail = prev;
1472 }
1473 }
1474
5c4f68f1 1475 XFASTINT (buf->overlay_center) = pos;
2eec3b4e
RS
1476}
1477\f
52f8ec73
JB
1478DEFUN ("overlayp", Foverlayp, Soverlayp, 1, 1, 0,
1479 "Return t if OBJECT is an overlay.")
1480 (object)
1481 Lisp_Object object;
1482{
1483 return (OVERLAYP (object) ? Qt : Qnil);
1484}
1485
5c4f68f1
JB
1486DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 3, 0,
1487 "Create a new overlay with range BEG to END in BUFFER.\n\
1488If omitted, BUFFER defaults to the current buffer.\n\
2eec3b4e 1489BEG and END may be integers or markers.")
5c4f68f1
JB
1490 (beg, end, buffer)
1491 Lisp_Object beg, end, buffer;
2eec3b4e
RS
1492{
1493 Lisp_Object overlay;
5c4f68f1 1494 struct buffer *b;
2eec3b4e 1495
5c4f68f1
JB
1496 if (NILP (buffer))
1497 XSET (buffer, Lisp_Buffer, current_buffer);
883047b9
JB
1498 else
1499 CHECK_BUFFER (buffer, 2);
1500 if (MARKERP (beg)
1501 && ! EQ (Fmarker_buffer (beg), buffer))
1502 error ("Marker points into wrong buffer");
1503 if (MARKERP (end)
1504 && ! EQ (Fmarker_buffer (end), buffer))
1505 error ("Marker points into wrong buffer");
2eec3b4e 1506
883047b9
JB
1507 CHECK_NUMBER_COERCE_MARKER (beg, 1);
1508 CHECK_NUMBER_COERCE_MARKER (end, 1);
5c4f68f1 1509
883047b9 1510 if (XINT (beg) > XINT (end))
5c4f68f1 1511 {
883047b9
JB
1512 Lisp_Object temp = beg;
1513 beg = end; end = temp;
5c4f68f1 1514 }
883047b9
JB
1515
1516 b = XBUFFER (buffer);
1517
1518 beg = Fset_marker (Fmake_marker (), beg, buffer);
1519 end = Fset_marker (Fmake_marker (), end, buffer);
5c4f68f1
JB
1520
1521 overlay = Fcons (Fcons (beg, end), Qnil);
52f8ec73 1522 XSETTYPE (overlay, Lisp_Overlay);
2eec3b4e
RS
1523
1524 /* Put the new overlay on the wrong list. */
1525 end = OVERLAY_END (overlay);
5c4f68f1
JB
1526 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1527 b->overlays_after = Fcons (overlay, b->overlays_after);
2eec3b4e 1528 else
5c4f68f1 1529 b->overlays_before = Fcons (overlay, b->overlays_before);
2eec3b4e
RS
1530
1531 /* This puts it in the right list, and in the right order. */
5c4f68f1 1532 recenter_overlay_lists (b, XINT (b->overlay_center));
2eec3b4e 1533
b61982dd
JB
1534 /* We don't need to redisplay the region covered by the overlay, because
1535 the overlay has no properties at the moment. */
1536
2eec3b4e
RS
1537 return overlay;
1538}
1539
5c4f68f1
JB
1540DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
1541 "Set the endpoints of OVERLAY to BEG and END in BUFFER.\n\
3ece337a
JB
1542If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now.\n\
1543If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current\n\
1544buffer.")
5c4f68f1
JB
1545 (overlay, beg, end, buffer)
1546 Lisp_Object overlay, beg, end, buffer;
2eec3b4e 1547{
5c4f68f1
JB
1548 struct buffer *b;
1549
52f8ec73 1550 CHECK_OVERLAY (overlay, 0);
5c4f68f1
JB
1551 if (NILP (buffer))
1552 buffer = Fmarker_buffer (OVERLAY_START (overlay));
3ece337a
JB
1553 if (NILP (buffer))
1554 XSET (buffer, Lisp_Buffer, current_buffer);
5c4f68f1 1555 CHECK_BUFFER (buffer, 3);
883047b9
JB
1556
1557 if (MARKERP (beg)
1558 && ! EQ (Fmarker_buffer (beg), buffer))
1559 error ("Marker points into wrong buffer");
1560 if (MARKERP (end)
1561 && ! EQ (Fmarker_buffer (end), buffer))
1562 error ("Marker points into wrong buffer");
1563
b61982dd
JB
1564 CHECK_NUMBER_COERCE_MARKER (beg, 1);
1565 CHECK_NUMBER_COERCE_MARKER (end, 1);
1566
1567 if (XINT (beg) > XINT (end))
1568 {
1569 Lisp_Object temp = beg;
1570 beg = end; end = temp;
1571 }
1572
5c4f68f1 1573 b = XBUFFER (buffer);
2eec3b4e 1574
c82ed728 1575 /* If the overlay has changed buffers, do a thorough redisplay. */
e8b3a22d 1576 if (b != XMARKER (OVERLAY_START (overlay))->buffer)
c82ed728
JB
1577 windows_or_buffers_changed = 1;
1578 else
1579 /* Redisplay the area the overlay has just left, or just enclosed. */
1580 {
1581 Lisp_Object o_beg = OVERLAY_START (overlay);
1582 Lisp_Object o_end = OVERLAY_END (overlay);
1583 int change_beg, change_end;
1584
1585 o_beg = OVERLAY_POSITION (o_beg);
1586 o_end = OVERLAY_POSITION (o_end);
1587
1588 if (XINT (o_beg) == XINT (beg))
1589 redisplay_region (b, XINT (o_end), XINT (end));
1590 else if (XINT (o_end) == XINT (end))
1591 redisplay_region (b, XINT (o_beg), XINT (beg));
1592 else
1593 {
1594 if (XINT (beg) < XINT (o_beg)) o_beg = beg;
1595 if (XINT (end) > XINT (o_end)) o_end = end;
1596 redisplay_region (b, XINT (o_beg), XINT (o_end));
1597 }
1598 }
b61982dd 1599
5c4f68f1
JB
1600 b->overlays_before = Fdelq (overlay, b->overlays_before);
1601 b->overlays_after = Fdelq (overlay, b->overlays_after);
1602
1603 Fset_marker (OVERLAY_START (overlay), beg, buffer);
1604 Fset_marker (OVERLAY_END (overlay), end, buffer);
2eec3b4e
RS
1605
1606 /* Put the overlay on the wrong list. */
1607 end = OVERLAY_END (overlay);
5c4f68f1
JB
1608 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1609 b->overlays_after = Fcons (overlay, b->overlays_after);
2eec3b4e 1610 else
5c4f68f1 1611 b->overlays_before = Fcons (overlay, b->overlays_before);
2eec3b4e
RS
1612
1613 /* This puts it in the right list, and in the right order. */
5c4f68f1 1614 recenter_overlay_lists (b, XINT (b->overlay_center));
2eec3b4e
RS
1615
1616 return overlay;
1617}
1618
1619DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
5c4f68f1 1620 "Delete the overlay OVERLAY from its buffer.")
2eec3b4e 1621 (overlay)
5c4f68f1 1622 Lisp_Object overlay;
2eec3b4e 1623{
5c4f68f1
JB
1624 struct buffer *b;
1625
52f8ec73
JB
1626 CHECK_OVERLAY (overlay, 0);
1627
1628 b = XBUFFER (Fmarker_buffer (OVERLAY_START (overlay)));
5c4f68f1
JB
1629
1630 b->overlays_before = Fdelq (overlay, b->overlays_before);
1631 b->overlays_after = Fdelq (overlay, b->overlays_after);
1632
b61982dd
JB
1633 redisplay_region (b,
1634 OVERLAY_POSITION (OVERLAY_START (overlay)),
1635 OVERLAY_POSITION (OVERLAY_END (overlay)));
1636
3ece337a
JB
1637 Fset_marker (OVERLAY_START (overlay), Qnil, Qnil);
1638 Fset_marker (OVERLAY_END (overlay), Qnil, Qnil);
1639
2eec3b4e
RS
1640 return Qnil;
1641}
1642\f
8ebafa8d
JB
1643/* Overlay dissection functions. */
1644
1645DEFUN ("overlay-start", Foverlay_start, Soverlay_start, 1, 1, 0,
1646 "Return the position at which OVERLAY starts.")
1647 (overlay)
1648 Lisp_Object overlay;
1649{
1650 CHECK_OVERLAY (overlay, 0);
1651
1652 return (Fmarker_position (OVERLAY_START (overlay)));
1653}
1654
1655DEFUN ("overlay-end", Foverlay_end, Soverlay_end, 1, 1, 0,
1656 "Return the position at which OVERLAY ends.")
1657 (overlay)
1658 Lisp_Object overlay;
1659{
1660 CHECK_OVERLAY (overlay, 0);
1661
1662 return (Fmarker_position (OVERLAY_END (overlay)));
1663}
1664
1665DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0,
1666 "Return the buffer OVERLAY belongs to.")
1667 (overlay)
1668 Lisp_Object overlay;
1669{
1670 CHECK_OVERLAY (overlay, 0);
1671
1672 return Fmarker_buffer (OVERLAY_START (overlay));
1673}
1674
1675DEFUN ("overlay-properties", Foverlay_properties, Soverlay_properties, 1, 1, 0,
1676 "Return a list of the properties on OVERLAY.\n\
1677This is a copy of OVERLAY's plist; modifying its conses has no effect on\n\
1678OVERLAY.")
1679 (overlay)
1680 Lisp_Object overlay;
1681{
1682 CHECK_OVERLAY (overlay, 0);
1683
1684 return Fcopy_sequence (Fcdr_safe (XCONS (overlay)->cdr));
1685}
1686
1687\f
2eec3b4e
RS
1688DEFUN ("overlays-at", Foverlays_at, Soverlays_at, 1, 1, 0,
1689 "Return a list of the overays that contain position POS.")
1690 (pos)
1691 Lisp_Object pos;
1692{
1693 int noverlays;
1694 int endpos;
1695 Lisp_Object *overlay_vec;
1696 int len;
1697 Lisp_Object result;
1698
1699 CHECK_NUMBER_COERCE_MARKER (pos, 0);
1700
1701 len = 10;
1702 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
1703
1704 /* Put all the overlays we want in a vector in overlay_vec.
1705 Store the length in len. */
61d54cd5 1706 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, &endpos);
2eec3b4e
RS
1707
1708 /* Make a list of them all. */
1709 result = Flist (noverlays, overlay_vec);
1710
9ac0d9e0 1711 xfree (overlay_vec);
2eec3b4e
RS
1712 return result;
1713}
1714
1715DEFUN ("next-overlay-change", Fnext_overlay_change, Snext_overlay_change,
1716 1, 1, 0,
1717 "Return the next position after POS where an overlay starts or ends.")
1718 (pos)
1719 Lisp_Object pos;
1720{
1721 int noverlays;
1722 int endpos;
1723 Lisp_Object *overlay_vec;
1724 int len;
1725 Lisp_Object result;
1726 int i;
1727
1728 CHECK_NUMBER_COERCE_MARKER (pos, 0);
1729
1730 len = 10;
1731 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
1732
1733 /* Put all the overlays we want in a vector in overlay_vec.
1734 Store the length in len.
1735 endpos gets the position where the next overlay starts. */
61d54cd5 1736 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, &endpos);
2eec3b4e
RS
1737
1738 /* If any of these overlays ends before endpos,
1739 use its ending point instead. */
1740 for (i = 0; i < noverlays; i++)
1741 {
1742 Lisp_Object oend;
1743 int oendpos;
1744
1745 oend = OVERLAY_END (overlay_vec[i]);
1746 oendpos = OVERLAY_POSITION (oend);
1747 if (oendpos < endpos)
1748 endpos = oendpos;
1ab256cb
RM
1749 }
1750
9ac0d9e0 1751 xfree (overlay_vec);
2eec3b4e
RS
1752 return make_number (endpos);
1753}
1754\f
1755/* These functions are for debugging overlays. */
1756
1757DEFUN ("overlay-lists", Foverlay_lists, Soverlay_lists, 0, 0, 0,
1758 "Return a pair of lists giving all the overlays of the current buffer.\n\
1759The car has all the overlays before the overlay center;\n\
1760the cdr has all the overlays before the overlay center.\n\
1761Recentering overlays moves overlays between these lists.\n\
1762The lists you get are copies, so that changing them has no effect.\n\
1763However, the overlays you get are the real objects that the buffer uses.")
1764 ()
1765{
1766 Lisp_Object before, after;
1767 before = current_buffer->overlays_before;
1768 if (CONSP (before))
1769 before = Fcopy_sequence (before);
1770 after = current_buffer->overlays_after;
1771 if (CONSP (after))
1772 after = Fcopy_sequence (after);
1773
1774 return Fcons (before, after);
1775}
1776
1777DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0,
1778 "Recenter the overlays of the current buffer around position POS.")
1779 (pos)
1780 Lisp_Object pos;
1781{
1782 CHECK_NUMBER_COERCE_MARKER (pos, 0);
1783
5c4f68f1 1784 recenter_overlay_lists (current_buffer, XINT (pos));
2eec3b4e
RS
1785 return Qnil;
1786}
1787\f
1788DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
1789 "Get the property of overlay OVERLAY with property name NAME.")
1790 (overlay, prop)
1791 Lisp_Object overlay, prop;
1792{
1793 Lisp_Object plist;
52f8ec73
JB
1794
1795 CHECK_OVERLAY (overlay, 0);
1796
1797 for (plist = Fcdr_safe (XCONS (overlay)->cdr);
2eec3b4e
RS
1798 CONSP (plist) && CONSP (XCONS (plist)->cdr);
1799 plist = XCONS (XCONS (plist)->cdr)->cdr)
1800 {
1801 if (EQ (XCONS (plist)->car, prop))
1802 return XCONS (XCONS (plist)->cdr)->car;
1803 }
52f8ec73
JB
1804
1805 return Qnil;
2eec3b4e
RS
1806}
1807
1808DEFUN ("overlay-put", Foverlay_put, Soverlay_put, 3, 3, 0,
1809 "Set one property of overlay OVERLAY: give property PROP value VALUE.")
1810 (overlay, prop, value)
1811 Lisp_Object overlay, prop, value;
1812{
1813 Lisp_Object plist, tail;
1814
52f8ec73 1815 CHECK_OVERLAY (overlay, 0);
b61982dd
JB
1816
1817 redisplay_region (XMARKER (OVERLAY_START (overlay))->buffer,
1818 OVERLAY_POSITION (OVERLAY_START (overlay)),
1819 OVERLAY_POSITION (OVERLAY_END (overlay)));
1820
52f8ec73 1821 plist = Fcdr_safe (XCONS (overlay)->cdr);
2eec3b4e
RS
1822
1823 for (tail = plist;
1824 CONSP (tail) && CONSP (XCONS (tail)->cdr);
1825 tail = XCONS (XCONS (tail)->cdr)->cdr)
1826 {
1827 if (EQ (XCONS (tail)->car, prop))
1828 return XCONS (XCONS (tail)->cdr)->car = value;
1829 }
1830
1831 if (! CONSP (XCONS (overlay)->cdr))
1832 XCONS (overlay)->cdr = Fcons (Qnil, Qnil);
1833
1834 XCONS (XCONS (overlay)->cdr)->cdr
1835 = Fcons (prop, Fcons (value, plist));
1836
1837 return value;
1ab256cb
RM
1838}
1839\f
0fa3ba92
JB
1840/* Somebody has tried to store NEWVAL into the buffer-local slot with
1841 offset XUINT (valcontents), and NEWVAL has an unacceptable type. */
1842void
1843buffer_slot_type_mismatch (valcontents, newval)
1844 Lisp_Object valcontents, newval;
1845{
1846 unsigned int offset = XUINT (valcontents);
5fcd022d 1847 unsigned char *symbol_name =
0fa3ba92
JB
1848 (XSYMBOL (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols))
1849 ->name->data);
1850 char *type_name;
1851
1852 switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types)))
1853 {
1854 case Lisp_Int: type_name = "integers"; break;
1855 case Lisp_String: type_name = "strings"; break;
1856 case Lisp_Marker: type_name = "markers"; break;
1857 case Lisp_Symbol: type_name = "symbols"; break;
1858 case Lisp_Cons: type_name = "lists"; break;
5fcd022d 1859 case Lisp_Vector: type_name = "vectors"; break;
0fa3ba92
JB
1860 default:
1861 abort ();
1862 }
1863
1864 error ("only %s should be stored in the buffer-local variable %s",
1865 type_name, symbol_name);
1866}
1867\f
1ab256cb
RM
1868init_buffer_once ()
1869{
1870 register Lisp_Object tem;
1871
1872 /* Make sure all markable slots in buffer_defaults
1873 are initialized reasonably, so mark_buffer won't choke. */
1874 reset_buffer (&buffer_defaults);
1875 reset_buffer (&buffer_local_symbols);
1876 XSET (Vbuffer_defaults, Lisp_Buffer, &buffer_defaults);
1877 XSET (Vbuffer_local_symbols, Lisp_Buffer, &buffer_local_symbols);
1878
1879 /* Set up the default values of various buffer slots. */
1880 /* Must do these before making the first buffer! */
1881
1882 /* real setup is done in loaddefs.el */
1883 buffer_defaults.mode_line_format = build_string ("%-");
1884 buffer_defaults.abbrev_mode = Qnil;
1885 buffer_defaults.overwrite_mode = Qnil;
1886 buffer_defaults.case_fold_search = Qt;
1887 buffer_defaults.auto_fill_function = Qnil;
1888 buffer_defaults.selective_display = Qnil;
1889#ifndef old
1890 buffer_defaults.selective_display_ellipses = Qt;
1891#endif
1892 buffer_defaults.abbrev_table = Qnil;
1893 buffer_defaults.display_table = Qnil;
1ab256cb 1894 buffer_defaults.undo_list = Qnil;
c48f61ef 1895 buffer_defaults.mark_active = Qnil;
2eec3b4e
RS
1896 buffer_defaults.overlays_before = Qnil;
1897 buffer_defaults.overlays_after = Qnil;
1898 XFASTINT (buffer_defaults.overlay_center) = 1;
1ab256cb
RM
1899
1900 XFASTINT (buffer_defaults.tab_width) = 8;
1901 buffer_defaults.truncate_lines = Qnil;
1902 buffer_defaults.ctl_arrow = Qt;
1903
1904 XFASTINT (buffer_defaults.fill_column) = 70;
1905 XFASTINT (buffer_defaults.left_margin) = 0;
1906
1907 /* Assign the local-flags to the slots that have default values.
1908 The local flag is a bit that is used in the buffer
1909 to say that it has its own local value for the slot.
1910 The local flag bits are in the local_var_flags slot of the buffer. */
1911
1912 /* Nothing can work if this isn't true */
1913 if (sizeof (int) != sizeof (Lisp_Object)) abort ();
1914
1915 /* 0 means not a lisp var, -1 means always local, else mask */
1916 bzero (&buffer_local_flags, sizeof buffer_local_flags);
1917 XFASTINT (buffer_local_flags.filename) = -1;
1918 XFASTINT (buffer_local_flags.directory) = -1;
1919 XFASTINT (buffer_local_flags.backed_up) = -1;
1920 XFASTINT (buffer_local_flags.save_length) = -1;
1921 XFASTINT (buffer_local_flags.auto_save_file_name) = -1;
1922 XFASTINT (buffer_local_flags.read_only) = -1;
1923 XFASTINT (buffer_local_flags.major_mode) = -1;
1924 XFASTINT (buffer_local_flags.mode_name) = -1;
1925 XFASTINT (buffer_local_flags.undo_list) = -1;
c48f61ef 1926 XFASTINT (buffer_local_flags.mark_active) = -1;
1ab256cb
RM
1927
1928 XFASTINT (buffer_local_flags.mode_line_format) = 1;
1929 XFASTINT (buffer_local_flags.abbrev_mode) = 2;
1930 XFASTINT (buffer_local_flags.overwrite_mode) = 4;
1931 XFASTINT (buffer_local_flags.case_fold_search) = 8;
1932 XFASTINT (buffer_local_flags.auto_fill_function) = 0x10;
1933 XFASTINT (buffer_local_flags.selective_display) = 0x20;
1934#ifndef old
1935 XFASTINT (buffer_local_flags.selective_display_ellipses) = 0x40;
1936#endif
1937 XFASTINT (buffer_local_flags.tab_width) = 0x80;
1938 XFASTINT (buffer_local_flags.truncate_lines) = 0x100;
1939 XFASTINT (buffer_local_flags.ctl_arrow) = 0x200;
1940 XFASTINT (buffer_local_flags.fill_column) = 0x400;
1941 XFASTINT (buffer_local_flags.left_margin) = 0x800;
1942 XFASTINT (buffer_local_flags.abbrev_table) = 0x1000;
1943 XFASTINT (buffer_local_flags.display_table) = 0x2000;
1ab256cb
RM
1944 XFASTINT (buffer_local_flags.syntax_table) = 0x8000;
1945
1946 Vbuffer_alist = Qnil;
1947 current_buffer = 0;
1948 all_buffers = 0;
1949
1950 QSFundamental = build_string ("Fundamental");
1951
1952 Qfundamental_mode = intern ("fundamental-mode");
1953 buffer_defaults.major_mode = Qfundamental_mode;
1954
1955 Qmode_class = intern ("mode-class");
1956
1957 Qprotected_field = intern ("protected-field");
1958
1959 Qpermanent_local = intern ("permanent-local");
1960
1961 Qkill_buffer_hook = intern ("kill-buffer-hook");
1962
1963 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
1964 /* super-magic invisible buffer */
1965 Vbuffer_alist = Qnil;
1966
ffd56f97 1967 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1ab256cb
RM
1968}
1969
1970init_buffer ()
1971{
1972 char buf[MAXPATHLEN+1];
2381d133
JB
1973 char *pwd;
1974 struct stat dotstat, pwdstat;
1ab256cb
RM
1975
1976 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
2381d133
JB
1977
1978 /* If PWD is accurate, use it instead of calling getwd. This is faster
1979 when PWD is right, and may avoid a fatal error. */
1980 if ((pwd = getenv ("PWD")) != 0 && *pwd == '/'
1981 && stat (pwd, &pwdstat) == 0
1982 && stat (".", &dotstat) == 0
1983 && dotstat.st_ino == pwdstat.st_ino
1984 && dotstat.st_dev == pwdstat.st_dev
1985 && strlen (pwd) < MAXPATHLEN)
1986 strcpy (buf, pwd);
1987 else if (getwd (buf) == 0)
1ab256cb
RM
1988 fatal ("`getwd' failed: %s.\n", buf);
1989
1990#ifndef VMS
1991 /* Maybe this should really use some standard subroutine
1992 whose definition is filename syntax dependent. */
1993 if (buf[strlen (buf) - 1] != '/')
1994 strcat (buf, "/");
1995#endif /* not VMS */
1996 current_buffer->directory = build_string (buf);
1997}
1998
1999/* initialize the buffer routines */
2000syms_of_buffer ()
2001{
188d4d11
RM
2002 extern Lisp_Object Qdisabled;
2003
1ab256cb
RM
2004 staticpro (&Vbuffer_defaults);
2005 staticpro (&Vbuffer_local_symbols);
2006 staticpro (&Qfundamental_mode);
2007 staticpro (&Qmode_class);
2008 staticpro (&QSFundamental);
2009 staticpro (&Vbuffer_alist);
2010 staticpro (&Qprotected_field);
2011 staticpro (&Qpermanent_local);
2012 staticpro (&Qkill_buffer_hook);
52f8ec73
JB
2013 staticpro (&Qoverlayp);
2014
2015 Qoverlayp = intern ("overlayp");
1ab256cb
RM
2016
2017 Fput (Qprotected_field, Qerror_conditions,
2018 Fcons (Qprotected_field, Fcons (Qerror, Qnil)));
2019 Fput (Qprotected_field, Qerror_message,
2020 build_string ("Attempt to modify a protected field"));
2021
188d4d11
RM
2022 Fput (intern ("erase-buffer"), Qdisabled, Qt);
2023
1ab256cb
RM
2024 /* All these use DEFVAR_LISP_NOPRO because the slots in
2025 buffer_defaults will all be marked via Vbuffer_defaults. */
2026
2027 DEFVAR_LISP_NOPRO ("default-mode-line-format",
2028 &buffer_defaults.mode_line_format,
2029 "Default value of `mode-line-format' for buffers that don't override it.\n\
2030This is the same as (default-value 'mode-line-format).");
2031
2032 DEFVAR_LISP_NOPRO ("default-abbrev-mode",
2033 &buffer_defaults.abbrev_mode,
2034 "Default value of `abbrev-mode' for buffers that do not override it.\n\
2035This is the same as (default-value 'abbrev-mode).");
2036
2037 DEFVAR_LISP_NOPRO ("default-ctl-arrow",
2038 &buffer_defaults.ctl_arrow,
2039 "Default value of `ctl-arrow' for buffers that do not override it.\n\
2040This is the same as (default-value 'ctl-arrow).");
2041
2042 DEFVAR_LISP_NOPRO ("default-truncate-lines",
2043 &buffer_defaults.truncate_lines,
2044 "Default value of `truncate-lines' for buffers that do not override it.\n\
2045This is the same as (default-value 'truncate-lines).");
2046
2047 DEFVAR_LISP_NOPRO ("default-fill-column",
2048 &buffer_defaults.fill_column,
2049 "Default value of `fill-column' for buffers that do not override it.\n\
2050This is the same as (default-value 'fill-column).");
2051
2052 DEFVAR_LISP_NOPRO ("default-left-margin",
2053 &buffer_defaults.left_margin,
2054 "Default value of `left-margin' for buffers that do not override it.\n\
2055This is the same as (default-value 'left-margin).");
2056
2057 DEFVAR_LISP_NOPRO ("default-tab-width",
2058 &buffer_defaults.tab_width,
2059 "Default value of `tab-width' for buffers that do not override it.\n\
2060This is the same as (default-value 'tab-width).");
2061
2062 DEFVAR_LISP_NOPRO ("default-case-fold-search",
2063 &buffer_defaults.case_fold_search,
2064 "Default value of `case-fold-search' for buffers that don't override it.\n\
2065This is the same as (default-value 'case-fold-search).");
2066
0fa3ba92
JB
2067 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
2068 Qnil, 0);
1ab256cb
RM
2069
2070/* This doc string is too long for cpp; cpp dies if it isn't in a comment.
2071 But make-docfile finds it!
2072 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
bec44fd6 2073 Qnil,
1ab256cb
RM
2074 "Template for displaying mode line for current buffer.\n\
2075Each buffer has its own value of this variable.\n\
2076Value may be a string, a symbol or a list or cons cell.\n\
2077For a symbol, its value is used (but it is ignored if t or nil).\n\
2078 A string appearing directly as the value of a symbol is processed verbatim\n\
2079 in that the %-constructs below are not recognized.\n\
2080For a list whose car is a symbol, the symbol's value is taken,\n\
2081 and if that is non-nil, the cadr of the list is processed recursively.\n\
2082 Otherwise, the caddr of the list (if there is one) is processed.\n\
2083For a list whose car is a string or list, each element is processed\n\
2084 recursively and the results are effectively concatenated.\n\
2085For a list whose car is an integer, the cdr of the list is processed\n\
2086 and padded (if the number is positive) or truncated (if negative)\n\
2087 to the width specified by that number.\n\
2088A string is printed verbatim in the mode line except for %-constructs:\n\
2089 (%-constructs are allowed when the string is the entire mode-line-format\n\
2090 or when it is found in a cons-cell or a list)\n\
2091 %b -- print buffer name. %f -- print visited file name.\n\
2092 %* -- print *, % or hyphen. %m -- print value of mode-name (obsolete).\n\
a97c374a 2093 %s -- print process status. %l -- print the current line number.\n\
1ab256cb
RM
2094 %p -- print percent of buffer above top of window, or top, bot or all.\n\
2095 %n -- print Narrow if appropriate.\n\
2096 %[ -- print one [ for each recursive editing level. %] similar.\n\
2097 %% -- print %. %- -- print infinitely many dashes.\n\
2098Decimal digits after the % specify field width to which to pad.");
2099*/
2100
2101 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode,
2102 "*Major mode for new buffers. Defaults to `fundamental-mode'.\n\
2103nil here means use current buffer's major mode.");
2104
2105 DEFVAR_PER_BUFFER ("major-mode", &current_buffer->major_mode,
0fa3ba92 2106 make_number (Lisp_Symbol),
1ab256cb
RM
2107 "Symbol for current buffer's major mode.");
2108
2109 DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
0fa3ba92 2110 make_number (Lisp_String),
1ab256cb
RM
2111 "Pretty name of current buffer's major mode (a string).");
2112
0fa3ba92 2113 DEFVAR_PER_BUFFER ("abbrev-mode", &current_buffer->abbrev_mode, Qnil,
1ab256cb
RM
2114 "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\
2115Automatically becomes buffer-local when set in any fashion.");
2116
2117 DEFVAR_PER_BUFFER ("case-fold-search", &current_buffer->case_fold_search,
0fa3ba92 2118 Qnil,
1ab256cb
RM
2119 "*Non-nil if searches should ignore case.\n\
2120Automatically becomes buffer-local when set in any fashion.");
2121
2122 DEFVAR_PER_BUFFER ("fill-column", &current_buffer->fill_column,
0fa3ba92 2123 make_number (Lisp_Int),
1ab256cb
RM
2124 "*Column beyond which automatic line-wrapping should happen.\n\
2125Automatically becomes buffer-local when set in any fashion.");
2126
2127 DEFVAR_PER_BUFFER ("left-margin", &current_buffer->left_margin,
0fa3ba92 2128 make_number (Lisp_Int),
1ab256cb
RM
2129 "*Column for the default indent-line-function to indent to.\n\
2130Linefeed indents to this column in Fundamental mode.\n\
2131Automatically becomes buffer-local when set in any fashion.");
2132
2133 DEFVAR_PER_BUFFER ("tab-width", &current_buffer->tab_width,
0fa3ba92 2134 make_number (Lisp_Int),
1ab256cb
RM
2135 "*Distance between tab stops (for display of tab characters), in columns.\n\
2136Automatically becomes buffer-local when set in any fashion.");
2137
0fa3ba92 2138 DEFVAR_PER_BUFFER ("ctl-arrow", &current_buffer->ctl_arrow, Qnil,
1ab256cb
RM
2139 "*Non-nil means display control chars with uparrow.\n\
2140Nil means use backslash and octal digits.\n\
2141Automatically becomes buffer-local when set in any fashion.\n\
2142This variable does not apply to characters whose display is specified\n\
2143in the current display table (if there is one).");
2144
0fa3ba92 2145 DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
1ab256cb
RM
2146 "*Non-nil means do not display continuation lines;\n\
2147give each line of text one screen line.\n\
2148Automatically becomes buffer-local when set in any fashion.\n\
2149\n\
2150Note that this is overridden by the variable\n\
2151`truncate-partial-width-windows' if that variable is non-nil\n\
502b9b64 2152and this buffer is not full-frame width.");
1ab256cb
RM
2153
2154 DEFVAR_PER_BUFFER ("default-directory", &current_buffer->directory,
0fa3ba92 2155 make_number (Lisp_String),
1ab256cb
RM
2156 "Name of default directory of current buffer. Should end with slash.\n\
2157Each buffer has its own value of this variable.");
2158
2159 DEFVAR_PER_BUFFER ("auto-fill-function", &current_buffer->auto_fill_function,
0fa3ba92 2160 Qnil,
1ab256cb
RM
2161 "Function called (if non-nil) to perform auto-fill.\n\
2162It is called after self-inserting a space at a column beyond `fill-column'.\n\
2163Each buffer has its own value of this variable.\n\
2164NOTE: This variable is not an ordinary hook;\n\
2165It may not be a list of functions.");
2166
2167 DEFVAR_PER_BUFFER ("buffer-file-name", &current_buffer->filename,
0fa3ba92 2168 make_number (Lisp_String),
1ab256cb
RM
2169 "Name of file visited in current buffer, or nil if not visiting a file.\n\
2170Each buffer has its own value of this variable.");
2171
2172 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
3f5fcd47 2173 &current_buffer->auto_save_file_name,
0fa3ba92 2174 make_number (Lisp_String),
1ab256cb
RM
2175 "Name of file for auto-saving current buffer,\n\
2176or nil if buffer should not be auto-saved.\n\
2177Each buffer has its own value of this variable.");
2178
0fa3ba92 2179 DEFVAR_PER_BUFFER ("buffer-read-only", &current_buffer->read_only, Qnil,
1ab256cb
RM
2180 "Non-nil if this buffer is read-only.\n\
2181Each buffer has its own value of this variable.");
2182
0fa3ba92 2183 DEFVAR_PER_BUFFER ("buffer-backed-up", &current_buffer->backed_up, Qnil,
1ab256cb
RM
2184 "Non-nil if this buffer's file has been backed up.\n\
2185Backing up is done before the first time the file is saved.\n\
2186Each buffer has its own value of this variable.");
2187
2188 DEFVAR_PER_BUFFER ("buffer-saved-size", &current_buffer->save_length,
0fa3ba92 2189 make_number (Lisp_Int),
1ab256cb
RM
2190 "Length of current buffer when last read in, saved or auto-saved.\n\
21910 initially.\n\
2192Each buffer has its own value of this variable.");
2193
2194 DEFVAR_PER_BUFFER ("selective-display", &current_buffer->selective_display,
0fa3ba92 2195 Qnil,
1ab256cb
RM
2196 "Non-nil enables selective display:\n\
2197Integer N as value means display only lines\n\
2198 that start with less than n columns of space.\n\
2199A value of t means, after a ^M, all the rest of the line is invisible.\n\
2200 Then ^M's in the file are written into files as newlines.\n\n\
2201Automatically becomes buffer-local when set in any fashion.");
2202
2203#ifndef old
2204 DEFVAR_PER_BUFFER ("selective-display-ellipses",
2205 &current_buffer->selective_display_ellipses,
0fa3ba92 2206 Qnil,
1ab256cb
RM
2207 "t means display ... on previous line when a line is invisible.\n\
2208Automatically becomes buffer-local when set in any fashion.");
2209#endif
2210
0fa3ba92 2211 DEFVAR_PER_BUFFER ("overwrite-mode", &current_buffer->overwrite_mode, Qnil,
1ab256cb 2212 "Non-nil if self-insertion should replace existing text.\n\
6bbb0d4a
JB
2213If non-nil and not `overwrite-mode-binary', self-insertion still\n\
2214inserts at the end of a line, and inserts when point is before a tab,\n\
2e94b813 2215until the tab is filled in.\n\
6bbb0d4a 2216If `overwrite-mode-binary', self-insertion replaces newlines and tabs too.\n\
1ab256cb
RM
2217Automatically becomes buffer-local when set in any fashion.");
2218
2219 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
5d305367 2220 Qnil,
1ab256cb
RM
2221 "Display table that controls display of the contents of current buffer.\n\
2222Automatically becomes buffer-local when set in any fashion.\n\
2223The display table is a vector created with `make-display-table'.\n\
2224The first 256 elements control how to display each possible text character.\n\
6158b3b0 2225Each value should be a vector of characters or nil;\n\
1ab256cb 2226nil means display the character in the default fashion.\n\
6158b3b0
JB
2227The remaining five elements control the display of\n\
2228 the end of a truncated screen line (element 256, a single character);\n\
2229 the end of a continued line (element 257, a single character);\n\
2230 the escape character used to display character codes in octal\n\
2231 (element 258, a single character);\n\
2232 the character used as an arrow for control characters (element 259,\n\
2233 a single character);\n\
2234 the decoration indicating the presence of invisible lines (element 260,\n\
2235 a vector of characters).\n\
1ab256cb
RM
2236If this variable is nil, the value of `standard-display-table' is used.\n\
2237Each window can have its own, overriding display table.");
2238
1ab256cb
RM
2239/*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
2240 "Don't ask.");
2241*/
01050cb5 2242 DEFVAR_LISP ("before-change-function", &Vbefore_change_function,
1ab256cb
RM
2243 "Function to call before each text change.\n\
2244Two arguments are passed to the function: the positions of\n\
2245the beginning and end of the range of old text to be changed.\n\
2246\(For an insertion, the beginning and end are at the same place.)\n\
2247No information is given about the length of the text after the change.\n\
2248position of the change\n\
2249\n\
2250While executing the `before-change-function', changes to buffers do not\n\
2251cause calls to any `before-change-function' or `after-change-function'.");
2252 Vbefore_change_function = Qnil;
2253
2254 DEFVAR_LISP ("after-change-function", &Vafter_change_function,
2255 "Function to call after each text change.\n\
2256Three arguments are passed to the function: the positions of\n\
2257the beginning and end of the range of changed text,\n\
2258and the length of the pre-change text replaced by that range.\n\
2259\(For an insertion, the pre-change length is zero;\n\
2260for a deletion, that length is the number of characters deleted,\n\
2261and the post-change beginning and end are at the same place.)\n\
2262\n\
2263While executing the `after-change-function', changes to buffers do not\n\
2264cause calls to any `before-change-function' or `after-change-function'.");
2265 Vafter_change_function = Qnil;
2266
dbc4e1c1
JB
2267 DEFVAR_LISP ("first-change-hook", &Vfirst_change_hook,
2268 "A list of functions to call before changing a buffer which is unmodified.\n\
2269The functions are run using the `run-hooks' function.");
2270 Vfirst_change_hook = Qnil;
2271 Qfirst_change_hook = intern ("first-change-hook");
2272 staticpro (&Qfirst_change_hook);
1ab256cb 2273
3f5fcd47 2274 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list, Qnil,
1ab256cb
RM
2275 "List of undo entries in current buffer.\n\
2276Recent changes come first; older changes follow newer.\n\
2277\n\
2278An entry (START . END) represents an insertion which begins at\n\
2279position START and ends at position END.\n\
2280\n\
2281An entry (TEXT . POSITION) represents the deletion of the string TEXT\n\
2282from (abs POSITION). If POSITION is positive, point was at the front\n\
2283of the text being deleted; if negative, point was at the end.\n\
2284\n\
2285An entry (t HIGHWORD LOWWORD) indicates that the buffer had been\n\
2286previously unmodified. HIGHWORD and LOWWORD are the high and low\n\
228716-bit words of the buffer's modification count at the time. If the\n\
2288modification count of the most recent save is different, this entry is\n\
2289obsolete.\n\
2290\n\
483c1fd3
RS
2291An entry (nil PROP VAL BEG . END) indicates that a text property\n\
2292was modified between BEG and END. PROP is the property name,\n\
2293and VAL is the old value.\n\
2294\n\
bec44fd6
JB
2295An entry of the form POSITION indicates that point was at the buffer\n\
2296location given by the integer. Undoing an entry of this form places\n\
2297point at POSITION.\n\
2298\n\
1ab256cb
RM
2299nil marks undo boundaries. The undo command treats the changes\n\
2300between two undo boundaries as a single step to be undone.\n\
2301\n\
bec44fd6 2302If the value of the variable is t, undo information is not recorded.");
1ab256cb 2303
c48f61ef
RS
2304 DEFVAR_PER_BUFFER ("mark-active", &current_buffer->mark_active, Qnil,
2305 "Non-nil means the mark and region are currently active in this buffer.\n\
2306Automatically local in all buffers.");
2307
2308 DEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode,
2309 "*Non-nil means deactivate the mark when the buffer contents change.");
2310 Vtransient_mark_mode = Qnil;
2311
1ab256cb
RM
2312 defsubr (&Sbuffer_list);
2313 defsubr (&Sget_buffer);
2314 defsubr (&Sget_file_buffer);
2315 defsubr (&Sget_buffer_create);
01050cb5 2316 defsubr (&Sgenerate_new_buffer_name);
1ab256cb
RM
2317 defsubr (&Sbuffer_name);
2318/*defsubr (&Sbuffer_number);*/
2319 defsubr (&Sbuffer_file_name);
2320 defsubr (&Sbuffer_local_variables);
2321 defsubr (&Sbuffer_modified_p);
2322 defsubr (&Sset_buffer_modified_p);
2323 defsubr (&Sbuffer_modified_tick);
2324 defsubr (&Srename_buffer);
2325 defsubr (&Sother_buffer);
2326 defsubr (&Sbuffer_disable_undo);
2327 defsubr (&Sbuffer_enable_undo);
2328 defsubr (&Skill_buffer);
2329 defsubr (&Serase_buffer);
2330 defsubr (&Sswitch_to_buffer);
2331 defsubr (&Spop_to_buffer);
2332 defsubr (&Scurrent_buffer);
2333 defsubr (&Sset_buffer);
2334 defsubr (&Sbarf_if_buffer_read_only);
2335 defsubr (&Sbury_buffer);
2336 defsubr (&Slist_buffers);
2337 defsubr (&Skill_all_local_variables);
2eec3b4e 2338
52f8ec73 2339 defsubr (&Soverlayp);
2eec3b4e
RS
2340 defsubr (&Smake_overlay);
2341 defsubr (&Sdelete_overlay);
2342 defsubr (&Smove_overlay);
8ebafa8d
JB
2343 defsubr (&Soverlay_start);
2344 defsubr (&Soverlay_end);
2345 defsubr (&Soverlay_buffer);
2346 defsubr (&Soverlay_properties);
2eec3b4e
RS
2347 defsubr (&Soverlays_at);
2348 defsubr (&Snext_overlay_change);
2349 defsubr (&Soverlay_recenter);
2350 defsubr (&Soverlay_lists);
2351 defsubr (&Soverlay_get);
2352 defsubr (&Soverlay_put);
1ab256cb
RM
2353}
2354
2355keys_of_buffer ()
2356{
2357 initial_define_key (control_x_map, 'b', "switch-to-buffer");
2358 initial_define_key (control_x_map, 'k', "kill-buffer");
2359 initial_define_key (control_x_map, Ctl ('B'), "list-buffers");
2360}