(struct x_display_info): Struct renamed from x_screen.
[bpt/emacs.git] / src / buffer.c
CommitLineData
1ab256cb 1/* Buffer manipulation primitives for GNU Emacs.
4158c17d 2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994
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
18160b98 31#include <config.h>
1ab256cb 32#include "lisp.h"
21cf4cf8 33#include "intervals.h"
1ab256cb
RM
34#include "window.h"
35#include "commands.h"
36#include "buffer.h"
28e969dd 37#include "region-cache.h"
1ab256cb 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 ();
173f2a64 103static void call_overlay_mod_hooks ();
1ab256cb
RM
104
105/* Alist of all buffer names vs the buffers. */
106/* This used to be a variable, but is no longer,
107 to prevent lossage due to user rplac'ing this alist or its elements. */
108Lisp_Object Vbuffer_alist;
109
110/* Functions to call before and after each text change. */
111Lisp_Object Vbefore_change_function;
112Lisp_Object Vafter_change_function;
5f079267
RS
113Lisp_Object Vbefore_change_functions;
114Lisp_Object Vafter_change_functions;
1ab256cb 115
c48f61ef
RS
116Lisp_Object Vtransient_mark_mode;
117
a96b68f1
RS
118/* t means ignore all read-only text properties.
119 A list means ignore such a property if its value is a member of the list.
120 Any non-nil value means ignore buffer-read-only. */
121Lisp_Object Vinhibit_read_only;
122
dcdffbf6
RS
123/* List of functions to call that can query about killing a buffer.
124 If any of these functions returns nil, we don't kill it. */
125Lisp_Object Vkill_buffer_query_functions;
126
dbc4e1c1
JB
127/* List of functions to call before changing an unmodified buffer. */
128Lisp_Object Vfirst_change_hook;
129Lisp_Object Qfirst_change_hook;
1ab256cb
RM
130
131Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
132
133Lisp_Object Qprotected_field;
134
135Lisp_Object QSFundamental; /* A string "Fundamental" */
136
137Lisp_Object Qkill_buffer_hook;
138
5fe0b67e
RS
139Lisp_Object Qget_file_buffer;
140
52f8ec73
JB
141Lisp_Object Qoverlayp;
142
9d7608b7 143Lisp_Object Qpriority, Qwindow, Qevaporate;
5985d248 144
294d215f
RS
145Lisp_Object Qmodification_hooks;
146Lisp_Object Qinsert_in_front_hooks;
147Lisp_Object Qinsert_behind_hooks;
148
1ab256cb
RM
149/* For debugging; temporary. See set_buffer_internal. */
150/* Lisp_Object Qlisp_mode, Vcheck_symbol; */
151
152nsberror (spec)
153 Lisp_Object spec;
154{
a7a60ce9 155 if (STRINGP (spec))
1ab256cb
RM
156 error ("No buffer named %s", XSTRING (spec)->data);
157 error ("Invalid buffer argument");
158}
159\f
160DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
161 "Return a list of all existing live buffers.")
162 ()
163{
164 return Fmapcar (Qcdr, Vbuffer_alist);
165}
166
167DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
168 "Return the buffer named NAME (a string).\n\
169If there is no live buffer named NAME, return nil.\n\
170NAME may also be a buffer; if so, the value is that buffer.")
171 (name)
172 register Lisp_Object name;
173{
a7a60ce9 174 if (BUFFERP (name))
1ab256cb
RM
175 return name;
176 CHECK_STRING (name, 0);
177
178 return Fcdr (Fassoc (name, Vbuffer_alist));
179}
180
181DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
182 "Return the buffer visiting file FILENAME (a string).\n\
92194d02 183The buffer's `buffer-file-name' must match exactly the expansion of FILENAME.\n\
11da5363
RS
184If there is no such live buffer, return nil.\n\
185See also `find-buffer-visiting'.")
1ab256cb
RM
186 (filename)
187 register Lisp_Object filename;
188{
189 register Lisp_Object tail, buf, tem;
5fe0b67e
RS
190 Lisp_Object handler;
191
1ab256cb
RM
192 CHECK_STRING (filename, 0);
193 filename = Fexpand_file_name (filename, Qnil);
194
5fe0b67e
RS
195 /* If the file name has special constructs in it,
196 call the corresponding file handler. */
a617e913 197 handler = Ffind_file_name_handler (filename, Qget_file_buffer);
5fe0b67e
RS
198 if (!NILP (handler))
199 return call2 (handler, Qget_file_buffer, filename);
200
1ab256cb
RM
201 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr)
202 {
203 buf = Fcdr (XCONS (tail)->car);
a7a60ce9
KH
204 if (!BUFFERP (buf)) continue;
205 if (!STRINGP (XBUFFER (buf)->filename)) continue;
1ab256cb 206 tem = Fstring_equal (XBUFFER (buf)->filename, filename);
265a9e55 207 if (!NILP (tem))
1ab256cb
RM
208 return buf;
209 }
210 return Qnil;
211}
212
213/* Incremented for each buffer created, to assign the buffer number. */
214int buffer_count;
215
216DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
217 "Return the buffer named NAME, or create such a buffer and return it.\n\
218A new buffer is created if there is no live buffer named NAME.\n\
b44895bc 219If NAME starts with a space, the new buffer does not keep undo information.\n\
1ab256cb
RM
220If NAME is a buffer instead of a string, then it is the value returned.\n\
221The value is never nil.")
222 (name)
223 register Lisp_Object name;
224{
225 register Lisp_Object buf, function, tem;
226 int count = specpdl_ptr - specpdl;
227 register struct buffer *b;
228
229 buf = Fget_buffer (name);
265a9e55 230 if (!NILP (buf))
1ab256cb
RM
231 return buf;
232
31cd83e9
KH
233 if (XSTRING (name)->size == 0)
234 error ("Empty string for buffer name is not allowed");
235
9ac0d9e0 236 b = (struct buffer *) xmalloc (sizeof (struct buffer));
1ab256cb
RM
237
238 BUF_GAP_SIZE (b) = 20;
9ac0d9e0 239 BLOCK_INPUT;
1ab256cb 240 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b));
9ac0d9e0 241 UNBLOCK_INPUT;
1ab256cb
RM
242 if (! BUF_BEG_ADDR (b))
243 memory_full ();
244
245 BUF_PT (b) = 1;
246 BUF_GPT (b) = 1;
247 BUF_BEGV (b) = 1;
248 BUF_ZV (b) = 1;
249 BUF_Z (b) = 1;
250 BUF_MODIFF (b) = 1;
251
28e969dd
JB
252 b->newline_cache = 0;
253 b->width_run_cache = 0;
254 b->width_table = Qnil;
255
1ab256cb
RM
256 /* Put this on the chain of all buffers including killed ones. */
257 b->next = all_buffers;
258 all_buffers = b;
259
260 b->mark = Fmake_marker ();
261 /*b->number = make_number (++buffer_count);*/
262 b->name = name;
263 if (XSTRING (name)->data[0] != ' ')
264 b->undo_list = Qnil;
265 else
266 b->undo_list = Qt;
267
268 reset_buffer (b);
bcd40520 269 reset_buffer_local_variables (b);
1ab256cb
RM
270
271 /* Put this in the alist of all live buffers. */
67180c6a 272 XSETBUFFER (buf, b);
1ab256cb
RM
273 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
274
275 b->mark = Fmake_marker ();
276 b->markers = Qnil;
277 b->name = name;
278
279 function = buffer_defaults.major_mode;
265a9e55 280 if (NILP (function))
1ab256cb
RM
281 {
282 tem = Fget (current_buffer->major_mode, Qmode_class);
283 if (EQ (tem, Qnil))
284 function = current_buffer->major_mode;
285 }
286
265a9e55 287 if (NILP (function) || EQ (function, Qfundamental_mode))
1ab256cb
RM
288 return buf;
289
290 /* To select a nonfundamental mode,
291 select the buffer temporarily and then call the mode function. */
292
293 record_unwind_protect (save_excursion_restore, save_excursion_save ());
294
295 Fset_buffer (buf);
296 call0 (function);
297
298 return unbind_to (count, buf);
299}
300
bcd40520
RS
301/* Reinitialize everything about a buffer except its name and contents
302 and local variables. */
1ab256cb
RM
303
304void
305reset_buffer (b)
306 register struct buffer *b;
307{
308 b->filename = Qnil;
309 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
310 b->modtime = 0;
311 b->save_modified = 1;
8d7a4592 312 XSETFASTINT (b->save_length, 0);
1ab256cb
RM
313 b->last_window_start = 1;
314 b->backed_up = Qnil;
315 b->auto_save_modified = 0;
84f6bcba 316 b->auto_save_failure_time = -1;
1ab256cb
RM
317 b->auto_save_file_name = Qnil;
318 b->read_only = Qnil;
2eec3b4e
RS
319 b->overlays_before = Qnil;
320 b->overlays_after = Qnil;
8d7a4592 321 XSETFASTINT (b->overlay_center, 1);
dfda7a7f 322 b->mark_active = Qnil;
33f7013e
JA
323
324 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
325 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
1ab256cb
RM
326}
327
bcd40520
RS
328/* Reset buffer B's local variables info.
329 Don't use this on a buffer that has already been in use;
330 it does not treat permanent locals consistently.
331 Instead, use Fkill_all_local_variables. */
332
c48f61ef 333reset_buffer_local_variables (b)
1ab256cb
RM
334 register struct buffer *b;
335{
336 register int offset;
337
338 /* Reset the major mode to Fundamental, together with all the
339 things that depend on the major mode.
340 default-major-mode is handled at a higher level.
341 We ignore it here. */
342 b->major_mode = Qfundamental_mode;
343 b->keymap = Qnil;
344 b->abbrev_table = Vfundamental_mode_abbrev_table;
345 b->mode_name = QSFundamental;
346 b->minor_modes = Qnil;
347 b->downcase_table = Vascii_downcase_table;
348 b->upcase_table = Vascii_upcase_table;
e9edf33c
RS
349 b->case_canon_table = Vascii_canon_table;
350 b->case_eqv_table = Vascii_eqv_table;
1ab256cb
RM
351#if 0
352 b->sort_table = XSTRING (Vascii_sort_table);
353 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
354#endif /* 0 */
355
356 /* Reset all per-buffer variables to their defaults. */
357 b->local_var_alist = Qnil;
358 b->local_var_flags = 0;
359
360 /* For each slot that has a default value,
361 copy that into the slot. */
362
363 for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags;
364 offset < sizeof (struct buffer);
4d2f1389 365 offset += sizeof (Lisp_Object)) /* sizeof EMACS_INT == sizeof Lisp_Object */
aab80822
KH
366 {
367 int flag = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags));
368 if (flag > 0 || flag == -2)
369 *(Lisp_Object *)(offset + (char *)b) =
370 *(Lisp_Object *)(offset + (char *)&buffer_defaults);
371 }
1ab256cb
RM
372}
373
01050cb5
RM
374/* We split this away from generate-new-buffer, because rename-buffer
375 and set-visited-file-name ought to be able to use this to really
376 rename the buffer properly. */
377
378DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name,
c273e647 379 1, 2, 0,
01050cb5
RM
380 "Return a string that is the name of no existing buffer based on NAME.\n\
381If there is no live buffer named NAME, then return NAME.\n\
1ab256cb 382Otherwise modify name by appending `<NUMBER>', incrementing NUMBER\n\
c273e647 383until an unused name is found, and then return that name.\n\
03bdd54c 384Optional second argument IGNORE specifies a name that is okay to use\n\
c273e647 385\(if it is in the sequence to be tried)\n\
e8b3a22d 386even if a buffer with that name exists.")
c273e647
RS
387 (name, ignore)
388 register Lisp_Object name, ignore;
1ab256cb
RM
389{
390 register Lisp_Object gentemp, tem;
391 int count;
392 char number[10];
393
394 CHECK_STRING (name, 0);
395
396 tem = Fget_buffer (name);
265a9e55 397 if (NILP (tem))
01050cb5 398 return name;
1ab256cb
RM
399
400 count = 1;
401 while (1)
402 {
403 sprintf (number, "<%d>", ++count);
404 gentemp = concat2 (name, build_string (number));
638e4fc3 405 tem = Fstring_equal (gentemp, ignore);
c273e647
RS
406 if (!NILP (tem))
407 return gentemp;
1ab256cb 408 tem = Fget_buffer (gentemp);
265a9e55 409 if (NILP (tem))
01050cb5 410 return gentemp;
1ab256cb
RM
411 }
412}
413
414\f
415DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
416 "Return the name of BUFFER, as a string.\n\
01050cb5 417With no argument or nil as argument, return the name of the current buffer.")
1ab256cb
RM
418 (buffer)
419 register Lisp_Object buffer;
420{
265a9e55 421 if (NILP (buffer))
1ab256cb
RM
422 return current_buffer->name;
423 CHECK_BUFFER (buffer, 0);
424 return XBUFFER (buffer)->name;
425}
426
427DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
428 "Return name of file BUFFER is visiting, or nil if none.\n\
429No argument or nil as argument means use the current buffer.")
430 (buffer)
431 register Lisp_Object buffer;
432{
265a9e55 433 if (NILP (buffer))
1ab256cb
RM
434 return current_buffer->filename;
435 CHECK_BUFFER (buffer, 0);
436 return XBUFFER (buffer)->filename;
437}
438
439DEFUN ("buffer-local-variables", Fbuffer_local_variables,
440 Sbuffer_local_variables, 0, 1, 0,
441 "Return an alist of variables that are buffer-local in BUFFER.\n\
553defa4
RS
442Most elements look like (SYMBOL . VALUE), describing one variable.\n\
443For a symbol that is locally unbound, just the symbol appears in the value.\n\
1ab256cb
RM
444Note that storing new VALUEs in these elements doesn't change the variables.\n\
445No argument or nil as argument means use current buffer as BUFFER.")
446 (buffer)
447 register Lisp_Object buffer;
448{
449 register struct buffer *buf;
553defa4 450 register Lisp_Object result;
1ab256cb 451
265a9e55 452 if (NILP (buffer))
1ab256cb
RM
453 buf = current_buffer;
454 else
455 {
456 CHECK_BUFFER (buffer, 0);
457 buf = XBUFFER (buffer);
458 }
459
553defa4
RS
460 result = Qnil;
461
1ab256cb
RM
462 {
463 /* Reference each variable in the alist in our current buffer.
464 If inquiring about the current buffer, this gets the current values,
465 so store them into the alist so the alist is up to date.
466 If inquiring about some other buffer, this swaps out any values
467 for that buffer, making the alist up to date automatically. */
553defa4
RS
468 register Lisp_Object tail;
469 for (tail = buf->local_var_alist; CONSP (tail); tail = XCONS (tail)->cdr)
1ab256cb 470 {
553defa4
RS
471 Lisp_Object val, elt;
472
473 elt = XCONS (tail)->car;
474
1ab256cb 475 if (buf == current_buffer)
553defa4
RS
476 val = find_symbol_value (XCONS (elt)->car);
477 else
478 val = XCONS (elt)->cdr;
479
480 /* If symbol is unbound, put just the symbol in the list. */
481 if (EQ (val, Qunbound))
482 result = Fcons (XCONS (elt)->car, result);
483 /* Otherwise, put (symbol . value) in the list. */
484 else
485 result = Fcons (Fcons (XCONS (elt)->car, val), result);
1ab256cb
RM
486 }
487 }
488
1ab256cb
RM
489 /* Add on all the variables stored in special slots. */
490 {
491 register int offset, mask;
492
493 for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols;
494 offset < sizeof (struct buffer);
4d2f1389 495 offset += (sizeof (EMACS_INT))) /* sizeof EMACS_INT == sizeof Lisp_Object */
1ab256cb 496 {
aab80822 497 mask = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags));
1ab256cb 498 if (mask == -1 || (buf->local_var_flags & mask))
aab80822
KH
499 if (SYMBOLP (*(Lisp_Object *)(offset
500 + (char *)&buffer_local_symbols)))
501 result = Fcons (Fcons (*((Lisp_Object *)
502 (offset + (char *)&buffer_local_symbols)),
553defa4
RS
503 *(Lisp_Object *)(offset + (char *)buf)),
504 result);
1ab256cb
RM
505 }
506 }
553defa4
RS
507
508 return result;
1ab256cb
RM
509}
510
511\f
512DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
513 0, 1, 0,
514 "Return t if BUFFER was modified since its file was last read or saved.\n\
515No argument or nil as argument means use current buffer as BUFFER.")
516 (buffer)
517 register Lisp_Object buffer;
518{
519 register struct buffer *buf;
265a9e55 520 if (NILP (buffer))
1ab256cb
RM
521 buf = current_buffer;
522 else
523 {
524 CHECK_BUFFER (buffer, 0);
525 buf = XBUFFER (buffer);
526 }
527
528 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil;
529}
530
531DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
532 1, 1, 0,
533 "Mark current buffer as modified or unmodified according to FLAG.\n\
534A non-nil FLAG means mark the buffer modified.")
535 (flag)
536 register Lisp_Object flag;
537{
538 register int already;
539 register Lisp_Object fn;
540
541#ifdef CLASH_DETECTION
542 /* If buffer becoming modified, lock the file.
543 If buffer becoming unmodified, unlock the file. */
544
545 fn = current_buffer->filename;
265a9e55 546 if (!NILP (fn))
1ab256cb
RM
547 {
548 already = current_buffer->save_modified < MODIFF;
265a9e55 549 if (!already && !NILP (flag))
1ab256cb 550 lock_file (fn);
265a9e55 551 else if (already && NILP (flag))
1ab256cb
RM
552 unlock_file (fn);
553 }
554#endif /* CLASH_DETECTION */
555
265a9e55 556 current_buffer->save_modified = NILP (flag) ? MODIFF : 0;
1ab256cb
RM
557 update_mode_lines++;
558 return flag;
559}
560
561DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
562 0, 1, 0,
563 "Return BUFFER's tick counter, incremented for each change in text.\n\
564Each buffer has a tick counter which is incremented each time the text in\n\
565that buffer is changed. It wraps around occasionally.\n\
566No argument or nil as argument means use current buffer as BUFFER.")
567 (buffer)
568 register Lisp_Object buffer;
569{
570 register struct buffer *buf;
265a9e55 571 if (NILP (buffer))
1ab256cb
RM
572 buf = current_buffer;
573 else
574 {
575 CHECK_BUFFER (buffer, 0);
576 buf = XBUFFER (buffer);
577 }
578
579 return make_number (BUF_MODIFF (buf));
580}
581\f
01050cb5 582DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2,
4c7e5f09 583 "sRename buffer (to new name): \nP",
1ab256cb 584 "Change current buffer's name to NEWNAME (a string).\n\
3bd779aa 585If second arg UNIQUE is nil or omitted, it is an error if a\n\
01050cb5 586buffer named NEWNAME already exists.\n\
3bd779aa 587If UNIQUE is non-nil, come up with a new name using\n\
01050cb5 588`generate-new-buffer-name'.\n\
3bd779aa
RS
589Interactively, you can set UNIQUE with a prefix argument.\n\
590We return the name we actually gave the buffer.\n\
1ab256cb 591This does not change the name of the visited file (if any).")
3bd779aa
RS
592 (name, unique)
593 register Lisp_Object name, unique;
1ab256cb
RM
594{
595 register Lisp_Object tem, buf;
596
597 CHECK_STRING (name, 0);
d59698c4
RS
598
599 if (XSTRING (name)->size == 0)
600 error ("Empty string is invalid as a buffer name");
601
1ab256cb 602 tem = Fget_buffer (name);
c059b5ea
RM
603 /* Don't short-circuit if UNIQUE is t. That is a useful way to rename
604 the buffer automatically so you can create another with the original name.
605 It makes UNIQUE equivalent to
606 (rename-buffer (generate-new-buffer-name NAME)). */
607 if (NILP (unique) && XBUFFER (tem) == current_buffer)
01050cb5 608 return current_buffer->name;
265a9e55 609 if (!NILP (tem))
01050cb5 610 {
3bd779aa 611 if (!NILP (unique))
c273e647 612 name = Fgenerate_new_buffer_name (name, current_buffer->name);
01050cb5
RM
613 else
614 error ("Buffer name \"%s\" is in use", XSTRING (name)->data);
615 }
1ab256cb
RM
616
617 current_buffer->name = name;
76f590d7
JB
618
619 /* Catch redisplay's attention. Unless we do this, the mode lines for
620 any windows displaying current_buffer will stay unchanged. */
621 update_mode_lines++;
622
67180c6a 623 XSETBUFFER (buf, current_buffer);
1ab256cb 624 Fsetcar (Frassq (buf, Vbuffer_alist), name);
cf058e49
KH
625 if (NILP (current_buffer->filename)
626 && !NILP (current_buffer->auto_save_file_name))
1ab256cb 627 call0 (intern ("rename-auto-save-file"));
cf058e49
KH
628 /* refetch since that last call may have done GC */
629 return current_buffer->name;
1ab256cb
RM
630}
631
a0ebb746 632DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 2, 0,
1ab256cb 633 "Return most recently selected buffer other than BUFFER.\n\
a0ebb746
JB
634Buffers not visible in windows are preferred to visible buffers,\n\
635unless optional second argument VISIBLE-OK is non-nil.\n\
1ab256cb
RM
636If no other buffer exists, the buffer `*scratch*' is returned.\n\
637If BUFFER is omitted or nil, some interesting buffer is returned.")
a0ebb746
JB
638 (buffer, visible_ok)
639 register Lisp_Object buffer, visible_ok;
1ab256cb
RM
640{
641 register Lisp_Object tail, buf, notsogood, tem;
642 notsogood = Qnil;
643
265a9e55 644 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
645 {
646 buf = Fcdr (Fcar (tail));
647 if (EQ (buf, buffer))
648 continue;
649 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
650 continue;
a0ebb746 651 if (NILP (visible_ok))
db732e5a 652 tem = Fget_buffer_window (buf, Qt);
a0ebb746
JB
653 else
654 tem = Qnil;
265a9e55 655 if (NILP (tem))
1ab256cb 656 return buf;
265a9e55 657 if (NILP (notsogood))
1ab256cb
RM
658 notsogood = buf;
659 }
265a9e55 660 if (!NILP (notsogood))
1ab256cb
RM
661 return notsogood;
662 return Fget_buffer_create (build_string ("*scratch*"));
663}
664\f
5b8bcf48 665DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, 0, 1,
1ab256cb 6660,
5b8bcf48
RS
667 "Make BUFFER stop keeping undo information.\n\
668No argument or nil as argument means do this for the current buffer.")
ffd56f97
JB
669 (buffer)
670 register Lisp_Object buffer;
1ab256cb 671{
ffd56f97
JB
672 Lisp_Object real_buffer;
673
674 if (NILP (buffer))
67180c6a 675 XSETBUFFER (real_buffer, current_buffer);
ffd56f97
JB
676 else
677 {
678 real_buffer = Fget_buffer (buffer);
679 if (NILP (real_buffer))
680 nsberror (buffer);
681 }
682
683 XBUFFER (real_buffer)->undo_list = Qt;
684
1ab256cb
RM
685 return Qnil;
686}
687
688DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
689 0, 1, "",
690 "Start keeping undo information for buffer BUFFER.\n\
691No argument or nil as argument means do this for the current buffer.")
ffd56f97
JB
692 (buffer)
693 register Lisp_Object buffer;
1ab256cb 694{
ffd56f97 695 Lisp_Object real_buffer;
1ab256cb 696
ffd56f97 697 if (NILP (buffer))
67180c6a 698 XSETBUFFER (real_buffer, current_buffer);
1ab256cb
RM
699 else
700 {
ffd56f97
JB
701 real_buffer = Fget_buffer (buffer);
702 if (NILP (real_buffer))
703 nsberror (buffer);
1ab256cb
RM
704 }
705
ffd56f97
JB
706 if (EQ (XBUFFER (real_buffer)->undo_list, Qt))
707 XBUFFER (real_buffer)->undo_list = Qnil;
1ab256cb
RM
708
709 return Qnil;
710}
711
712/*
713 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
714Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
715The buffer being killed will be current while the hook is running.\n\
716See `kill-buffer'."
717 */
718DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
719 "Kill the buffer BUFFER.\n\
720The argument may be a buffer or may be the name of a buffer.\n\
721An argument of nil means kill the current buffer.\n\n\
722Value is t if the buffer is actually killed, nil if user says no.\n\n\
723The value of `kill-buffer-hook' (which may be local to that buffer),\n\
724if not void, is a list of functions to be called, with no arguments,\n\
725before the buffer is actually killed. The buffer to be killed is current\n\
726when the hook functions are called.\n\n\
727Any processes that have this buffer as the `process-buffer' are killed\n\
728with `delete-process'.")
729 (bufname)
730 Lisp_Object bufname;
731{
732 Lisp_Object buf;
733 register struct buffer *b;
734 register Lisp_Object tem;
735 register struct Lisp_Marker *m;
736 struct gcpro gcpro1, gcpro2;
737
265a9e55 738 if (NILP (bufname))
1ab256cb
RM
739 buf = Fcurrent_buffer ();
740 else
741 buf = Fget_buffer (bufname);
265a9e55 742 if (NILP (buf))
1ab256cb
RM
743 nsberror (bufname);
744
745 b = XBUFFER (buf);
746
747 /* Query if the buffer is still modified. */
265a9e55 748 if (INTERACTIVE && !NILP (b->filename)
1ab256cb
RM
749 && BUF_MODIFF (b) > b->save_modified)
750 {
751 GCPRO2 (buf, bufname);
752 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
753 XSTRING (b->name)->data));
754 UNGCPRO;
265a9e55 755 if (NILP (tem))
1ab256cb
RM
756 return Qnil;
757 }
758
dcdffbf6 759 /* Run hooks with the buffer to be killed the current buffer. */
1ab256cb
RM
760 {
761 register Lisp_Object val;
762 int count = specpdl_ptr - specpdl;
dcdffbf6 763 Lisp_Object list;
1ab256cb
RM
764
765 record_unwind_protect (save_excursion_restore, save_excursion_save ());
766 set_buffer_internal (b);
dcdffbf6
RS
767
768 /* First run the query functions; if any query is answered no,
769 don't kill the buffer. */
770 for (list = Vkill_buffer_query_functions; !NILP (list); list = Fcdr (list))
771 {
772 tem = call0 (Fcar (list));
773 if (NILP (tem))
774 return unbind_to (count, Qnil);
775 }
776
777 /* Then run the hooks. */
fd186f07
RS
778 if (!NILP (Vrun_hooks))
779 call1 (Vrun_hooks, Qkill_buffer_hook);
1ab256cb
RM
780 unbind_to (count, Qnil);
781 }
782
783 /* We have no more questions to ask. Verify that it is valid
784 to kill the buffer. This must be done after the questions
785 since anything can happen within do_yes_or_no_p. */
786
787 /* Don't kill the minibuffer now current. */
788 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
789 return Qnil;
790
265a9e55 791 if (NILP (b->name))
1ab256cb
RM
792 return Qnil;
793
794 /* Make this buffer not be current.
795 In the process, notice if this is the sole visible buffer
796 and give up if so. */
797 if (b == current_buffer)
798 {
172a9c1f 799 tem = Fother_buffer (buf, Qnil);
1ab256cb
RM
800 Fset_buffer (tem);
801 if (b == current_buffer)
802 return Qnil;
803 }
804
805 /* Now there is no question: we can kill the buffer. */
806
807#ifdef CLASH_DETECTION
808 /* Unlock this buffer's file, if it is locked. */
809 unlock_buffer (b);
810#endif /* CLASH_DETECTION */
811
1ab256cb 812 kill_buffer_processes (buf);
1ab256cb
RM
813
814 tem = Vinhibit_quit;
815 Vinhibit_quit = Qt;
816 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
817 Freplace_buffer_in_windows (buf);
818 Vinhibit_quit = tem;
819
9b59d6d0 820 /* Delete any auto-save file, if we saved it in this session. */
a7a60ce9 821 if (STRINGP (b->auto_save_file_name)
9b59d6d0 822 && b->auto_save_modified != 0)
1ab256cb
RM
823 {
824 Lisp_Object tem;
825 tem = Fsymbol_value (intern ("delete-auto-save-files"));
265a9e55 826 if (! NILP (tem))
1ab256cb
RM
827 unlink (XSTRING (b->auto_save_file_name)->data);
828 }
829
830 /* Unchain all markers of this buffer
831 and leave them pointing nowhere. */
832 for (tem = b->markers; !EQ (tem, Qnil); )
833 {
834 m = XMARKER (tem);
835 m->buffer = 0;
836 tem = m->chain;
837 m->chain = Qnil;
838 }
839 b->markers = Qnil;
840
33f7013e
JA
841 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
842 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
843 /* Perhaps we should explicitly free the interval tree here... */
844
1ab256cb 845 b->name = Qnil;
9ac0d9e0 846 BLOCK_INPUT;
1ab256cb 847 BUFFER_FREE (BUF_BEG_ADDR (b));
28e969dd
JB
848 if (b->newline_cache)
849 {
850 free_region_cache (b->newline_cache);
851 b->newline_cache = 0;
852 }
853 if (b->width_run_cache)
854 {
855 free_region_cache (b->width_run_cache);
856 b->width_run_cache = 0;
857 }
858 b->width_table = Qnil;
9ac0d9e0 859 UNBLOCK_INPUT;
1ab256cb
RM
860 b->undo_list = Qnil;
861
862 return Qt;
863}
864\f
36a8c287
JB
865/* Move the assoc for buffer BUF to the front of buffer-alist. Since
866 we do this each time BUF is selected visibly, the more recently
867 selected buffers are always closer to the front of the list. This
868 means that other_buffer is more likely to choose a relevant buffer. */
1ab256cb
RM
869
870record_buffer (buf)
871 Lisp_Object buf;
872{
873 register Lisp_Object link, prev;
874
875 prev = Qnil;
876 for (link = Vbuffer_alist; CONSP (link); link = XCONS (link)->cdr)
877 {
878 if (EQ (XCONS (XCONS (link)->car)->cdr, buf))
879 break;
880 prev = link;
881 }
882
36a8c287
JB
883 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
884 we cannot use Fdelq itself here because it allows quitting. */
1ab256cb 885
265a9e55 886 if (NILP (prev))
1ab256cb
RM
887 Vbuffer_alist = XCONS (Vbuffer_alist)->cdr;
888 else
889 XCONS (prev)->cdr = XCONS (XCONS (prev)->cdr)->cdr;
890
891 XCONS(link)->cdr = Vbuffer_alist;
892 Vbuffer_alist = link;
893}
894
895DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
896 "Select buffer BUFFER in the current window.\n\
897BUFFER may be a buffer or a buffer name.\n\
898Optional second arg NORECORD non-nil means\n\
899do not put this buffer at the front of the list of recently selected ones.\n\
900\n\
901WARNING: This is NOT the way to work on another buffer temporarily\n\
902within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\
903the window-buffer correspondences.")
904 (bufname, norecord)
905 Lisp_Object bufname, norecord;
906{
907 register Lisp_Object buf;
908 Lisp_Object tem;
909
910 if (EQ (minibuf_window, selected_window))
911 error ("Cannot switch buffers in minibuffer window");
912 tem = Fwindow_dedicated_p (selected_window);
265a9e55 913 if (!NILP (tem))
1ab256cb
RM
914 error ("Cannot switch buffers in a dedicated window");
915
265a9e55 916 if (NILP (bufname))
172a9c1f 917 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
918 else
919 buf = Fget_buffer_create (bufname);
920 Fset_buffer (buf);
265a9e55 921 if (NILP (norecord))
1ab256cb
RM
922 record_buffer (buf);
923
924 Fset_window_buffer (EQ (selected_window, minibuf_window)
5fcd022d
JB
925 ? Fnext_window (minibuf_window, Qnil, Qnil)
926 : selected_window,
1ab256cb
RM
927 buf);
928
e8b3a22d 929 return buf;
1ab256cb
RM
930}
931
932DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0,
933 "Select buffer BUFFER in some window, preferably a different one.\n\
934If BUFFER is nil, then some other buffer is chosen.\n\
935If `pop-up-windows' is non-nil, windows can be split to do this.\n\
936If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
937window even if BUFFER is already visible in the selected window.")
938 (bufname, other)
939 Lisp_Object bufname, other;
940{
941 register Lisp_Object buf;
265a9e55 942 if (NILP (bufname))
172a9c1f 943 buf = Fother_buffer (Fcurrent_buffer (), Qnil);
1ab256cb
RM
944 else
945 buf = Fget_buffer_create (bufname);
946 Fset_buffer (buf);
947 record_buffer (buf);
948 Fselect_window (Fdisplay_buffer (buf, other));
e8b3a22d 949 return buf;
1ab256cb
RM
950}
951
952DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
953 "Return the current buffer as a Lisp object.")
954 ()
955{
956 register Lisp_Object buf;
67180c6a 957 XSETBUFFER (buf, current_buffer);
1ab256cb
RM
958 return buf;
959}
960\f
961/* Set the current buffer to b */
962
963void
964set_buffer_internal (b)
965 register struct buffer *b;
966{
967 register struct buffer *old_buf;
968 register Lisp_Object tail, valcontents;
a7a60ce9 969 Lisp_Object tem;
1ab256cb
RM
970
971 if (current_buffer == b)
972 return;
973
974 windows_or_buffers_changed = 1;
975 old_buf = current_buffer;
976 current_buffer = b;
977 last_known_column_point = -1; /* invalidate indentation cache */
978
979 /* Look down buffer's list of local Lisp variables
980 to find and update any that forward into C variables. */
981
265a9e55 982 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
983 {
984 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
a7a60ce9
KH
985 if ((BUFFER_LOCAL_VALUEP (valcontents)
986 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
987 && (tem = XCONS (valcontents)->car,
988 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1ab256cb
RM
989 /* Just reference the variable
990 to cause it to become set for this buffer. */
991 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
992 }
993
994 /* Do the same with any others that were local to the previous buffer */
995
996 if (old_buf)
265a9e55 997 for (tail = old_buf->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1ab256cb
RM
998 {
999 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
a7a60ce9
KH
1000 if ((BUFFER_LOCAL_VALUEP (valcontents)
1001 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1002 && (tem = XCONS (valcontents)->car,
1003 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1ab256cb
RM
1004 /* Just reference the variable
1005 to cause it to become set for this buffer. */
1006 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
1007 }
1008}
1009
1010DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
1011 "Make the buffer BUFFER current for editing operations.\n\
1012BUFFER may be a buffer or the name of an existing buffer.\n\
1013See also `save-excursion' when you want to make a buffer current temporarily.\n\
1014This function does not display the buffer, so its effect ends\n\
1015when the current command terminates.\n\
1016Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
1017 (bufname)
1018 register Lisp_Object bufname;
1019{
1020 register Lisp_Object buffer;
1021 buffer = Fget_buffer (bufname);
265a9e55 1022 if (NILP (buffer))
1ab256cb 1023 nsberror (bufname);
265a9e55 1024 if (NILP (XBUFFER (buffer)->name))
1ab256cb
RM
1025 error ("Selecting deleted buffer");
1026 set_buffer_internal (XBUFFER (buffer));
1027 return buffer;
1028}
1029\f
1030DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
1031 Sbarf_if_buffer_read_only, 0, 0, 0,
1032 "Signal a `buffer-read-only' error if the current buffer is read-only.")
1033 ()
1034{
a96b68f1
RS
1035 if (!NILP (current_buffer->read_only)
1036 && NILP (Vinhibit_read_only))
1ab256cb
RM
1037 Fsignal (Qbuffer_read_only, (Fcons (Fcurrent_buffer (), Qnil)));
1038 return Qnil;
1039}
1040
1041DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "",
1042 "Put BUFFER at the end of the list of all buffers.\n\
1043There it is the least likely candidate for `other-buffer' to return;\n\
528415e7 1044thus, the least likely buffer for \\[switch-to-buffer] to select by default.\n\
a5611885
JB
1045If BUFFER is nil or omitted, bury the current buffer.\n\
1046Also, if BUFFER is nil or omitted, remove the current buffer from the\n\
1047selected window if it is displayed there.")
1ab256cb
RM
1048 (buf)
1049 register Lisp_Object buf;
1050{
b271272a 1051 /* Figure out what buffer we're going to bury. */
265a9e55 1052 if (NILP (buf))
a5611885 1053 {
67180c6a 1054 XSETBUFFER (buf, current_buffer);
a5611885
JB
1055
1056 /* If we're burying the current buffer, unshow it. */
5fcd022d 1057 Fswitch_to_buffer (Fother_buffer (buf, Qnil), Qnil);
a5611885 1058 }
1ab256cb
RM
1059 else
1060 {
1061 Lisp_Object buf1;
1062
1063 buf1 = Fget_buffer (buf);
265a9e55 1064 if (NILP (buf1))
1ab256cb
RM
1065 nsberror (buf);
1066 buf = buf1;
b271272a
JB
1067 }
1068
a5611885 1069 /* Move buf to the end of the buffer list. */
b271272a
JB
1070 {
1071 register Lisp_Object aelt, link;
1072
1073 aelt = Frassq (buf, Vbuffer_alist);
1074 link = Fmemq (aelt, Vbuffer_alist);
1075 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
1076 XCONS (link)->cdr = Qnil;
1077 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
1078 }
1ab256cb 1079
1ab256cb
RM
1080 return Qnil;
1081}
1082\f
c922bc55 1083DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, "*",
1ab256cb 1084 "Delete the entire contents of the current buffer.\n\
2950a20e 1085Any narrowing restriction in effect (see `narrow-to-region') is removed,\n\
1ab256cb
RM
1086so the buffer is truly empty after this.")
1087 ()
1088{
1089 Fwiden ();
1090 del_range (BEG, Z);
1091 current_buffer->last_window_start = 1;
1092 /* Prevent warnings, or suspension of auto saving, that would happen
1093 if future size is less than past size. Use of erase-buffer
1094 implies that the future text is not really related to the past text. */
8d7a4592 1095 XSETFASTINT (current_buffer->save_length, 0);
1ab256cb
RM
1096 return Qnil;
1097}
1098
1099validate_region (b, e)
1100 register Lisp_Object *b, *e;
1101{
1ab256cb
RM
1102 CHECK_NUMBER_COERCE_MARKER (*b, 0);
1103 CHECK_NUMBER_COERCE_MARKER (*e, 1);
1104
1105 if (XINT (*b) > XINT (*e))
1106 {
03192067
KH
1107 Lisp_Object tem;
1108 tem = *b; *b = *e; *e = tem;
1ab256cb
RM
1109 }
1110
1111 if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e)
1112 && XINT (*e) <= ZV))
1113 args_out_of_range (*b, *e);
1114}
1115\f
9f31d21b 1116static Lisp_Object
1ab256cb
RM
1117list_buffers_1 (files)
1118 Lisp_Object files;
1119{
1120 register Lisp_Object tail, tem, buf;
1121 Lisp_Object col1, col2, col3, minspace;
1122 register struct buffer *old = current_buffer, *b;
718cde7d 1123 Lisp_Object desired_point;
1ab256cb
RM
1124 Lisp_Object other_file_symbol;
1125
718cde7d 1126 desired_point = Qnil;
1ab256cb
RM
1127 other_file_symbol = intern ("list-buffers-directory");
1128
8d7a4592
KH
1129 XSETFASTINT (col1, 19);
1130 XSETFASTINT (col2, 26);
1131 XSETFASTINT (col3, 40);
1132 XSETFASTINT (minspace, 1);
1ab256cb
RM
1133
1134 Fset_buffer (Vstandard_output);
1ab256cb
RM
1135 Fbuffer_disable_undo (Vstandard_output);
1136 current_buffer->read_only = Qnil;
1137
1138 write_string ("\
1d3395a6
RS
1139 MR Buffer Size Mode File\n\
1140 -- ------ ---- ---- ----\n", -1);
1ab256cb 1141
265a9e55 1142 for (tail = Vbuffer_alist; !NILP (tail); tail = Fcdr (tail))
1ab256cb
RM
1143 {
1144 buf = Fcdr (Fcar (tail));
1145 b = XBUFFER (buf);
1146 /* Don't mention the minibuffers. */
1147 if (XSTRING (b->name)->data[0] == ' ')
1148 continue;
1149 /* Optionally don't mention buffers that lack files. */
265a9e55 1150 if (!NILP (files) && NILP (b->filename))
1ab256cb
RM
1151 continue;
1152 /* Identify the current buffer. */
1153 if (b == old)
8d7a4592 1154 XSETFASTINT (desired_point, point);
1ab256cb
RM
1155 write_string (b == old ? "." : " ", -1);
1156 /* Identify modified buffers */
1157 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1);
b5b4d360
RS
1158 /* The current buffer is special-cased to be marked read-only.
1159 It is actually made read-only by the call to
1160 Buffer-menu-mode, below. */
1161 write_string ((b != current_buffer && NILP (b->read_only))
1162 ? " " : "% ", -1);
1ab256cb
RM
1163 Fprinc (b->name, Qnil);
1164 Findent_to (col1, make_number (2));
8d7a4592 1165 XSETFASTINT (tem, BUF_Z (b) - BUF_BEG (b));
1ab256cb
RM
1166 Fprin1 (tem, Qnil);
1167 Findent_to (col2, minspace);
1168 Fprinc (b->mode_name, Qnil);
1169 Findent_to (col3, minspace);
1170
265a9e55 1171 if (!NILP (b->filename))
1ab256cb
RM
1172 Fprinc (b->filename, Qnil);
1173 else
1174 {
1175 /* No visited file; check local value of list-buffers-directory. */
1176 Lisp_Object tem;
1177 set_buffer_internal (b);
1178 tem = Fboundp (other_file_symbol);
265a9e55 1179 if (!NILP (tem))
1ab256cb
RM
1180 {
1181 tem = Fsymbol_value (other_file_symbol);
1182 Fset_buffer (Vstandard_output);
a7a60ce9 1183 if (STRINGP (tem))
1ab256cb
RM
1184 Fprinc (tem, Qnil);
1185 }
1186 else
1187 Fset_buffer (Vstandard_output);
1188 }
1189 write_string ("\n", -1);
1190 }
1191
9f31d21b
KH
1192 tail = intern ("Buffer-menu-mode");
1193 if ((tem = Ffboundp (tail), !NILP (tem)))
1194 call0 (tail);
1ab256cb 1195 set_buffer_internal (old);
718cde7d 1196 return desired_point;
1ab256cb
RM
1197}
1198
1199DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "P",
1200 "Display a list of names of existing buffers.\n\
1201The list is displayed in a buffer named `*Buffer List*'.\n\
1202Note that buffers with names starting with spaces are omitted.\n\
1203Non-null optional arg FILES-ONLY means mention only file buffers.\n\
1204\n\
1205The M column contains a * for buffers that are modified.\n\
1206The R column contains a % for buffers that are read-only.")
1207 (files)
1208 Lisp_Object files;
1209{
e87f38ef
JB
1210 Lisp_Object desired_point;
1211
fd2dab90
RS
1212 desired_point
1213 = internal_with_output_to_temp_buffer ("*Buffer List*",
1214 list_buffers_1, files);
e87f38ef 1215
718cde7d
JB
1216 if (NUMBERP (desired_point))
1217 {
1218 int count = specpdl_ptr - specpdl;
1219 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
1220 Fset_buffer (build_string ("*Buffer List*"));
1221 SET_PT (XINT (desired_point));
1222 return unbind_to (count, Qnil);
1223 }
fd2dab90 1224 return Qnil;
1ab256cb
RM
1225}
1226
1227DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
1228 0, 0, 0,
1229 "Switch to Fundamental mode by killing current buffer's local variables.\n\
1230Most local variable bindings are eliminated so that the default values\n\
1231become effective once more. Also, the syntax table is set from\n\
1232`standard-syntax-table', the local keymap is set to nil,\n\
1233and the abbrev table from `fundamental-mode-abbrev-table'.\n\
1234This function also forces redisplay of the mode line.\n\
1235\n\
1236Every function to select a new major mode starts by\n\
1237calling this function.\n\n\
1238As a special exception, local variables whose names have\n\
c5a15222
RS
1239a non-nil `permanent-local' property are not eliminated by this function.\n\
1240\n\
1241The first thing this function does is run\n\
1242the normal hook `change-major-mode-hook'.")
1ab256cb
RM
1243 ()
1244{
1245 register Lisp_Object alist, sym, tem;
1246 Lisp_Object oalist;
7410477a 1247
fd186f07
RS
1248 if (!NILP (Vrun_hooks))
1249 call1 (Vrun_hooks, intern ("change-major-mode-hook"));
1ab256cb
RM
1250 oalist = current_buffer->local_var_alist;
1251
1252 /* Make sure no local variables remain set up with this buffer
1253 for their current values. */
1254
265a9e55 1255 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1256 {
1257 sym = XCONS (XCONS (alist)->car)->car;
1258
1259 /* Need not do anything if some other buffer's binding is now encached. */
1260 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car;
1261 if (XBUFFER (tem) == current_buffer)
1262 {
1263 /* Symbol is set up for this buffer's old local value.
1264 Set it up for the current buffer with the default value. */
1265
1266 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr;
542143d7
RS
1267 /* Store the symbol's current value into the alist entry
1268 it is currently set up for. This is so that, if the
1269 local is marked permanent, and we make it local again below,
1270 we don't lose the value. */
2735b685
RS
1271 XCONS (XCONS (tem)->car)->cdr
1272 = do_symval_forwarding (XCONS (XSYMBOL (sym)->value)->car);
542143d7 1273 /* Switch to the symbol's default-value alist entry. */
1ab256cb 1274 XCONS (tem)->car = tem;
542143d7 1275 /* Mark it as current for the current buffer. */
1ab256cb 1276 XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer ();
542143d7 1277 /* Store the current value into any forwarding in the symbol. */
1ab256cb
RM
1278 store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car,
1279 XCONS (tem)->cdr);
1280 }
1281 }
1282
1283 /* Actually eliminate all local bindings of this buffer. */
1284
1285 reset_buffer_local_variables (current_buffer);
1286
1287 /* Redisplay mode lines; we are changing major mode. */
1288
1289 update_mode_lines++;
1290
1291 /* Any which are supposed to be permanent,
1292 make local again, with the same values they had. */
1293
265a9e55 1294 for (alist = oalist; !NILP (alist); alist = XCONS (alist)->cdr)
1ab256cb
RM
1295 {
1296 sym = XCONS (XCONS (alist)->car)->car;
1297 tem = Fget (sym, Qpermanent_local);
265a9e55 1298 if (! NILP (tem))
01050cb5
RM
1299 {
1300 Fmake_local_variable (sym);
1301 Fset (sym, XCONS (XCONS (alist)->car)->cdr);
1302 }
1ab256cb
RM
1303 }
1304
1305 /* Force mode-line redisplay. Useful here because all major mode
1306 commands call this function. */
1307 update_mode_lines++;
1308
1309 return Qnil;
1310}
1311\f
2eec3b4e
RS
1312/* Find all the overlays in the current buffer that contain position POS.
1313 Return the number found, and store them in a vector in *VEC_PTR.
1314 Store in *LEN_PTR the size allocated for the vector.
52f8ec73
JB
1315 Store in *NEXT_PTR the next position after POS where an overlay starts,
1316 or ZV if there are no more overlays.
239c932b
RS
1317 Store in *PREV_PTR the previous position after POS where an overlay ends,
1318 or BEGV if there are no previous overlays.
1319 NEXT_PTR and/or PREV_PTR may be 0, meaning don't store that info.
2eec3b4e
RS
1320
1321 *VEC_PTR and *LEN_PTR should contain a valid vector and size
61d54cd5
RS
1322 when this function is called.
1323
1324 If EXTEND is non-zero, we make the vector bigger if necessary.
1325 If EXTEND is zero, we never extend the vector,
1326 and we store only as many overlays as will fit.
1327 But we still return the total number of overlays. */
2eec3b4e
RS
1328
1329int
239c932b 1330overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr)
2eec3b4e 1331 int pos;
61d54cd5 1332 int extend;
2eec3b4e
RS
1333 Lisp_Object **vec_ptr;
1334 int *len_ptr;
1335 int *next_ptr;
239c932b 1336 int *prev_ptr;
1ab256cb 1337{
2eec3b4e
RS
1338 Lisp_Object tail, overlay, start, end, result;
1339 int idx = 0;
1340 int len = *len_ptr;
1341 Lisp_Object *vec = *vec_ptr;
1342 int next = ZV;
239c932b 1343 int prev = BEGV;
61d54cd5
RS
1344 int inhibit_storing = 0;
1345
2eec3b4e 1346 for (tail = current_buffer->overlays_before;
4a44b14c 1347 XGCTYPE (tail) == Lisp_Cons;
2eec3b4e
RS
1348 tail = XCONS (tail)->cdr)
1349 {
239c932b 1350 int startpos, endpos;
52f8ec73 1351
2eec3b4e 1352 overlay = XCONS (tail)->car;
3ccf510a 1353 if (XGCTYPE (overlay) != Lisp_Overlay)
52f8ec73 1354 abort ();
1ab256cb 1355
2eec3b4e
RS
1356 start = OVERLAY_START (overlay);
1357 end = OVERLAY_END (overlay);
239c932b
RS
1358 endpos = OVERLAY_POSITION (end);
1359 if (endpos < pos)
1360 {
1361 if (prev < endpos)
1362 prev = endpos;
1363 break;
1364 }
1365 if (endpos == pos)
1366 continue;
2eec3b4e
RS
1367 startpos = OVERLAY_POSITION (start);
1368 if (startpos <= pos)
1369 {
1370 if (idx == len)
1371 {
61d54cd5
RS
1372 /* The supplied vector is full.
1373 Either make it bigger, or don't store any more in it. */
1374 if (extend)
1375 {
1376 *len_ptr = len *= 2;
1377 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
1378 *vec_ptr = vec;
1379 }
1380 else
1381 inhibit_storing = 1;
2eec3b4e 1382 }
61d54cd5
RS
1383
1384 if (!inhibit_storing)
1385 vec[idx] = overlay;
1386 /* Keep counting overlays even if we can't return them all. */
1387 idx++;
2eec3b4e
RS
1388 }
1389 else if (startpos < next)
1390 next = startpos;
1391 }
1392
1393 for (tail = current_buffer->overlays_after;
4a44b14c 1394 XGCTYPE (tail) == Lisp_Cons;
2eec3b4e 1395 tail = XCONS (tail)->cdr)
1ab256cb 1396 {
239c932b 1397 int startpos, endpos;
52f8ec73 1398
2eec3b4e 1399 overlay = XCONS (tail)->car;
3ccf510a 1400 if (XGCTYPE (overlay) != Lisp_Overlay)
52f8ec73 1401 abort ();
2eec3b4e
RS
1402
1403 start = OVERLAY_START (overlay);
1404 end = OVERLAY_END (overlay);
1405 startpos = OVERLAY_POSITION (start);
52f8ec73 1406 if (pos < startpos)
2eec3b4e
RS
1407 {
1408 if (startpos < next)
1409 next = startpos;
1410 break;
1411 }
239c932b
RS
1412 endpos = OVERLAY_POSITION (end);
1413 if (pos < endpos)
2eec3b4e
RS
1414 {
1415 if (idx == len)
1416 {
61d54cd5
RS
1417 if (extend)
1418 {
1419 *len_ptr = len *= 2;
1420 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
1421 *vec_ptr = vec;
1422 }
1423 else
1424 inhibit_storing = 1;
2eec3b4e 1425 }
61d54cd5
RS
1426
1427 if (!inhibit_storing)
1428 vec[idx] = overlay;
1429 idx++;
2eec3b4e 1430 }
239c932b
RS
1431 else if (endpos < pos && endpos > prev)
1432 prev = endpos;
1ab256cb
RM
1433 }
1434
239c932b
RS
1435 if (next_ptr)
1436 *next_ptr = next;
1437 if (prev_ptr)
1438 *prev_ptr = prev;
2eec3b4e
RS
1439 return idx;
1440}
1441\f
5985d248
KH
1442struct sortvec
1443{
1444 Lisp_Object overlay;
1445 int beg, end;
1446 int priority;
1447};
1448
1449static int
1450compare_overlays (s1, s2)
1451 struct sortvec *s1, *s2;
1452{
1453 if (s1->priority != s2->priority)
1454 return s1->priority - s2->priority;
1455 if (s1->beg != s2->beg)
1456 return s1->beg - s2->beg;
1457 if (s1->end != s2->end)
1458 return s2->end - s1->end;
1459 return 0;
1460}
1461
1462/* Sort an array of overlays by priority. The array is modified in place.
1463 The return value is the new size; this may be smaller than the original
1464 size if some of the overlays were invalid or were window-specific. */
1465int
1466sort_overlays (overlay_vec, noverlays, w)
1467 Lisp_Object *overlay_vec;
1468 int noverlays;
1469 struct window *w;
1470{
1471 int i, j;
1472 struct sortvec *sortvec;
1473 sortvec = (struct sortvec *) alloca (noverlays * sizeof (struct sortvec));
1474
1475 /* Put the valid and relevant overlays into sortvec. */
1476
1477 for (i = 0, j = 0; i < noverlays; i++)
1478 {
0fa767e7 1479 Lisp_Object tem;
c99fc30f 1480 Lisp_Object overlay;
5985d248 1481
c99fc30f 1482 overlay = overlay_vec[i];
5985d248
KH
1483 if (OVERLAY_VALID (overlay)
1484 && OVERLAY_POSITION (OVERLAY_START (overlay)) > 0
1485 && OVERLAY_POSITION (OVERLAY_END (overlay)) > 0)
1486 {
0fa767e7
KH
1487 /* If we're interested in a specific window, then ignore
1488 overlays that are limited to some other window. */
1489 if (w)
5985d248 1490 {
0fa767e7
KH
1491 Lisp_Object window;
1492
1493 window = Foverlay_get (overlay, Qwindow);
a7a60ce9 1494 if (WINDOWP (window) && XWINDOW (window) != w)
0fa767e7 1495 continue;
5985d248 1496 }
0fa767e7
KH
1497
1498 /* This overlay is good and counts: put it into sortvec. */
1499 sortvec[j].overlay = overlay;
1500 sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay));
1501 sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay));
1502 tem = Foverlay_get (overlay, Qpriority);
1503 if (INTEGERP (tem))
1504 sortvec[j].priority = XINT (tem);
1505 else
1506 sortvec[j].priority = 0;
1507 j++;
5985d248
KH
1508 }
1509 }
1510 noverlays = j;
1511
1512 /* Sort the overlays into the proper order: increasing priority. */
1513
1514 if (noverlays > 1)
1515 qsort (sortvec, noverlays, sizeof (struct sortvec), compare_overlays);
1516
1517 for (i = 0; i < noverlays; i++)
1518 overlay_vec[i] = sortvec[i].overlay;
1519 return (noverlays);
1520}
1521\f
5c4f68f1 1522/* Shift overlays in BUF's overlay lists, to center the lists at POS. */
1ab256cb 1523
2eec3b4e 1524void
5c4f68f1
JB
1525recenter_overlay_lists (buf, pos)
1526 struct buffer *buf;
2eec3b4e
RS
1527 int pos;
1528{
1529 Lisp_Object overlay, tail, next, prev, beg, end;
1530
1531 /* See if anything in overlays_before should move to overlays_after. */
1532
1533 /* We don't strictly need prev in this loop; it should always be nil.
1534 But we use it for symmetry and in case that should cease to be true
1535 with some future change. */
1536 prev = Qnil;
5c4f68f1 1537 for (tail = buf->overlays_before;
2eec3b4e
RS
1538 CONSP (tail);
1539 prev = tail, tail = next)
1ab256cb 1540 {
2eec3b4e
RS
1541 next = XCONS (tail)->cdr;
1542 overlay = XCONS (tail)->car;
1543
1544 /* If the overlay is not valid, get rid of it. */
1545 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
1546#if 1
1547 abort ();
1548#else
2eec3b4e
RS
1549 {
1550 /* Splice the cons cell TAIL out of overlays_before. */
1551 if (!NILP (prev))
1552 XCONS (prev)->cdr = next;
1553 else
5c4f68f1 1554 buf->overlays_before = next;
2eec3b4e
RS
1555 tail = prev;
1556 continue;
1557 }
52f8ec73 1558#endif
1ab256cb 1559
2eec3b4e
RS
1560 beg = OVERLAY_START (overlay);
1561 end = OVERLAY_END (overlay);
1ab256cb 1562
2eec3b4e 1563 if (OVERLAY_POSITION (end) > pos)
1ab256cb 1564 {
2eec3b4e
RS
1565 /* OVERLAY needs to be moved. */
1566 int where = OVERLAY_POSITION (beg);
1567 Lisp_Object other, other_prev;
1568
1569 /* Splice the cons cell TAIL out of overlays_before. */
1570 if (!NILP (prev))
1571 XCONS (prev)->cdr = next;
1572 else
5c4f68f1 1573 buf->overlays_before = next;
2eec3b4e
RS
1574
1575 /* Search thru overlays_after for where to put it. */
1576 other_prev = Qnil;
5c4f68f1 1577 for (other = buf->overlays_after;
2eec3b4e
RS
1578 CONSP (other);
1579 other_prev = other, other = XCONS (other)->cdr)
1ab256cb 1580 {
2eec3b4e
RS
1581 Lisp_Object otherbeg, otheroverlay, follower;
1582 int win;
1583
1584 otheroverlay = XCONS (other)->car;
1585 if (! OVERLAY_VALID (otheroverlay))
52f8ec73 1586 abort ();
2eec3b4e
RS
1587
1588 otherbeg = OVERLAY_START (otheroverlay);
1589 if (OVERLAY_POSITION (otherbeg) >= where)
1590 break;
1ab256cb 1591 }
2eec3b4e
RS
1592
1593 /* Add TAIL to overlays_after before OTHER. */
1594 XCONS (tail)->cdr = other;
1595 if (!NILP (other_prev))
1596 XCONS (other_prev)->cdr = tail;
1ab256cb 1597 else
5c4f68f1 1598 buf->overlays_after = tail;
2eec3b4e 1599 tail = prev;
1ab256cb 1600 }
2eec3b4e
RS
1601 else
1602 /* We've reached the things that should stay in overlays_before.
1603 All the rest of overlays_before must end even earlier,
1604 so stop now. */
1605 break;
1606 }
1607
1608 /* See if anything in overlays_after should be in overlays_before. */
1609 prev = Qnil;
5c4f68f1 1610 for (tail = buf->overlays_after;
2eec3b4e
RS
1611 CONSP (tail);
1612 prev = tail, tail = next)
1613 {
1614 next = XCONS (tail)->cdr;
1615 overlay = XCONS (tail)->car;
1616
1617 /* If the overlay is not valid, get rid of it. */
1618 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
1619#if 1
1620 abort ();
1621#else
2eec3b4e
RS
1622 {
1623 /* Splice the cons cell TAIL out of overlays_after. */
1624 if (!NILP (prev))
1625 XCONS (prev)->cdr = next;
1626 else
5c4f68f1 1627 buf->overlays_after = next;
2eec3b4e
RS
1628 tail = prev;
1629 continue;
1630 }
52f8ec73 1631#endif
2eec3b4e
RS
1632
1633 beg = OVERLAY_START (overlay);
1634 end = OVERLAY_END (overlay);
1635
1636 /* Stop looking, when we know that nothing further
1637 can possibly end before POS. */
1638 if (OVERLAY_POSITION (beg) > pos)
1639 break;
1640
1641 if (OVERLAY_POSITION (end) <= pos)
1642 {
1643 /* OVERLAY needs to be moved. */
1644 int where = OVERLAY_POSITION (end);
1645 Lisp_Object other, other_prev;
1646
1647 /* Splice the cons cell TAIL out of overlays_after. */
1648 if (!NILP (prev))
1649 XCONS (prev)->cdr = next;
1650 else
5c4f68f1 1651 buf->overlays_after = next;
2eec3b4e
RS
1652
1653 /* Search thru overlays_before for where to put it. */
1654 other_prev = Qnil;
5c4f68f1 1655 for (other = buf->overlays_before;
2eec3b4e
RS
1656 CONSP (other);
1657 other_prev = other, other = XCONS (other)->cdr)
1658 {
1659 Lisp_Object otherend, otheroverlay;
1660 int win;
1661
1662 otheroverlay = XCONS (other)->car;
1663 if (! OVERLAY_VALID (otheroverlay))
52f8ec73 1664 abort ();
2eec3b4e
RS
1665
1666 otherend = OVERLAY_END (otheroverlay);
1667 if (OVERLAY_POSITION (otherend) <= where)
1668 break;
1669 }
1670
1671 /* Add TAIL to overlays_before before OTHER. */
1672 XCONS (tail)->cdr = other;
1673 if (!NILP (other_prev))
1674 XCONS (other_prev)->cdr = tail;
1675 else
5c4f68f1 1676 buf->overlays_before = tail;
2eec3b4e
RS
1677 tail = prev;
1678 }
1679 }
1680
8d7a4592 1681 XSETFASTINT (buf->overlay_center, pos);
2eec3b4e 1682}
2b1bdf65
KH
1683
1684/* Fix up overlays that were garbled as a result of permuting markers
1685 in the range START through END. Any overlay with at least one
1686 endpoint in this range will need to be unlinked from the overlay
1687 list and reinserted in its proper place.
1688 Such an overlay might even have negative size at this point.
1689 If so, we'll reverse the endpoints. Can you think of anything
1690 better to do in this situation? */
1691void
1692fix_overlays_in_range (start, end)
1693 register int start, end;
1694{
1695 Lisp_Object tem, overlay;
1696 Lisp_Object before_list, after_list;
1697 Lisp_Object *ptail, *pbefore = &before_list, *pafter = &after_list;
1698 int startpos, endpos;
1699
1700 /* This algorithm shifts links around instead of consing and GCing.
1701 The loop invariant is that before_list (resp. after_list) is a
1702 well-formed list except that its last element, the one that
1703 *pbefore (resp. *pafter) points to, is still uninitialized.
1704 So it's not a bug that before_list isn't initialized, although
1705 it may look strange. */
1706 for (ptail = &current_buffer->overlays_before; CONSP (*ptail);)
1707 {
1708 overlay = XCONS (*ptail)->car;
1709 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
1710 if (endpos < start)
1711 break;
1712 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
1713 if (endpos < end
1714 || (startpos >= start && startpos < end))
1715 {
1716 /* If the overlay is backwards, fix that now. */
1717 if (startpos > endpos)
1718 {
1719 int tem;
1720 Fset_marker (OVERLAY_START (overlay), endpos, Qnil);
1721 Fset_marker (OVERLAY_END (overlay), startpos, Qnil);
1722 tem = startpos; startpos = endpos; endpos = tem;
1723 }
1724 /* Add it to the end of the wrong list. Later on,
1725 recenter_overlay_lists will move it to the right place. */
1726 if (endpos < XINT (current_buffer->overlay_center))
1727 {
1728 *pafter = *ptail;
1729 pafter = &XCONS (*ptail)->cdr;
1730 }
1731 else
1732 {
1733 *pbefore = *ptail;
1734 pbefore = &XCONS (*ptail)->cdr;
1735 }
1736 *ptail = XCONS (*ptail)->cdr;
1737 }
1738 else
1739 ptail = &XCONS (*ptail)->cdr;
1740 }
1741 for (ptail = &current_buffer->overlays_after; CONSP (*ptail);)
1742 {
1743 overlay = XCONS (*ptail)->car;
1744 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
1745 if (startpos >= end)
1746 break;
1747 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
1748 if (startpos >= start
1749 || (endpos >= start && endpos < end))
1750 {
1751 if (startpos > endpos)
1752 {
1753 int tem;
1754 Fset_marker (OVERLAY_START (overlay), endpos, Qnil);
1755 Fset_marker (OVERLAY_END (overlay), startpos, Qnil);
1756 tem = startpos; startpos = endpos; endpos = tem;
1757 }
1758 if (endpos < XINT (current_buffer->overlay_center))
1759 {
1760 *pafter = *ptail;
1761 pafter = &XCONS (*ptail)->cdr;
1762 }
1763 else
1764 {
1765 *pbefore = *ptail;
1766 pbefore = &XCONS (*ptail)->cdr;
1767 }
1768 *ptail = XCONS (*ptail)->cdr;
1769 }
1770 else
1771 ptail = &XCONS (*ptail)->cdr;
1772 }
1773
1774 /* Splice the constructed (wrong) lists into the buffer's lists,
1775 and let the recenter function make it sane again. */
1776 *pbefore = current_buffer->overlays_before;
1777 current_buffer->overlays_before = before_list;
1778 recenter_overlay_lists (current_buffer,
1779 XINT (current_buffer->overlay_center));
1780
1781 *pafter = current_buffer->overlays_after;
1782 current_buffer->overlays_after = after_list;
1783 recenter_overlay_lists (current_buffer,
1784 XINT (current_buffer->overlay_center));
1785}
2eec3b4e 1786\f
52f8ec73
JB
1787DEFUN ("overlayp", Foverlayp, Soverlayp, 1, 1, 0,
1788 "Return t if OBJECT is an overlay.")
1789 (object)
1790 Lisp_Object object;
1791{
1792 return (OVERLAYP (object) ? Qt : Qnil);
1793}
1794
5c4f68f1
JB
1795DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 3, 0,
1796 "Create a new overlay with range BEG to END in BUFFER.\n\
1797If omitted, BUFFER defaults to the current buffer.\n\
2eec3b4e 1798BEG and END may be integers or markers.")
5c4f68f1
JB
1799 (beg, end, buffer)
1800 Lisp_Object beg, end, buffer;
2eec3b4e
RS
1801{
1802 Lisp_Object overlay;
5c4f68f1 1803 struct buffer *b;
2eec3b4e 1804
5c4f68f1 1805 if (NILP (buffer))
67180c6a 1806 XSETBUFFER (buffer, current_buffer);
883047b9
JB
1807 else
1808 CHECK_BUFFER (buffer, 2);
1809 if (MARKERP (beg)
1810 && ! EQ (Fmarker_buffer (beg), buffer))
1811 error ("Marker points into wrong buffer");
1812 if (MARKERP (end)
1813 && ! EQ (Fmarker_buffer (end), buffer))
1814 error ("Marker points into wrong buffer");
2eec3b4e 1815
883047b9
JB
1816 CHECK_NUMBER_COERCE_MARKER (beg, 1);
1817 CHECK_NUMBER_COERCE_MARKER (end, 1);
5c4f68f1 1818
883047b9 1819 if (XINT (beg) > XINT (end))
5c4f68f1 1820 {
c99fc30f
KH
1821 Lisp_Object temp;
1822 temp = beg; beg = end; end = temp;
5c4f68f1 1823 }
883047b9
JB
1824
1825 b = XBUFFER (buffer);
1826
1827 beg = Fset_marker (Fmake_marker (), beg, buffer);
1828 end = Fset_marker (Fmake_marker (), end, buffer);
5c4f68f1
JB
1829
1830 overlay = Fcons (Fcons (beg, end), Qnil);
52f8ec73 1831 XSETTYPE (overlay, Lisp_Overlay);
2eec3b4e
RS
1832
1833 /* Put the new overlay on the wrong list. */
1834 end = OVERLAY_END (overlay);
5c4f68f1
JB
1835 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1836 b->overlays_after = Fcons (overlay, b->overlays_after);
2eec3b4e 1837 else
5c4f68f1 1838 b->overlays_before = Fcons (overlay, b->overlays_before);
2eec3b4e
RS
1839
1840 /* This puts it in the right list, and in the right order. */
5c4f68f1 1841 recenter_overlay_lists (b, XINT (b->overlay_center));
2eec3b4e 1842
b61982dd
JB
1843 /* We don't need to redisplay the region covered by the overlay, because
1844 the overlay has no properties at the moment. */
1845
2eec3b4e
RS
1846 return overlay;
1847}
1848
5c4f68f1
JB
1849DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
1850 "Set the endpoints of OVERLAY to BEG and END in BUFFER.\n\
3ece337a
JB
1851If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now.\n\
1852If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current\n\
1853buffer.")
5c4f68f1
JB
1854 (overlay, beg, end, buffer)
1855 Lisp_Object overlay, beg, end, buffer;
2eec3b4e 1856{
0a4469c9
RS
1857 struct buffer *b, *ob;
1858 Lisp_Object obuffer;
1859 int count = specpdl_ptr - specpdl;
5c4f68f1 1860
52f8ec73 1861 CHECK_OVERLAY (overlay, 0);
5c4f68f1
JB
1862 if (NILP (buffer))
1863 buffer = Fmarker_buffer (OVERLAY_START (overlay));
3ece337a 1864 if (NILP (buffer))
67180c6a 1865 XSETBUFFER (buffer, current_buffer);
5c4f68f1 1866 CHECK_BUFFER (buffer, 3);
883047b9
JB
1867
1868 if (MARKERP (beg)
1869 && ! EQ (Fmarker_buffer (beg), buffer))
1870 error ("Marker points into wrong buffer");
1871 if (MARKERP (end)
1872 && ! EQ (Fmarker_buffer (end), buffer))
1873 error ("Marker points into wrong buffer");
1874
b61982dd
JB
1875 CHECK_NUMBER_COERCE_MARKER (beg, 1);
1876 CHECK_NUMBER_COERCE_MARKER (end, 1);
1877
9d7608b7
KH
1878 if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate)))
1879 return Fdelete_overlay (overlay);
0a4469c9 1880
b61982dd
JB
1881 if (XINT (beg) > XINT (end))
1882 {
c99fc30f
KH
1883 Lisp_Object temp;
1884 temp = beg; beg = end; end = temp;
b61982dd
JB
1885 }
1886
9d7608b7
KH
1887 specbind (Qinhibit_quit, Qt);
1888
0a4469c9 1889 obuffer = Fmarker_buffer (OVERLAY_START (overlay));
5c4f68f1 1890 b = XBUFFER (buffer);
0a4469c9 1891 ob = XBUFFER (obuffer);
2eec3b4e 1892
c82ed728 1893 /* If the overlay has changed buffers, do a thorough redisplay. */
0a4469c9 1894 if (!EQ (buffer, obuffer))
50760c4a
RS
1895 {
1896 /* Redisplay where the overlay was. */
1897 if (!NILP (obuffer))
1898 {
1899 Lisp_Object o_beg;
1900 Lisp_Object o_end;
1901
1902 o_beg = OVERLAY_START (overlay);
1903 o_end = OVERLAY_END (overlay);
1904 o_beg = OVERLAY_POSITION (o_beg);
1905 o_end = OVERLAY_POSITION (o_end);
1906
efd90478 1907 redisplay_region (ob, XINT (o_beg), XINT (o_end));
50760c4a
RS
1908 }
1909
1910 /* Redisplay where the overlay is going to be. */
efd90478 1911 redisplay_region (b, XINT (beg), XINT (end));
50760c4a
RS
1912
1913 /* Don't limit redisplay to the selected window. */
1914 windows_or_buffers_changed = 1;
1915 }
c82ed728
JB
1916 else
1917 /* Redisplay the area the overlay has just left, or just enclosed. */
1918 {
be8b1c6b
RS
1919 Lisp_Object o_beg;
1920 Lisp_Object o_end;
c82ed728
JB
1921 int change_beg, change_end;
1922
be8b1c6b
RS
1923 o_beg = OVERLAY_START (overlay);
1924 o_end = OVERLAY_END (overlay);
c82ed728
JB
1925 o_beg = OVERLAY_POSITION (o_beg);
1926 o_end = OVERLAY_POSITION (o_end);
1927
1928 if (XINT (o_beg) == XINT (beg))
1929 redisplay_region (b, XINT (o_end), XINT (end));
1930 else if (XINT (o_end) == XINT (end))
1931 redisplay_region (b, XINT (o_beg), XINT (beg));
1932 else
1933 {
1934 if (XINT (beg) < XINT (o_beg)) o_beg = beg;
1935 if (XINT (end) > XINT (o_end)) o_end = end;
1936 redisplay_region (b, XINT (o_beg), XINT (o_end));
1937 }
1938 }
b61982dd 1939
0a4469c9
RS
1940 if (!NILP (obuffer))
1941 {
1942 ob->overlays_before = Fdelq (overlay, ob->overlays_before);
1943 ob->overlays_after = Fdelq (overlay, ob->overlays_after);
1944 }
5c4f68f1
JB
1945
1946 Fset_marker (OVERLAY_START (overlay), beg, buffer);
1947 Fset_marker (OVERLAY_END (overlay), end, buffer);
2eec3b4e
RS
1948
1949 /* Put the overlay on the wrong list. */
1950 end = OVERLAY_END (overlay);
5c4f68f1
JB
1951 if (OVERLAY_POSITION (end) < XINT (b->overlay_center))
1952 b->overlays_after = Fcons (overlay, b->overlays_after);
2eec3b4e 1953 else
5c4f68f1 1954 b->overlays_before = Fcons (overlay, b->overlays_before);
2eec3b4e
RS
1955
1956 /* This puts it in the right list, and in the right order. */
5c4f68f1 1957 recenter_overlay_lists (b, XINT (b->overlay_center));
2eec3b4e 1958
0a4469c9 1959 return unbind_to (count, overlay);
2eec3b4e
RS
1960}
1961
1962DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
5c4f68f1 1963 "Delete the overlay OVERLAY from its buffer.")
2eec3b4e 1964 (overlay)
5c4f68f1 1965 Lisp_Object overlay;
2eec3b4e 1966{
0a4469c9 1967 Lisp_Object buffer;
5c4f68f1 1968 struct buffer *b;
0a4469c9 1969 int count = specpdl_ptr - specpdl;
5c4f68f1 1970
52f8ec73
JB
1971 CHECK_OVERLAY (overlay, 0);
1972
0a4469c9
RS
1973 buffer = Fmarker_buffer (OVERLAY_START (overlay));
1974 if (NILP (buffer))
1975 return Qnil;
1976
1977 b = XBUFFER (buffer);
1978
1979 specbind (Qinhibit_quit, Qt);
5c4f68f1
JB
1980
1981 b->overlays_before = Fdelq (overlay, b->overlays_before);
1982 b->overlays_after = Fdelq (overlay, b->overlays_after);
1983
b61982dd 1984 redisplay_region (b,
a927f5c9
RS
1985 marker_position (OVERLAY_START (overlay)),
1986 marker_position (OVERLAY_END (overlay)));
b61982dd 1987
3ece337a
JB
1988 Fset_marker (OVERLAY_START (overlay), Qnil, Qnil);
1989 Fset_marker (OVERLAY_END (overlay), Qnil, Qnil);
1990
0a4469c9 1991 return unbind_to (count, Qnil);
2eec3b4e
RS
1992}
1993\f
8ebafa8d
JB
1994/* Overlay dissection functions. */
1995
1996DEFUN ("overlay-start", Foverlay_start, Soverlay_start, 1, 1, 0,
1997 "Return the position at which OVERLAY starts.")
1998 (overlay)
1999 Lisp_Object overlay;
2000{
2001 CHECK_OVERLAY (overlay, 0);
2002
2003 return (Fmarker_position (OVERLAY_START (overlay)));
2004}
2005
2006DEFUN ("overlay-end", Foverlay_end, Soverlay_end, 1, 1, 0,
2007 "Return the position at which OVERLAY ends.")
2008 (overlay)
2009 Lisp_Object overlay;
2010{
2011 CHECK_OVERLAY (overlay, 0);
2012
2013 return (Fmarker_position (OVERLAY_END (overlay)));
2014}
2015
2016DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0,
2017 "Return the buffer OVERLAY belongs to.")
2018 (overlay)
2019 Lisp_Object overlay;
2020{
2021 CHECK_OVERLAY (overlay, 0);
2022
2023 return Fmarker_buffer (OVERLAY_START (overlay));
2024}
2025
2026DEFUN ("overlay-properties", Foverlay_properties, Soverlay_properties, 1, 1, 0,
2027 "Return a list of the properties on OVERLAY.\n\
2028This is a copy of OVERLAY's plist; modifying its conses has no effect on\n\
2029OVERLAY.")
2030 (overlay)
2031 Lisp_Object overlay;
2032{
2033 CHECK_OVERLAY (overlay, 0);
2034
2035 return Fcopy_sequence (Fcdr_safe (XCONS (overlay)->cdr));
2036}
2037
2038\f
2eec3b4e 2039DEFUN ("overlays-at", Foverlays_at, Soverlays_at, 1, 1, 0,
eb8c3be9 2040 "Return a list of the overlays that contain position POS.")
2eec3b4e
RS
2041 (pos)
2042 Lisp_Object pos;
2043{
2044 int noverlays;
2eec3b4e
RS
2045 Lisp_Object *overlay_vec;
2046 int len;
2047 Lisp_Object result;
2048
2049 CHECK_NUMBER_COERCE_MARKER (pos, 0);
2050
2051 len = 10;
2052 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
2053
2054 /* Put all the overlays we want in a vector in overlay_vec.
2055 Store the length in len. */
239c932b 2056 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, NULL, NULL);
2eec3b4e
RS
2057
2058 /* Make a list of them all. */
2059 result = Flist (noverlays, overlay_vec);
2060
9ac0d9e0 2061 xfree (overlay_vec);
2eec3b4e
RS
2062 return result;
2063}
2064
2065DEFUN ("next-overlay-change", Fnext_overlay_change, Snext_overlay_change,
2066 1, 1, 0,
bbe20e81
KH
2067 "Return the next position after POS where an overlay starts or ends.\n\
2068If there are no more overlay boundaries after POS, return (point-max).")
2eec3b4e
RS
2069 (pos)
2070 Lisp_Object pos;
2071{
2072 int noverlays;
2073 int endpos;
2074 Lisp_Object *overlay_vec;
2075 int len;
2eec3b4e
RS
2076 int i;
2077
2078 CHECK_NUMBER_COERCE_MARKER (pos, 0);
2079
2080 len = 10;
2081 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
2082
2083 /* Put all the overlays we want in a vector in overlay_vec.
2084 Store the length in len.
2085 endpos gets the position where the next overlay starts. */
239c932b 2086 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, &endpos, NULL);
2eec3b4e
RS
2087
2088 /* If any of these overlays ends before endpos,
2089 use its ending point instead. */
2090 for (i = 0; i < noverlays; i++)
2091 {
2092 Lisp_Object oend;
2093 int oendpos;
2094
2095 oend = OVERLAY_END (overlay_vec[i]);
2096 oendpos = OVERLAY_POSITION (oend);
2097 if (oendpos < endpos)
2098 endpos = oendpos;
1ab256cb
RM
2099 }
2100
9ac0d9e0 2101 xfree (overlay_vec);
2eec3b4e
RS
2102 return make_number (endpos);
2103}
239c932b
RS
2104
2105DEFUN ("previous-overlay-change", Fprevious_overlay_change,
2106 Sprevious_overlay_change, 1, 1, 0,
2107 "Return the previous position before POS where an overlay starts or ends.\n\
2108If there are no more overlay boundaries after POS, return (point-min).")
2109 (pos)
2110 Lisp_Object pos;
2111{
2112 int noverlays;
2113 int prevpos;
2114 Lisp_Object *overlay_vec;
2115 int len;
2116 int i;
2117
2118 CHECK_NUMBER_COERCE_MARKER (pos, 0);
2119
2120 len = 10;
2121 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
2122
2123 /* Put all the overlays we want in a vector in overlay_vec.
2124 Store the length in len.
2125 prevpos gets the position of an overlay end. */
2126 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len, NULL, &prevpos);
2127
2128 /* If any of these overlays starts before endpos,
2129 maybe use its starting point instead. */
2130 for (i = 0; i < noverlays; i++)
2131 {
2132 Lisp_Object ostart;
2133 int ostartpos;
2134
2135 ostart = OVERLAY_START (overlay_vec[i]);
2136 ostartpos = OVERLAY_POSITION (ostart);
2137 if (ostartpos > prevpos && ostartpos < XINT (pos))
2138 prevpos = ostartpos;
2139 }
2140
2141 xfree (overlay_vec);
2142 return make_number (prevpos);
2143}
2eec3b4e
RS
2144\f
2145/* These functions are for debugging overlays. */
2146
2147DEFUN ("overlay-lists", Foverlay_lists, Soverlay_lists, 0, 0, 0,
2148 "Return a pair of lists giving all the overlays of the current buffer.\n\
2149The car has all the overlays before the overlay center;\n\
bbe20e81 2150the cdr has all the overlays after the overlay center.\n\
2eec3b4e
RS
2151Recentering overlays moves overlays between these lists.\n\
2152The lists you get are copies, so that changing them has no effect.\n\
2153However, the overlays you get are the real objects that the buffer uses.")
2154 ()
2155{
2156 Lisp_Object before, after;
2157 before = current_buffer->overlays_before;
2158 if (CONSP (before))
2159 before = Fcopy_sequence (before);
2160 after = current_buffer->overlays_after;
2161 if (CONSP (after))
2162 after = Fcopy_sequence (after);
2163
2164 return Fcons (before, after);
2165}
2166
2167DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0,
2168 "Recenter the overlays of the current buffer around position POS.")
2169 (pos)
2170 Lisp_Object pos;
2171{
2172 CHECK_NUMBER_COERCE_MARKER (pos, 0);
2173
5c4f68f1 2174 recenter_overlay_lists (current_buffer, XINT (pos));
2eec3b4e
RS
2175 return Qnil;
2176}
2177\f
2178DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
2179 "Get the property of overlay OVERLAY with property name NAME.")
2180 (overlay, prop)
2181 Lisp_Object overlay, prop;
2182{
cab4777e 2183 Lisp_Object plist, fallback;
52f8ec73
JB
2184
2185 CHECK_OVERLAY (overlay, 0);
2186
cab4777e
RS
2187 fallback = Qnil;
2188
52f8ec73 2189 for (plist = Fcdr_safe (XCONS (overlay)->cdr);
2eec3b4e
RS
2190 CONSP (plist) && CONSP (XCONS (plist)->cdr);
2191 plist = XCONS (XCONS (plist)->cdr)->cdr)
2192 {
2193 if (EQ (XCONS (plist)->car, prop))
2194 return XCONS (XCONS (plist)->cdr)->car;
cab4777e
RS
2195 else if (EQ (XCONS (plist)->car, Qcategory))
2196 {
2197 Lisp_Object tem;
2198 tem = Fcar (Fcdr (plist));
2199 if (SYMBOLP (tem))
2200 fallback = Fget (tem, prop);
2201 }
2eec3b4e 2202 }
52f8ec73 2203
cab4777e 2204 return fallback;
2eec3b4e
RS
2205}
2206
2207DEFUN ("overlay-put", Foverlay_put, Soverlay_put, 3, 3, 0,
2208 "Set one property of overlay OVERLAY: give property PROP value VALUE.")
2209 (overlay, prop, value)
2210 Lisp_Object overlay, prop, value;
2211{
274a9425 2212 Lisp_Object plist, tail, buffer;
9d7608b7 2213 int changed;
2eec3b4e 2214
52f8ec73 2215 CHECK_OVERLAY (overlay, 0);
b61982dd 2216
274a9425
RS
2217 buffer = Fmarker_buffer (OVERLAY_START (overlay));
2218
52f8ec73 2219 plist = Fcdr_safe (XCONS (overlay)->cdr);
2eec3b4e
RS
2220
2221 for (tail = plist;
2222 CONSP (tail) && CONSP (XCONS (tail)->cdr);
2223 tail = XCONS (XCONS (tail)->cdr)->cdr)
274a9425
RS
2224 if (EQ (XCONS (tail)->car, prop))
2225 {
9d7608b7
KH
2226 changed = !EQ (XCONS (XCONS (tail)->cdr)->car, value);
2227 XCONS (XCONS (tail)->cdr)->car = value;
2228 goto found;
274a9425 2229 }
9d7608b7
KH
2230 /* It wasn't in the list, so add it to the front. */
2231 changed = !NILP (value);
2eec3b4e
RS
2232 if (! CONSP (XCONS (overlay)->cdr))
2233 XCONS (overlay)->cdr = Fcons (Qnil, Qnil);
9d7608b7
KH
2234 XCONS (XCONS (overlay)->cdr)->cdr = Fcons (prop, Fcons (value, plist));
2235 found:
2236 if (! NILP (buffer))
2237 {
2238 if (changed)
2239 redisplay_region (XBUFFER (buffer),
2240 marker_position (OVERLAY_START (overlay)),
2241 marker_position (OVERLAY_END (overlay)));
2242 if (EQ (prop, Qevaporate) && ! NILP (value)
2243 && (OVERLAY_POSITION (OVERLAY_START (overlay))
2244 == OVERLAY_POSITION (OVERLAY_END (overlay))))
2245 Fdelete_overlay (overlay);
2246 }
2eec3b4e 2247 return value;
1ab256cb
RM
2248}
2249\f
173f2a64
RS
2250/* Run the modification-hooks of overlays that include
2251 any part of the text in START to END.
2252 Run the insert-before-hooks of overlay starting at END,
2253 and the insert-after-hooks of overlay ending at START. */
2254
2255void
2256verify_overlay_modification (start, end)
2257 Lisp_Object start, end;
2258{
2259 Lisp_Object prop, overlay, tail;
2260 int insertion = EQ (start, end);
55b48893
RS
2261 int tail_copied;
2262 struct gcpro gcpro1, gcpro2;
2263
2264 overlay = Qnil;
2265 tail = Qnil;
2266 GCPRO2 (overlay, tail);
173f2a64 2267
55b48893 2268 tail_copied = 0;
173f2a64
RS
2269 for (tail = current_buffer->overlays_before;
2270 CONSP (tail);
2271 tail = XCONS (tail)->cdr)
2272 {
2273 int startpos, endpos;
be8b1c6b 2274 Lisp_Object ostart, oend;
173f2a64
RS
2275
2276 overlay = XCONS (tail)->car;
2277
2278 ostart = OVERLAY_START (overlay);
2279 oend = OVERLAY_END (overlay);
2280 endpos = OVERLAY_POSITION (oend);
2281 if (XFASTINT (start) > endpos)
2282 break;
2283 startpos = OVERLAY_POSITION (ostart);
2284 if (XFASTINT (end) == startpos && insertion)
2285 {
2286 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
5fb5aa33
RS
2287 if (!NILP (prop))
2288 {
2289 /* Copy TAIL in case the hook recenters the overlay lists. */
55b48893
RS
2290 if (!tail_copied)
2291 tail = Fcopy_sequence (tail);
2292 tail_copied = 1;
5fb5aa33
RS
2293 call_overlay_mod_hooks (prop, overlay, start, end);
2294 }
173f2a64
RS
2295 }
2296 if (XFASTINT (start) == endpos && insertion)
2297 {
2298 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
5fb5aa33
RS
2299 if (!NILP (prop))
2300 {
55b48893
RS
2301 if (!tail_copied)
2302 tail = Fcopy_sequence (tail);
2303 tail_copied = 1;
5fb5aa33
RS
2304 call_overlay_mod_hooks (prop, overlay, start, end);
2305 }
173f2a64 2306 }
3bd13e92
KH
2307 /* Test for intersecting intervals. This does the right thing
2308 for both insertion and deletion. */
2309 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
173f2a64
RS
2310 {
2311 prop = Foverlay_get (overlay, Qmodification_hooks);
5fb5aa33
RS
2312 if (!NILP (prop))
2313 {
55b48893
RS
2314 if (!tail_copied)
2315 tail = Fcopy_sequence (tail);
2316 tail_copied = 1;
5fb5aa33
RS
2317 call_overlay_mod_hooks (prop, overlay, start, end);
2318 }
173f2a64
RS
2319 }
2320 }
2321
55b48893 2322 tail_copied = 0;
173f2a64
RS
2323 for (tail = current_buffer->overlays_after;
2324 CONSP (tail);
2325 tail = XCONS (tail)->cdr)
2326 {
2327 int startpos, endpos;
be8b1c6b 2328 Lisp_Object ostart, oend;
173f2a64
RS
2329
2330 overlay = XCONS (tail)->car;
2331
2332 ostart = OVERLAY_START (overlay);
2333 oend = OVERLAY_END (overlay);
2334 startpos = OVERLAY_POSITION (ostart);
cdf0b096 2335 endpos = OVERLAY_POSITION (oend);
173f2a64
RS
2336 if (XFASTINT (end) < startpos)
2337 break;
2338 if (XFASTINT (end) == startpos && insertion)
2339 {
2340 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
5fb5aa33
RS
2341 if (!NILP (prop))
2342 {
55b48893
RS
2343 if (!tail_copied)
2344 tail = Fcopy_sequence (tail);
2345 tail_copied = 1;
5fb5aa33
RS
2346 call_overlay_mod_hooks (prop, overlay, start, end);
2347 }
173f2a64
RS
2348 }
2349 if (XFASTINT (start) == endpos && insertion)
2350 {
2351 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
5fb5aa33
RS
2352 if (!NILP (prop))
2353 {
55b48893
RS
2354 if (!tail_copied)
2355 tail = Fcopy_sequence (tail);
2356 tail_copied = 1;
5fb5aa33
RS
2357 call_overlay_mod_hooks (prop, overlay, start, end);
2358 }
173f2a64 2359 }
3bd13e92
KH
2360 /* Test for intersecting intervals. This does the right thing
2361 for both insertion and deletion. */
2362 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
173f2a64
RS
2363 {
2364 prop = Foverlay_get (overlay, Qmodification_hooks);
5fb5aa33
RS
2365 if (!NILP (prop))
2366 {
55b48893
RS
2367 if (!tail_copied)
2368 tail = Fcopy_sequence (tail);
2369 tail_copied = 1;
5fb5aa33
RS
2370 call_overlay_mod_hooks (prop, overlay, start, end);
2371 }
173f2a64
RS
2372 }
2373 }
55b48893
RS
2374
2375 UNGCPRO;
173f2a64
RS
2376}
2377
2378static void
2379call_overlay_mod_hooks (list, overlay, start, end)
2380 Lisp_Object list, overlay, start, end;
2381{
2382 struct gcpro gcpro1;
2383 GCPRO1 (list);
2384 while (!NILP (list))
2385 {
2386 call3 (Fcar (list), overlay, start, end);
2387 list = Fcdr (list);
2388 }
2389 UNGCPRO;
2390}
9d7608b7
KH
2391
2392/* Delete any zero-sized overlays at position POS, if the `evaporate'
2393 property is set. */
2394void
2395evaporate_overlays (pos)
2396 int pos;
2397{
2398 Lisp_Object tail, overlay, hit_list;
2399
2400 hit_list = Qnil;
2401 if (pos <= XFASTINT (current_buffer->overlay_center))
2402 for (tail = current_buffer->overlays_before; CONSP (tail);
2403 tail = XCONS (tail)->cdr)
2404 {
2405 int endpos;
2406 overlay = XCONS (tail)->car;
2407 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
2408 if (endpos < pos)
2409 break;
2410 if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos
2411 && Foverlay_get (overlay, Qevaporate))
2412 hit_list = Fcons (overlay, hit_list);
2413 }
2414 else
2415 for (tail = current_buffer->overlays_after; CONSP (tail);
2416 tail = XCONS (tail)->cdr)
2417 {
2418 int startpos;
889bf329 2419 overlay = XCONS (tail)->car;
9d7608b7
KH
2420 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
2421 if (startpos > pos)
2422 break;
2423 if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos
2424 && Foverlay_get (overlay, Qevaporate))
2425 hit_list = Fcons (overlay, hit_list);
2426 }
2427 for (; CONSP (hit_list); hit_list = XCONS (hit_list)->cdr)
2428 Fdelete_overlay (XCONS (hit_list)->car);
2429}
173f2a64 2430\f
54dfdeb0
KH
2431/* Somebody has tried to store a value with an unacceptable type
2432 into the buffer-local slot with offset OFFSET. */
0fa3ba92 2433void
54dfdeb0
KH
2434buffer_slot_type_mismatch (offset)
2435 int offset;
0fa3ba92 2436{
54dfdeb0 2437 Lisp_Object sym;
0fa3ba92 2438 char *type_name;
54dfdeb0 2439 sym = *(Lisp_Object *)(offset + (char *)&buffer_local_symbols);
0fa3ba92
JB
2440 switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types)))
2441 {
2442 case Lisp_Int: type_name = "integers"; break;
2443 case Lisp_String: type_name = "strings"; break;
0fa3ba92 2444 case Lisp_Symbol: type_name = "symbols"; break;
0fa3ba92
JB
2445 default:
2446 abort ();
2447 }
2448
2449 error ("only %s should be stored in the buffer-local variable %s",
54dfdeb0 2450 type_name, XSYMBOL (sym)->name->data);
0fa3ba92
JB
2451}
2452\f
1ab256cb
RM
2453init_buffer_once ()
2454{
2455 register Lisp_Object tem;
2456
2457 /* Make sure all markable slots in buffer_defaults
2458 are initialized reasonably, so mark_buffer won't choke. */
2459 reset_buffer (&buffer_defaults);
bcd40520 2460 reset_buffer_local_variables (&buffer_defaults);
1ab256cb 2461 reset_buffer (&buffer_local_symbols);
bcd40520 2462 reset_buffer_local_variables (&buffer_local_symbols);
67180c6a
KH
2463 XSETBUFFER (Vbuffer_defaults, &buffer_defaults);
2464 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols);
1ab256cb
RM
2465
2466 /* Set up the default values of various buffer slots. */
2467 /* Must do these before making the first buffer! */
2468
2469 /* real setup is done in loaddefs.el */
2470 buffer_defaults.mode_line_format = build_string ("%-");
2471 buffer_defaults.abbrev_mode = Qnil;
2472 buffer_defaults.overwrite_mode = Qnil;
2473 buffer_defaults.case_fold_search = Qt;
2474 buffer_defaults.auto_fill_function = Qnil;
2475 buffer_defaults.selective_display = Qnil;
2476#ifndef old
2477 buffer_defaults.selective_display_ellipses = Qt;
2478#endif
2479 buffer_defaults.abbrev_table = Qnil;
2480 buffer_defaults.display_table = Qnil;
1ab256cb 2481 buffer_defaults.undo_list = Qnil;
c48f61ef 2482 buffer_defaults.mark_active = Qnil;
2eec3b4e
RS
2483 buffer_defaults.overlays_before = Qnil;
2484 buffer_defaults.overlays_after = Qnil;
8d7a4592 2485 XSETFASTINT (buffer_defaults.overlay_center, 1);
1ab256cb 2486
8d7a4592 2487 XSETFASTINT (buffer_defaults.tab_width, 8);
1ab256cb
RM
2488 buffer_defaults.truncate_lines = Qnil;
2489 buffer_defaults.ctl_arrow = Qt;
2490
54ad07d3 2491#ifdef MSDOS
0776cb1b 2492 buffer_defaults.buffer_file_type = Qnil; /* TEXT */
54ad07d3 2493#endif
8d7a4592
KH
2494 XSETFASTINT (buffer_defaults.fill_column, 70);
2495 XSETFASTINT (buffer_defaults.left_margin, 0);
28e969dd 2496 buffer_defaults.cache_long_line_scans = Qnil;
1ab256cb
RM
2497
2498 /* Assign the local-flags to the slots that have default values.
2499 The local flag is a bit that is used in the buffer
2500 to say that it has its own local value for the slot.
2501 The local flag bits are in the local_var_flags slot of the buffer. */
2502
2503 /* Nothing can work if this isn't true */
4d2f1389 2504 if (sizeof (EMACS_INT) != sizeof (Lisp_Object)) abort ();
1ab256cb
RM
2505
2506 /* 0 means not a lisp var, -1 means always local, else mask */
2507 bzero (&buffer_local_flags, sizeof buffer_local_flags);
aab80822
KH
2508 XSETINT (buffer_local_flags.filename, -1);
2509 XSETINT (buffer_local_flags.directory, -1);
2510 XSETINT (buffer_local_flags.backed_up, -1);
2511 XSETINT (buffer_local_flags.save_length, -1);
2512 XSETINT (buffer_local_flags.auto_save_file_name, -1);
2513 XSETINT (buffer_local_flags.read_only, -1);
2514 XSETINT (buffer_local_flags.major_mode, -1);
2515 XSETINT (buffer_local_flags.mode_name, -1);
2516 XSETINT (buffer_local_flags.undo_list, -1);
2517 XSETINT (buffer_local_flags.mark_active, -1);
8d7a4592
KH
2518
2519 XSETFASTINT (buffer_local_flags.mode_line_format, 1);
2520 XSETFASTINT (buffer_local_flags.abbrev_mode, 2);
2521 XSETFASTINT (buffer_local_flags.overwrite_mode, 4);
2522 XSETFASTINT (buffer_local_flags.case_fold_search, 8);
2523 XSETFASTINT (buffer_local_flags.auto_fill_function, 0x10);
2524 XSETFASTINT (buffer_local_flags.selective_display, 0x20);
1ab256cb 2525#ifndef old
8d7a4592 2526 XSETFASTINT (buffer_local_flags.selective_display_ellipses, 0x40);
1ab256cb 2527#endif
8d7a4592
KH
2528 XSETFASTINT (buffer_local_flags.tab_width, 0x80);
2529 XSETFASTINT (buffer_local_flags.truncate_lines, 0x100);
2530 XSETFASTINT (buffer_local_flags.ctl_arrow, 0x200);
2531 XSETFASTINT (buffer_local_flags.fill_column, 0x400);
2532 XSETFASTINT (buffer_local_flags.left_margin, 0x800);
2533 XSETFASTINT (buffer_local_flags.abbrev_table, 0x1000);
2534 XSETFASTINT (buffer_local_flags.display_table, 0x2000);
2535 XSETFASTINT (buffer_local_flags.syntax_table, 0x8000);
28e969dd 2536 XSETFASTINT (buffer_local_flags.cache_long_line_scans, 0x10000);
54ad07d3 2537#ifdef MSDOS
8d7a4592 2538 XSETFASTINT (buffer_local_flags.buffer_file_type, 0x4000);
54ad07d3 2539#endif
1ab256cb
RM
2540
2541 Vbuffer_alist = Qnil;
2542 current_buffer = 0;
2543 all_buffers = 0;
2544
2545 QSFundamental = build_string ("Fundamental");
2546
2547 Qfundamental_mode = intern ("fundamental-mode");
2548 buffer_defaults.major_mode = Qfundamental_mode;
2549
2550 Qmode_class = intern ("mode-class");
2551
2552 Qprotected_field = intern ("protected-field");
2553
2554 Qpermanent_local = intern ("permanent-local");
2555
2556 Qkill_buffer_hook = intern ("kill-buffer-hook");
2557
2558 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
2559 /* super-magic invisible buffer */
2560 Vbuffer_alist = Qnil;
2561
ffd56f97 2562 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1ab256cb
RM
2563}
2564
2565init_buffer ()
2566{
2567 char buf[MAXPATHLEN+1];
2381d133
JB
2568 char *pwd;
2569 struct stat dotstat, pwdstat;
136351b7 2570 Lisp_Object temp;
1ab256cb
RM
2571
2572 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
2381d133
JB
2573
2574 /* If PWD is accurate, use it instead of calling getwd. This is faster
2575 when PWD is right, and may avoid a fatal error. */
2576 if ((pwd = getenv ("PWD")) != 0 && *pwd == '/'
2577 && stat (pwd, &pwdstat) == 0
2578 && stat (".", &dotstat) == 0
2579 && dotstat.st_ino == pwdstat.st_ino
2580 && dotstat.st_dev == pwdstat.st_dev
2581 && strlen (pwd) < MAXPATHLEN)
2582 strcpy (buf, pwd);
2583 else if (getwd (buf) == 0)
1ab256cb
RM
2584 fatal ("`getwd' failed: %s.\n", buf);
2585
2586#ifndef VMS
2587 /* Maybe this should really use some standard subroutine
2588 whose definition is filename syntax dependent. */
2589 if (buf[strlen (buf) - 1] != '/')
2590 strcat (buf, "/");
2591#endif /* not VMS */
2592 current_buffer->directory = build_string (buf);
136351b7
RS
2593
2594 temp = get_minibuffer (0);
2595 XBUFFER (temp)->directory = current_buffer->directory;
1ab256cb
RM
2596}
2597
2598/* initialize the buffer routines */
2599syms_of_buffer ()
2600{
188d4d11
RM
2601 extern Lisp_Object Qdisabled;
2602
1ab256cb
RM
2603 staticpro (&Vbuffer_defaults);
2604 staticpro (&Vbuffer_local_symbols);
2605 staticpro (&Qfundamental_mode);
2606 staticpro (&Qmode_class);
2607 staticpro (&QSFundamental);
2608 staticpro (&Vbuffer_alist);
2609 staticpro (&Qprotected_field);
2610 staticpro (&Qpermanent_local);
2611 staticpro (&Qkill_buffer_hook);
52f8ec73 2612 staticpro (&Qoverlayp);
9d7608b7
KH
2613 Qevaporate = intern ("evaporate");
2614 staticpro (&Qevaporate);
294d215f
RS
2615 staticpro (&Qmodification_hooks);
2616 Qmodification_hooks = intern ("modification-hooks");
2617 staticpro (&Qinsert_in_front_hooks);
2618 Qinsert_in_front_hooks = intern ("insert-in-front-hooks");
2619 staticpro (&Qinsert_behind_hooks);
2620 Qinsert_behind_hooks = intern ("insert-behind-hooks");
5fe0b67e
RS
2621 staticpro (&Qget_file_buffer);
2622 Qget_file_buffer = intern ("get-file-buffer");
5985d248
KH
2623 Qpriority = intern ("priority");
2624 staticpro (&Qpriority);
2625 Qwindow = intern ("window");
2626 staticpro (&Qwindow);
52f8ec73
JB
2627
2628 Qoverlayp = intern ("overlayp");
1ab256cb
RM
2629
2630 Fput (Qprotected_field, Qerror_conditions,
2631 Fcons (Qprotected_field, Fcons (Qerror, Qnil)));
2632 Fput (Qprotected_field, Qerror_message,
2633 build_string ("Attempt to modify a protected field"));
2634
2635 /* All these use DEFVAR_LISP_NOPRO because the slots in
2636 buffer_defaults will all be marked via Vbuffer_defaults. */
2637
2638 DEFVAR_LISP_NOPRO ("default-mode-line-format",
2639 &buffer_defaults.mode_line_format,
2640 "Default value of `mode-line-format' for buffers that don't override it.\n\
2641This is the same as (default-value 'mode-line-format).");
2642
2643 DEFVAR_LISP_NOPRO ("default-abbrev-mode",
2644 &buffer_defaults.abbrev_mode,
2645 "Default value of `abbrev-mode' for buffers that do not override it.\n\
2646This is the same as (default-value 'abbrev-mode).");
2647
2648 DEFVAR_LISP_NOPRO ("default-ctl-arrow",
2649 &buffer_defaults.ctl_arrow,
2650 "Default value of `ctl-arrow' for buffers that do not override it.\n\
2651This is the same as (default-value 'ctl-arrow).");
2652
2653 DEFVAR_LISP_NOPRO ("default-truncate-lines",
2654 &buffer_defaults.truncate_lines,
2655 "Default value of `truncate-lines' for buffers that do not override it.\n\
2656This is the same as (default-value 'truncate-lines).");
2657
2658 DEFVAR_LISP_NOPRO ("default-fill-column",
2659 &buffer_defaults.fill_column,
2660 "Default value of `fill-column' for buffers that do not override it.\n\
2661This is the same as (default-value 'fill-column).");
2662
2663 DEFVAR_LISP_NOPRO ("default-left-margin",
2664 &buffer_defaults.left_margin,
2665 "Default value of `left-margin' for buffers that do not override it.\n\
2666This is the same as (default-value 'left-margin).");
2667
2668 DEFVAR_LISP_NOPRO ("default-tab-width",
2669 &buffer_defaults.tab_width,
2670 "Default value of `tab-width' for buffers that do not override it.\n\
2671This is the same as (default-value 'tab-width).");
2672
2673 DEFVAR_LISP_NOPRO ("default-case-fold-search",
2674 &buffer_defaults.case_fold_search,
2675 "Default value of `case-fold-search' for buffers that don't override it.\n\
2676This is the same as (default-value 'case-fold-search).");
2677
54ad07d3
RS
2678#ifdef MSDOS
2679 DEFVAR_LISP_NOPRO ("default-buffer-file-type",
2680 &buffer_defaults.buffer_file_type,
2681 "Default file type for buffers that do not override it.\n\
2682This is the same as (default-value 'buffer-file-type).\n\
2683The file type is nil for text, t for binary.");
2684#endif
2685
0fa3ba92
JB
2686 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
2687 Qnil, 0);
1ab256cb
RM
2688
2689/* This doc string is too long for cpp; cpp dies if it isn't in a comment.
2690 But make-docfile finds it!
2691 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
bec44fd6 2692 Qnil,
1ab256cb
RM
2693 "Template for displaying mode line for current buffer.\n\
2694Each buffer has its own value of this variable.\n\
2695Value may be a string, a symbol or a list or cons cell.\n\
2696For a symbol, its value is used (but it is ignored if t or nil).\n\
2697 A string appearing directly as the value of a symbol is processed verbatim\n\
2698 in that the %-constructs below are not recognized.\n\
2699For a list whose car is a symbol, the symbol's value is taken,\n\
2700 and if that is non-nil, the cadr of the list is processed recursively.\n\
2701 Otherwise, the caddr of the list (if there is one) is processed.\n\
2702For a list whose car is a string or list, each element is processed\n\
2703 recursively and the results are effectively concatenated.\n\
2704For a list whose car is an integer, the cdr of the list is processed\n\
2705 and padded (if the number is positive) or truncated (if negative)\n\
2706 to the width specified by that number.\n\
2707A string is printed verbatim in the mode line except for %-constructs:\n\
2708 (%-constructs are allowed when the string is the entire mode-line-format\n\
2709 or when it is found in a cons-cell or a list)\n\
2710 %b -- print buffer name. %f -- print visited file name.\n\
c2ff34f7
RS
2711 %* -- print %, * or hyphen. %+ -- print *, % or hyphen.\n\
2712 % means buffer is read-only and * means it is modified.\n\
2713 For a modified read-only buffer, %* gives % and %+ gives *.\n\
a97c374a 2714 %s -- print process status. %l -- print the current line number.\n\
dd24e6a6 2715 %p -- print percent of buffer above top of window, or Top, Bot or All.\n\
9d130ffc 2716 %P -- print percent of buffer above bottom of window, perhaps plus Top,\n\
dd24e6a6 2717 or print Bottom or All.\n\
1ab256cb 2718 %n -- print Narrow if appropriate.\n\
54ad07d3 2719 %t -- print T if files is text, B if binary.\n\
1ab256cb
RM
2720 %[ -- print one [ for each recursive editing level. %] similar.\n\
2721 %% -- print %. %- -- print infinitely many dashes.\n\
2722Decimal digits after the % specify field width to which to pad.");
2723*/
2724
2725 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode,
2726 "*Major mode for new buffers. Defaults to `fundamental-mode'.\n\
2727nil here means use current buffer's major mode.");
2728
2729 DEFVAR_PER_BUFFER ("major-mode", &current_buffer->major_mode,
0fa3ba92 2730 make_number (Lisp_Symbol),
1ab256cb
RM
2731 "Symbol for current buffer's major mode.");
2732
2733 DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
0fa3ba92 2734 make_number (Lisp_String),
1ab256cb
RM
2735 "Pretty name of current buffer's major mode (a string).");
2736
0fa3ba92 2737 DEFVAR_PER_BUFFER ("abbrev-mode", &current_buffer->abbrev_mode, Qnil,
1ab256cb
RM
2738 "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\
2739Automatically becomes buffer-local when set in any fashion.");
2740
2741 DEFVAR_PER_BUFFER ("case-fold-search", &current_buffer->case_fold_search,
0fa3ba92 2742 Qnil,
1ab256cb
RM
2743 "*Non-nil if searches should ignore case.\n\
2744Automatically becomes buffer-local when set in any fashion.");
2745
2746 DEFVAR_PER_BUFFER ("fill-column", &current_buffer->fill_column,
0fa3ba92 2747 make_number (Lisp_Int),
1ab256cb
RM
2748 "*Column beyond which automatic line-wrapping should happen.\n\
2749Automatically becomes buffer-local when set in any fashion.");
2750
2751 DEFVAR_PER_BUFFER ("left-margin", &current_buffer->left_margin,
0fa3ba92 2752 make_number (Lisp_Int),
1ab256cb
RM
2753 "*Column for the default indent-line-function to indent to.\n\
2754Linefeed indents to this column in Fundamental mode.\n\
2755Automatically becomes buffer-local when set in any fashion.");
2756
2757 DEFVAR_PER_BUFFER ("tab-width", &current_buffer->tab_width,
0fa3ba92 2758 make_number (Lisp_Int),
1ab256cb
RM
2759 "*Distance between tab stops (for display of tab characters), in columns.\n\
2760Automatically becomes buffer-local when set in any fashion.");
2761
0fa3ba92 2762 DEFVAR_PER_BUFFER ("ctl-arrow", &current_buffer->ctl_arrow, Qnil,
1ab256cb
RM
2763 "*Non-nil means display control chars with uparrow.\n\
2764Nil means use backslash and octal digits.\n\
2765Automatically becomes buffer-local when set in any fashion.\n\
2766This variable does not apply to characters whose display is specified\n\
2767in the current display table (if there is one).");
2768
0fa3ba92 2769 DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
1ab256cb
RM
2770 "*Non-nil means do not display continuation lines;\n\
2771give each line of text one screen line.\n\
2772Automatically becomes buffer-local when set in any fashion.\n\
2773\n\
2774Note that this is overridden by the variable\n\
2775`truncate-partial-width-windows' if that variable is non-nil\n\
502b9b64 2776and this buffer is not full-frame width.");
1ab256cb 2777
54ad07d3
RS
2778#ifdef MSDOS
2779 DEFVAR_PER_BUFFER ("buffer-file-type", &current_buffer->buffer_file_type,
2780 Qnil,
2781 "*If visited file is text, nil; otherwise, t.");
2782#endif
2783
1ab256cb 2784 DEFVAR_PER_BUFFER ("default-directory", &current_buffer->directory,
0fa3ba92 2785 make_number (Lisp_String),
1ab256cb
RM
2786 "Name of default directory of current buffer. Should end with slash.\n\
2787Each buffer has its own value of this variable.");
2788
2789 DEFVAR_PER_BUFFER ("auto-fill-function", &current_buffer->auto_fill_function,
0fa3ba92 2790 Qnil,
1ab256cb
RM
2791 "Function called (if non-nil) to perform auto-fill.\n\
2792It is called after self-inserting a space at a column beyond `fill-column'.\n\
2793Each buffer has its own value of this variable.\n\
2794NOTE: This variable is not an ordinary hook;\n\
2795It may not be a list of functions.");
2796
2797 DEFVAR_PER_BUFFER ("buffer-file-name", &current_buffer->filename,
0fa3ba92 2798 make_number (Lisp_String),
1ab256cb
RM
2799 "Name of file visited in current buffer, or nil if not visiting a file.\n\
2800Each buffer has its own value of this variable.");
2801
2802 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
3f5fcd47 2803 &current_buffer->auto_save_file_name,
0fa3ba92 2804 make_number (Lisp_String),
1ab256cb
RM
2805 "Name of file for auto-saving current buffer,\n\
2806or nil if buffer should not be auto-saved.\n\
2807Each buffer has its own value of this variable.");
2808
0fa3ba92 2809 DEFVAR_PER_BUFFER ("buffer-read-only", &current_buffer->read_only, Qnil,
1ab256cb
RM
2810 "Non-nil if this buffer is read-only.\n\
2811Each buffer has its own value of this variable.");
2812
0fa3ba92 2813 DEFVAR_PER_BUFFER ("buffer-backed-up", &current_buffer->backed_up, Qnil,
1ab256cb
RM
2814 "Non-nil if this buffer's file has been backed up.\n\
2815Backing up is done before the first time the file is saved.\n\
2816Each buffer has its own value of this variable.");
2817
2818 DEFVAR_PER_BUFFER ("buffer-saved-size", &current_buffer->save_length,
0fa3ba92 2819 make_number (Lisp_Int),
1ab256cb
RM
2820 "Length of current buffer when last read in, saved or auto-saved.\n\
28210 initially.\n\
2822Each buffer has its own value of this variable.");
2823
2824 DEFVAR_PER_BUFFER ("selective-display", &current_buffer->selective_display,
0fa3ba92 2825 Qnil,
1ab256cb
RM
2826 "Non-nil enables selective display:\n\
2827Integer N as value means display only lines\n\
2828 that start with less than n columns of space.\n\
2829A value of t means, after a ^M, all the rest of the line is invisible.\n\
2830 Then ^M's in the file are written into files as newlines.\n\n\
2831Automatically becomes buffer-local when set in any fashion.");
2832
2833#ifndef old
2834 DEFVAR_PER_BUFFER ("selective-display-ellipses",
2835 &current_buffer->selective_display_ellipses,
0fa3ba92 2836 Qnil,
1ab256cb
RM
2837 "t means display ... on previous line when a line is invisible.\n\
2838Automatically becomes buffer-local when set in any fashion.");
2839#endif
2840
0fa3ba92 2841 DEFVAR_PER_BUFFER ("overwrite-mode", &current_buffer->overwrite_mode, Qnil,
1ab256cb 2842 "Non-nil if self-insertion should replace existing text.\n\
6bbb0d4a
JB
2843If non-nil and not `overwrite-mode-binary', self-insertion still\n\
2844inserts at the end of a line, and inserts when point is before a tab,\n\
2e94b813 2845until the tab is filled in.\n\
6bbb0d4a 2846If `overwrite-mode-binary', self-insertion replaces newlines and tabs too.\n\
1ab256cb
RM
2847Automatically becomes buffer-local when set in any fashion.");
2848
54939090
RS
2849#if 0 /* The doc string is too long for some compilers,
2850 but make-docfile can find it in this comment. */
1ab256cb 2851 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
5d305367 2852 Qnil,
1ab256cb
RM
2853 "Display table that controls display of the contents of current buffer.\n\
2854Automatically becomes buffer-local when set in any fashion.\n\
2855The display table is a vector created with `make-display-table'.\n\
2856The first 256 elements control how to display each possible text character.\n\
6158b3b0 2857Each value should be a vector of characters or nil;\n\
1ab256cb 2858nil means display the character in the default fashion.\n\
a45e35e1 2859The remaining six elements control the display of\n\
6158b3b0
JB
2860 the end of a truncated screen line (element 256, a single character);\n\
2861 the end of a continued line (element 257, a single character);\n\
2862 the escape character used to display character codes in octal\n\
2863 (element 258, a single character);\n\
2864 the character used as an arrow for control characters (element 259,\n\
2865 a single character);\n\
2866 the decoration indicating the presence of invisible lines (element 260,\n\
a45e35e1
JB
2867 a vector of characters);\n\
2868 the character used to draw the border between side-by-side windows\n\
3402827c 2869 (element 261, a single character).\n\
1ab256cb
RM
2870If this variable is nil, the value of `standard-display-table' is used.\n\
2871Each window can have its own, overriding display table.");
54939090
RS
2872#endif
2873 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
de15914a 2874 Qnil, 0);
1ab256cb 2875
1ab256cb
RM
2876/*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
2877 "Don't ask.");
2878*/
01050cb5 2879 DEFVAR_LISP ("before-change-function", &Vbefore_change_function,
1ab256cb
RM
2880 "Function to call before each text change.\n\
2881Two arguments are passed to the function: the positions of\n\
2882the beginning and end of the range of old text to be changed.\n\
2883\(For an insertion, the beginning and end are at the same place.)\n\
2884No information is given about the length of the text after the change.\n\
1ab256cb 2885\n\
5f079267 2886Buffer changes made while executing the `before-change-function'\n\
b86344d0
RS
2887don't call any before-change or after-change functions.\n\
2888That's because these variables are temporarily set to nil.\n\
2889As a result, a hook function cannot straightforwardly alter the value of\n\
2890these variables. See the Emacs Lisp manual for a way of\n\
d59698c4 2891accomplishing an equivalent result by using other variables.");
1ab256cb
RM
2892 Vbefore_change_function = Qnil;
2893
2894 DEFVAR_LISP ("after-change-function", &Vafter_change_function,
2895 "Function to call after each text change.\n\
2896Three arguments are passed to the function: the positions of\n\
2897the beginning and end of the range of changed text,\n\
2898and the length of the pre-change text replaced by that range.\n\
2899\(For an insertion, the pre-change length is zero;\n\
2900for a deletion, that length is the number of characters deleted,\n\
2901and the post-change beginning and end are at the same place.)\n\
2902\n\
5f079267 2903Buffer changes made while executing the `after-change-function'\n\
b86344d0
RS
2904don't call any before-change or after-change functions.\n\
2905That's because these variables are temporarily set to nil.\n\
2906As a result, a hook function cannot straightforwardly alter the value of\n\
2907these variables. See the Emacs Lisp manual for a way of\n\
d59698c4 2908accomplishing an equivalent result by using other variables.");
1ab256cb
RM
2909 Vafter_change_function = Qnil;
2910
5f079267
RS
2911 DEFVAR_LISP ("before-change-functions", &Vbefore_change_functions,
2912 "List of functions to call before each text change.\n\
2913Two arguments are passed to each function: the positions of\n\
2914the beginning and end of the range of old text to be changed.\n\
2915\(For an insertion, the beginning and end are at the same place.)\n\
2916No information is given about the length of the text after the change.\n\
5f079267
RS
2917\n\
2918Buffer changes made while executing the `before-change-functions'\n\
b86344d0
RS
2919don't call any before-change or after-change functions.\n\
2920That's because these variables are temporarily set to nil.\n\
2921As a result, a hook function cannot straightforwardly alter the value of\n\
2922these variables. See the Emacs Lisp manual for a way of\n\
d59698c4 2923accomplishing an equivalent result by using other variables.");
5f079267
RS
2924 Vbefore_change_functions = Qnil;
2925
2926 DEFVAR_LISP ("after-change-functions", &Vafter_change_functions,
2927 "List of function to call after each text change.\n\
2928Three arguments are passed to each function: the positions of\n\
2929the beginning and end of the range of changed text,\n\
2930and the length of the pre-change text replaced by that range.\n\
2931\(For an insertion, the pre-change length is zero;\n\
2932for a deletion, that length is the number of characters deleted,\n\
2933and the post-change beginning and end are at the same place.)\n\
2934\n\
2935Buffer changes made while executing the `after-change-functions'\n\
b86344d0
RS
2936don't call any before-change or after-change functions.\n\
2937That's because these variables are temporarily set to nil.\n\
2938As a result, a hook function cannot straightforwardly alter the value of\n\
2939these variables. See the Emacs Lisp manual for a way of\n\
d59698c4 2940accomplishing an equivalent result by using other variables.");
b86344d0 2941
5f079267
RS
2942 Vafter_change_functions = Qnil;
2943
dbc4e1c1
JB
2944 DEFVAR_LISP ("first-change-hook", &Vfirst_change_hook,
2945 "A list of functions to call before changing a buffer which is unmodified.\n\
2946The functions are run using the `run-hooks' function.");
2947 Vfirst_change_hook = Qnil;
2948 Qfirst_change_hook = intern ("first-change-hook");
2949 staticpro (&Qfirst_change_hook);
1ab256cb 2950
54939090
RS
2951#if 0 /* The doc string is too long for some compilers,
2952 but make-docfile can find it in this comment. */
3f5fcd47 2953 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list, Qnil,
1ab256cb
RM
2954 "List of undo entries in current buffer.\n\
2955Recent changes come first; older changes follow newer.\n\
2956\n\
2957An entry (START . END) represents an insertion which begins at\n\
2958position START and ends at position END.\n\
2959\n\
2960An entry (TEXT . POSITION) represents the deletion of the string TEXT\n\
2961from (abs POSITION). If POSITION is positive, point was at the front\n\
2962of the text being deleted; if negative, point was at the end.\n\
2963\n\
2964An entry (t HIGHWORD LOWWORD) indicates that the buffer had been\n\
2965previously unmodified. HIGHWORD and LOWWORD are the high and low\n\
296616-bit words of the buffer's modification count at the time. If the\n\
2967modification count of the most recent save is different, this entry is\n\
2968obsolete.\n\
2969\n\
483c1fd3
RS
2970An entry (nil PROP VAL BEG . END) indicates that a text property\n\
2971was modified between BEG and END. PROP is the property name,\n\
2972and VAL is the old value.\n\
2973\n\
bec44fd6
JB
2974An entry of the form POSITION indicates that point was at the buffer\n\
2975location given by the integer. Undoing an entry of this form places\n\
2976point at POSITION.\n\
2977\n\
1ab256cb
RM
2978nil marks undo boundaries. The undo command treats the changes\n\
2979between two undo boundaries as a single step to be undone.\n\
2980\n\
bec44fd6 2981If the value of the variable is t, undo information is not recorded.");
54939090
RS
2982#endif
2983 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list, Qnil,
de15914a 2984 0);
1ab256cb 2985
c48f61ef
RS
2986 DEFVAR_PER_BUFFER ("mark-active", &current_buffer->mark_active, Qnil,
2987 "Non-nil means the mark and region are currently active in this buffer.\n\
2988Automatically local in all buffers.");
2989
28e969dd 2990 DEFVAR_PER_BUFFER ("cache-long-line-scans", &current_buffer->cache_long_line_scans, Qnil,
f0c5b712
JB
2991 "Non-nil means that Emacs should use caches to handle long lines more quickly.\n\
2992This variable is buffer-local, in all buffers.\n\
28e969dd 2993\n\
f0c5b712
JB
2994Normally, the line-motion functions work by scanning the buffer for\n\
2995newlines. Columnar operations (like move-to-column and\n\
2996compute-motion) also work by scanning the buffer, summing character\n\
2997widths as they go. This works well for ordinary text, but if the\n\
28e969dd 2998buffer's lines are very long (say, more than 500 characters), these\n\
f0c5b712
JB
2999motion functions will take longer to execute. Emacs may also take\n\
3000longer to update the display.\n\
28e969dd 3001\n\
f0c5b712
JB
3002If cache-long-line-scans is non-nil, these motion functions cache the\n\
3003results of their scans, and consult the cache to avoid rescanning\n\
3004regions of the buffer until the text is modified. The caches are most\n\
3005beneficial when they prevent the most searching---that is, when the\n\
3006buffer contains long lines and large regions of characters with the\n\
3007same, fixed screen width.\n\
28e969dd 3008\n\
f0c5b712
JB
3009When cache-long-line-scans is non-nil, processing short lines will\n\
3010become slightly slower (because of the overhead of consulting the\n\
3011cache), and the caches will use memory roughly proportional to the\n\
3012number of newlines and characters whose screen width varies.\n\
3013\n\
3014The caches require no explicit maintenance; their accuracy is\n\
3015maintained internally by the Emacs primitives. Enabling or disabling\n\
3016the cache should not affect the behavior of any of the motion\n\
3017functions; it should only affect their performance.");
28e969dd 3018
c48f61ef
RS
3019 DEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode,
3020 "*Non-nil means deactivate the mark when the buffer contents change.");
3021 Vtransient_mark_mode = Qnil;
3022
0a4469c9 3023 DEFVAR_LISP ("inhibit-read-only", &Vinhibit_read_only,
a96b68f1
RS
3024 "*Non-nil means disregard read-only status of buffers or characters.\n\
3025If the value is t, disregard `buffer-read-only' and all `read-only'\n\
3026text properties. If the value is a list, disregard `buffer-read-only'\n\
3027and disregard a `read-only' text property if the property value\n\
3028is a member of the list.");
3029 Vinhibit_read_only = Qnil;
3030
dcdffbf6
RS
3031 DEFVAR_LISP ("kill-buffer-query-functions", &Vkill_buffer_query_functions,
3032 "List of functions called with no args to query before killing a buffer.");
3033 Vkill_buffer_query_functions = Qnil;
3034
1ab256cb
RM
3035 defsubr (&Sbuffer_list);
3036 defsubr (&Sget_buffer);
3037 defsubr (&Sget_file_buffer);
3038 defsubr (&Sget_buffer_create);
01050cb5 3039 defsubr (&Sgenerate_new_buffer_name);
1ab256cb
RM
3040 defsubr (&Sbuffer_name);
3041/*defsubr (&Sbuffer_number);*/
3042 defsubr (&Sbuffer_file_name);
3043 defsubr (&Sbuffer_local_variables);
3044 defsubr (&Sbuffer_modified_p);
3045 defsubr (&Sset_buffer_modified_p);
3046 defsubr (&Sbuffer_modified_tick);
3047 defsubr (&Srename_buffer);
3048 defsubr (&Sother_buffer);
3049 defsubr (&Sbuffer_disable_undo);
3050 defsubr (&Sbuffer_enable_undo);
3051 defsubr (&Skill_buffer);
3052 defsubr (&Serase_buffer);
3053 defsubr (&Sswitch_to_buffer);
3054 defsubr (&Spop_to_buffer);
3055 defsubr (&Scurrent_buffer);
3056 defsubr (&Sset_buffer);
3057 defsubr (&Sbarf_if_buffer_read_only);
3058 defsubr (&Sbury_buffer);
3059 defsubr (&Slist_buffers);
3060 defsubr (&Skill_all_local_variables);
2eec3b4e 3061
52f8ec73 3062 defsubr (&Soverlayp);
2eec3b4e
RS
3063 defsubr (&Smake_overlay);
3064 defsubr (&Sdelete_overlay);
3065 defsubr (&Smove_overlay);
8ebafa8d
JB
3066 defsubr (&Soverlay_start);
3067 defsubr (&Soverlay_end);
3068 defsubr (&Soverlay_buffer);
3069 defsubr (&Soverlay_properties);
2eec3b4e
RS
3070 defsubr (&Soverlays_at);
3071 defsubr (&Snext_overlay_change);
239c932b 3072 defsubr (&Sprevious_overlay_change);
2eec3b4e
RS
3073 defsubr (&Soverlay_recenter);
3074 defsubr (&Soverlay_lists);
3075 defsubr (&Soverlay_get);
3076 defsubr (&Soverlay_put);
1ab256cb
RM
3077}
3078
3079keys_of_buffer ()
3080{
3081 initial_define_key (control_x_map, 'b', "switch-to-buffer");
3082 initial_define_key (control_x_map, 'k', "kill-buffer");
3083 initial_define_key (control_x_map, Ctl ('B'), "list-buffers");
4158c17d
RM
3084
3085 /* This must not be in syms_of_buffer, because Qdisabled is not
3086 initialized when that function gets called. */
3087 Fput (intern ("erase-buffer"), Qdisabled, Qt);
1ab256cb 3088}