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