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