]> code.delx.au - gnu-emacs/blob - src/buffer.c
*** empty log message ***
[gnu-emacs] / src / buffer.c
1 /* Buffer manipulation primitives for GNU Emacs.
2 Copyright (C) 1985, 1986, 1987, 1988, 1989 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #include <sys/param.h>
22
23 #ifndef MAXPATHLEN
24 /* in 4.1, param.h fails to define this. */
25 #define MAXPATHLEN 1024
26 #endif /* not MAXPATHLEN */
27
28 #ifdef NULL
29 #undef NULL
30 #endif
31 #include "config.h"
32 #include "lisp.h"
33 #include "window.h"
34 #include "commands.h"
35 #include "buffer.h"
36 #include "syntax.h"
37 #include "indent.h"
38
39 struct buffer *current_buffer; /* the current buffer */
40
41 /* First buffer in chain of all buffers (in reverse order of creation).
42 Threaded through ->next. */
43
44 struct buffer *all_buffers;
45
46 /* This structure holds the default values of the buffer-local variables
47 defined with DEFVAR_PER_BUFFER, that have special slots in each buffer.
48 The default value occupies the same slot in this structure
49 as an individual buffer's value occupies in that buffer.
50 Setting the default value also goes through the alist of buffers
51 and stores into each buffer that does not say it has a local value. */
52
53 struct buffer buffer_defaults;
54
55 /* A Lisp_Object pointer to the above, used for staticpro */
56
57 static Lisp_Object Vbuffer_defaults;
58
59 /* This structure marks which slots in a buffer have corresponding
60 default values in buffer_defaults.
61 Each such slot has a nonzero value in this structure.
62 The value has only one nonzero bit.
63
64 When a buffer has its own local value for a slot,
65 the bit for that slot (found in the same slot in this structure)
66 is turned on in the buffer's local_var_flags slot.
67
68 If a slot in this structure is -1, then even though there may
69 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
70 and the corresponding slot in buffer_defaults is not used.
71
72 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it,
73 but there is a default value which is copied into each buffer.
74
75 If a slot in this structure is negative, then even though there may
76 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
77 and the corresponding slot in buffer_defaults is not used.
78
79 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is
80 zero, that is a bug */
81
82 struct buffer buffer_local_flags;
83
84 /* This structure holds the names of symbols whose values may be
85 buffer-local. It is indexed and accessed in the same way as the above. */
86
87 struct buffer buffer_local_symbols;
88 /* A Lisp_Object pointer to the above, used for staticpro */
89 static Lisp_Object Vbuffer_local_symbols;
90
91 /* Nonzero means don't allow modification of protected fields. */
92
93 int check_protected_fields;
94
95 Lisp_Object Fset_buffer ();
96
97 /* Alist of all buffer names vs the buffers. */
98 /* This used to be a variable, but is no longer,
99 to prevent lossage due to user rplac'ing this alist or its elements. */
100 Lisp_Object Vbuffer_alist;
101
102 /* Functions to call before and after each text change. */
103 Lisp_Object Vbefore_change_function;
104 Lisp_Object Vafter_change_function;
105
106 /* Function to call before changing an unmodified buffer. */
107 Lisp_Object Vfirst_change_function;
108
109 Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
110
111 Lisp_Object Qprotected_field;
112
113 Lisp_Object QSFundamental; /* A string "Fundamental" */
114
115 Lisp_Object Qkill_buffer_hook;
116
117 /* For debugging; temporary. See set_buffer_internal. */
118 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */
119
120 nsberror (spec)
121 Lisp_Object spec;
122 {
123 if (XTYPE (spec) == Lisp_String)
124 error ("No buffer named %s", XSTRING (spec)->data);
125 error ("Invalid buffer argument");
126 }
127 \f
128 DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
129 "Return a list of all existing live buffers.")
130 ()
131 {
132 return Fmapcar (Qcdr, Vbuffer_alist);
133 }
134
135 DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
136 "Return the buffer named NAME (a string).\n\
137 If there is no live buffer named NAME, return nil.\n\
138 NAME may also be a buffer; if so, the value is that buffer.")
139 (name)
140 register Lisp_Object name;
141 {
142 if (XTYPE (name) == Lisp_Buffer)
143 return name;
144 CHECK_STRING (name, 0);
145
146 return Fcdr (Fassoc (name, Vbuffer_alist));
147 }
148
149 DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
150 "Return the buffer visiting file FILENAME (a string).\n\
151 If there is no such live buffer, return nil.")
152 (filename)
153 register Lisp_Object filename;
154 {
155 register Lisp_Object tail, buf, tem;
156 CHECK_STRING (filename, 0);
157 filename = Fexpand_file_name (filename, Qnil);
158
159 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr)
160 {
161 buf = Fcdr (XCONS (tail)->car);
162 if (XTYPE (buf) != Lisp_Buffer) continue;
163 if (XTYPE (XBUFFER (buf)->filename) != Lisp_String) continue;
164 tem = Fstring_equal (XBUFFER (buf)->filename, filename);
165 if (!NULL (tem))
166 return buf;
167 }
168 return Qnil;
169 }
170
171 /* Incremented for each buffer created, to assign the buffer number. */
172 int buffer_count;
173
174 DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
175 "Return the buffer named NAME, or create such a buffer and return it.\n\
176 A new buffer is created if there is no live buffer named NAME.\n\
177 If NAME is a buffer instead of a string, then it is the value returned.\n\
178 The value is never nil.")
179 (name)
180 register Lisp_Object name;
181 {
182 register Lisp_Object buf, function, tem;
183 int count = specpdl_ptr - specpdl;
184 register struct buffer *b;
185
186 buf = Fget_buffer (name);
187 if (!NULL (buf))
188 return buf;
189
190 b = (struct buffer *) malloc (sizeof (struct buffer));
191 if (!b)
192 memory_full ();
193
194 BUF_GAP_SIZE (b) = 20;
195 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b));
196 if (! BUF_BEG_ADDR (b))
197 memory_full ();
198
199 BUF_PT (b) = 1;
200 BUF_GPT (b) = 1;
201 BUF_BEGV (b) = 1;
202 BUF_ZV (b) = 1;
203 BUF_Z (b) = 1;
204 BUF_MODIFF (b) = 1;
205
206 /* Put this on the chain of all buffers including killed ones. */
207 b->next = all_buffers;
208 all_buffers = b;
209
210 b->mark = Fmake_marker ();
211 /*b->number = make_number (++buffer_count);*/
212 b->name = name;
213 if (XSTRING (name)->data[0] != ' ')
214 b->undo_list = Qnil;
215 else
216 b->undo_list = Qt;
217
218 reset_buffer (b);
219
220 /* Put this in the alist of all live buffers. */
221 XSET (buf, Lisp_Buffer, b);
222 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
223
224 b->mark = Fmake_marker ();
225 b->markers = Qnil;
226 b->name = name;
227
228 function = buffer_defaults.major_mode;
229 if (NULL (function))
230 {
231 tem = Fget (current_buffer->major_mode, Qmode_class);
232 if (EQ (tem, Qnil))
233 function = current_buffer->major_mode;
234 }
235
236 if (NULL (function) || EQ (function, Qfundamental_mode))
237 return buf;
238
239 /* To select a nonfundamental mode,
240 select the buffer temporarily and then call the mode function. */
241
242 record_unwind_protect (save_excursion_restore, save_excursion_save ());
243
244 Fset_buffer (buf);
245 call0 (function);
246
247 return unbind_to (count, buf);
248 }
249
250 /* Reinitialize everything about a buffer except its name and contents. */
251
252 void
253 reset_buffer (b)
254 register struct buffer *b;
255 {
256 b->filename = Qnil;
257 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
258 b->modtime = 0;
259 b->save_modified = 1;
260 b->save_length = 0;
261 b->last_window_start = 1;
262 b->backed_up = Qnil;
263 b->auto_save_modified = 0;
264 b->auto_save_file_name = Qnil;
265 b->read_only = Qnil;
266 b->fieldlist = Qnil;
267 reset_buffer_local_variables(b);
268 }
269
270 reset_buffer_local_variables(b)
271 register struct buffer *b;
272 {
273 register int offset;
274
275 /* Reset the major mode to Fundamental, together with all the
276 things that depend on the major mode.
277 default-major-mode is handled at a higher level.
278 We ignore it here. */
279 b->major_mode = Qfundamental_mode;
280 b->keymap = Qnil;
281 b->abbrev_table = Vfundamental_mode_abbrev_table;
282 b->mode_name = QSFundamental;
283 b->minor_modes = Qnil;
284 b->downcase_table = Vascii_downcase_table;
285 b->upcase_table = Vascii_upcase_table;
286 b->case_canon_table = Vascii_downcase_table;
287 b->case_eqv_table = Vascii_upcase_table;
288 #if 0
289 b->sort_table = XSTRING (Vascii_sort_table);
290 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
291 #endif /* 0 */
292
293 /* Reset all per-buffer variables to their defaults. */
294 b->local_var_alist = Qnil;
295 b->local_var_flags = 0;
296
297 /* For each slot that has a default value,
298 copy that into the slot. */
299
300 for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags;
301 offset < sizeof (struct buffer);
302 offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */
303 if (*(int *)(offset + (char *) &buffer_local_flags) > 0
304 || *(int *)(offset + (char *) &buffer_local_flags) == -2)
305 *(Lisp_Object *)(offset + (char *)b) =
306 *(Lisp_Object *)(offset + (char *)&buffer_defaults);
307 }
308
309 DEFUN ("generate-new-buffer", Fgenerate_new_buffer, Sgenerate_new_buffer,
310 1, 1, 0,
311 "Create and return a buffer with a name based on NAME.\n\
312 If there is no live buffer named NAME, then one is created.\n\
313 Otherwise modify name by appending `<NUMBER>', incrementing NUMBER\n\
314 until an unused name is found, and then create a buffer.")
315 (name)
316 register Lisp_Object name;
317 {
318 register Lisp_Object gentemp, tem;
319 int count;
320 char number[10];
321
322 CHECK_STRING (name, 0);
323
324 tem = Fget_buffer (name);
325 if (NULL (tem))
326 return Fget_buffer_create (name);
327
328 count = 1;
329 while (1)
330 {
331 sprintf (number, "<%d>", ++count);
332 gentemp = concat2 (name, build_string (number));
333 tem = Fget_buffer (gentemp);
334 if (NULL (tem))
335 return Fget_buffer_create (gentemp);
336 }
337 }
338
339 \f
340 DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
341 "Return the name of BUFFER, as a string.\n\
342 Wyth no argument or nil as argument, return the name of the current buffer.")
343 (buffer)
344 register Lisp_Object buffer;
345 {
346 if (NULL (buffer))
347 return current_buffer->name;
348 CHECK_BUFFER (buffer, 0);
349 return XBUFFER (buffer)->name;
350 }
351
352 DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
353 "Return name of file BUFFER is visiting, or nil if none.\n\
354 No argument or nil as argument means use the current buffer.")
355 (buffer)
356 register Lisp_Object buffer;
357 {
358 if (NULL (buffer))
359 return current_buffer->filename;
360 CHECK_BUFFER (buffer, 0);
361 return XBUFFER (buffer)->filename;
362 }
363
364 DEFUN ("buffer-local-variables", Fbuffer_local_variables,
365 Sbuffer_local_variables, 0, 1, 0,
366 "Return an alist of variables that are buffer-local in BUFFER.\n\
367 Each element looks like (SYMBOL . VALUE) and describes one variable.\n\
368 Note that storing new VALUEs in these elements doesn't change the variables.\n\
369 No argument or nil as argument means use current buffer as BUFFER.")
370 (buffer)
371 register Lisp_Object buffer;
372 {
373 register struct buffer *buf;
374 register Lisp_Object val;
375
376 if (NULL (buffer))
377 buf = current_buffer;
378 else
379 {
380 CHECK_BUFFER (buffer, 0);
381 buf = XBUFFER (buffer);
382 }
383
384 {
385 /* Reference each variable in the alist in our current buffer.
386 If inquiring about the current buffer, this gets the current values,
387 so store them into the alist so the alist is up to date.
388 If inquiring about some other buffer, this swaps out any values
389 for that buffer, making the alist up to date automatically. */
390 register Lisp_Object tem;
391 for (tem = buf->local_var_alist; CONSP (tem); tem = XCONS (tem)->cdr)
392 {
393 Lisp_Object v1 = Fsymbol_value (XCONS (XCONS (tem)->car)->car);
394 if (buf == current_buffer)
395 XCONS (XCONS (tem)->car)->cdr = v1;
396 }
397 }
398
399 /* Make a copy of the alist, to return it. */
400 val = Fcopy_alist (buf->local_var_alist);
401
402 /* Add on all the variables stored in special slots. */
403 {
404 register int offset, mask;
405
406 for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols;
407 offset < sizeof (struct buffer);
408 offset += (sizeof (int))) /* sizeof int == sizeof Lisp_Object */
409 {
410 mask = *(int *)(offset + (char *) &buffer_local_flags);
411 if (mask == -1 || (buf->local_var_flags & mask))
412 if (XTYPE (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols))
413 == Lisp_Symbol)
414 val = Fcons (Fcons (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols),
415 *(Lisp_Object *)(offset + (char *)buf)),
416 val);
417 }
418 }
419 return (val);
420 }
421
422 \f
423 DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
424 0, 1, 0,
425 "Return t if BUFFER was modified since its file was last read or saved.\n\
426 No argument or nil as argument means use current buffer as BUFFER.")
427 (buffer)
428 register Lisp_Object buffer;
429 {
430 register struct buffer *buf;
431 if (NULL (buffer))
432 buf = current_buffer;
433 else
434 {
435 CHECK_BUFFER (buffer, 0);
436 buf = XBUFFER (buffer);
437 }
438
439 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil;
440 }
441
442 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
443 1, 1, 0,
444 "Mark current buffer as modified or unmodified according to FLAG.\n\
445 A non-nil FLAG means mark the buffer modified.")
446 (flag)
447 register Lisp_Object flag;
448 {
449 register int already;
450 register Lisp_Object fn;
451
452 #ifdef CLASH_DETECTION
453 /* If buffer becoming modified, lock the file.
454 If buffer becoming unmodified, unlock the file. */
455
456 fn = current_buffer->filename;
457 if (!NULL (fn))
458 {
459 already = current_buffer->save_modified < MODIFF;
460 if (!already && !NULL (flag))
461 lock_file (fn);
462 else if (already && NULL (flag))
463 unlock_file (fn);
464 }
465 #endif /* CLASH_DETECTION */
466
467 current_buffer->save_modified = NULL (flag) ? MODIFF : 0;
468 update_mode_lines++;
469 return flag;
470 }
471
472 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
473 0, 1, 0,
474 "Return BUFFER's tick counter, incremented for each change in text.\n\
475 Each buffer has a tick counter which is incremented each time the text in\n\
476 that buffer is changed. It wraps around occasionally.\n\
477 No argument or nil as argument means use current buffer as BUFFER.")
478 (buffer)
479 register Lisp_Object buffer;
480 {
481 register struct buffer *buf;
482 if (NULL (buffer))
483 buf = current_buffer;
484 else
485 {
486 CHECK_BUFFER (buffer, 0);
487 buf = XBUFFER (buffer);
488 }
489
490 return make_number (BUF_MODIFF (buf));
491 }
492 \f
493 DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 1,
494 "sRename buffer (to new name): ",
495 "Change current buffer's name to NEWNAME (a string).\n\
496 It is an error if a buffer named NEWNAME already exists.\n\
497 This does not change the name of the visited file (if any).")
498 (name)
499 register Lisp_Object name;
500 {
501 register Lisp_Object tem, buf;
502
503 CHECK_STRING (name, 0);
504 tem = Fget_buffer (name);
505 if (!NULL (tem))
506 error ("Buffer name \"%s\" is in use", XSTRING (name)->data);
507
508 current_buffer->name = name;
509 XSET (buf, Lisp_Buffer, current_buffer);
510 Fsetcar (Frassq (buf, Vbuffer_alist), name);
511 if (NULL (current_buffer->filename) && !NULL (current_buffer->auto_save_file_name))
512 call0 (intern ("rename-auto-save-file"));
513 return Qnil;
514 }
515
516 DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 1, 0,
517 "Return most recently selected buffer other than BUFFER.\n\
518 Buffers not visible in windows are preferred to visible buffers.\n\
519 If no other buffer exists, the buffer `*scratch*' is returned.\n\
520 If BUFFER is omitted or nil, some interesting buffer is returned.")
521 (buffer)
522 register Lisp_Object buffer;
523 {
524 register Lisp_Object tail, buf, notsogood, tem;
525 notsogood = Qnil;
526
527 for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail))
528 {
529 buf = Fcdr (Fcar (tail));
530 if (EQ (buf, buffer))
531 continue;
532 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
533 continue;
534 tem = Fget_buffer_window (buf, Qnil);
535 if (NULL (tem))
536 return buf;
537 if (NULL (notsogood))
538 notsogood = buf;
539 }
540 if (!NULL (notsogood))
541 return notsogood;
542 return Fget_buffer_create (build_string ("*scratch*"));
543 }
544 \f
545 DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, 1,1,
546 0,
547 "Make BUFFER stop keeping undo information.")
548 (buf)
549 register Lisp_Object buf;
550 {
551 CHECK_BUFFER (buf, 0);
552 XBUFFER (buf)->undo_list = Qt;
553 return Qnil;
554 }
555
556 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
557 0, 1, "",
558 "Start keeping undo information for buffer BUFFER.\n\
559 No argument or nil as argument means do this for the current buffer.")
560 (buf)
561 register Lisp_Object buf;
562 {
563 register struct buffer *b;
564 register Lisp_Object buf1;
565
566 if (NULL (buf))
567 b = current_buffer;
568 else
569 {
570 buf1 = Fget_buffer (buf);
571 if (NULL (buf1)) nsberror (buf);
572 b = XBUFFER (buf1);
573 }
574
575 if (EQ (b->undo_list, Qt))
576 b->undo_list = Qnil;
577
578 return Qnil;
579 }
580
581 /*
582 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
583 Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
584 The buffer being killed will be current while the hook is running.\n\
585 See `kill-buffer'."
586 */
587 DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
588 "Kill the buffer BUFFER.\n\
589 The argument may be a buffer or may be the name of a buffer.\n\
590 An argument of nil means kill the current buffer.\n\n\
591 Value is t if the buffer is actually killed, nil if user says no.\n\n\
592 The value of `kill-buffer-hook' (which may be local to that buffer),\n\
593 if not void, is a list of functions to be called, with no arguments,\n\
594 before the buffer is actually killed. The buffer to be killed is current\n\
595 when the hook functions are called.\n\n\
596 Any processes that have this buffer as the `process-buffer' are killed\n\
597 with `delete-process'.")
598 (bufname)
599 Lisp_Object bufname;
600 {
601 Lisp_Object buf;
602 register struct buffer *b;
603 register Lisp_Object tem;
604 register struct Lisp_Marker *m;
605 struct gcpro gcpro1, gcpro2;
606
607 if (NULL (bufname))
608 buf = Fcurrent_buffer ();
609 else
610 buf = Fget_buffer (bufname);
611 if (NULL (buf))
612 nsberror (bufname);
613
614 b = XBUFFER (buf);
615
616 /* Query if the buffer is still modified. */
617 if (INTERACTIVE && !NULL (b->filename)
618 && BUF_MODIFF (b) > b->save_modified)
619 {
620 GCPRO2 (buf, bufname);
621 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
622 XSTRING (b->name)->data));
623 UNGCPRO;
624 if (NULL (tem))
625 return Qnil;
626 }
627
628 /* Run kill-buffer hook with the buffer to be killed the current buffer. */
629 {
630 register Lisp_Object val;
631 int count = specpdl_ptr - specpdl;
632
633 record_unwind_protect (save_excursion_restore, save_excursion_save ());
634 set_buffer_internal (b);
635 call1 (Vrun_hooks, Qkill_buffer_hook);
636 unbind_to (count, Qnil);
637 }
638
639 /* We have no more questions to ask. Verify that it is valid
640 to kill the buffer. This must be done after the questions
641 since anything can happen within do_yes_or_no_p. */
642
643 /* Don't kill the minibuffer now current. */
644 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
645 return Qnil;
646
647 if (NULL (b->name))
648 return Qnil;
649
650 /* Make this buffer not be current.
651 In the process, notice if this is the sole visible buffer
652 and give up if so. */
653 if (b == current_buffer)
654 {
655 tem = Fother_buffer (buf);
656 Fset_buffer (tem);
657 if (b == current_buffer)
658 return Qnil;
659 }
660
661 /* Now there is no question: we can kill the buffer. */
662
663 #ifdef CLASH_DETECTION
664 /* Unlock this buffer's file, if it is locked. */
665 unlock_buffer (b);
666 #endif /* CLASH_DETECTION */
667
668 #ifdef subprocesses
669 kill_buffer_processes (buf);
670 #endif /* subprocesses */
671
672 tem = Vinhibit_quit;
673 Vinhibit_quit = Qt;
674 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
675 Freplace_buffer_in_windows (buf);
676 Vinhibit_quit = tem;
677
678 /* Delete any auto-save file. */
679 if (XTYPE (b->auto_save_file_name) == Lisp_String)
680 {
681 Lisp_Object tem;
682 tem = Fsymbol_value (intern ("delete-auto-save-files"));
683 if (! NULL (tem))
684 unlink (XSTRING (b->auto_save_file_name)->data);
685 }
686
687 /* Unchain all markers of this buffer
688 and leave them pointing nowhere. */
689 for (tem = b->markers; !EQ (tem, Qnil); )
690 {
691 m = XMARKER (tem);
692 m->buffer = 0;
693 tem = m->chain;
694 m->chain = Qnil;
695 }
696 b->markers = Qnil;
697
698 b->name = Qnil;
699 BUFFER_FREE (BUF_BEG_ADDR (b));
700 b->undo_list = Qnil;
701
702 return Qt;
703 }
704 \f
705 /* Put the element for buffer BUF at the front of buffer-alist.
706 This is done when a buffer is selected "visibly".
707 It keeps buffer-alist in the order of recency of selection
708 so that other_buffer will return something nice. */
709
710 record_buffer (buf)
711 Lisp_Object buf;
712 {
713 register Lisp_Object link, prev;
714
715 prev = Qnil;
716 for (link = Vbuffer_alist; CONSP (link); link = XCONS (link)->cdr)
717 {
718 if (EQ (XCONS (XCONS (link)->car)->cdr, buf))
719 break;
720 prev = link;
721 }
722
723 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist)
724 but cannot use Fdelq here it that allows quitting. */
725
726 if (NULL (prev))
727 Vbuffer_alist = XCONS (Vbuffer_alist)->cdr;
728 else
729 XCONS (prev)->cdr = XCONS (XCONS (prev)->cdr)->cdr;
730
731 XCONS(link)->cdr = Vbuffer_alist;
732 Vbuffer_alist = link;
733 }
734
735 DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
736 "Select buffer BUFFER in the current window.\n\
737 BUFFER may be a buffer or a buffer name.\n\
738 Optional second arg NORECORD non-nil means\n\
739 do not put this buffer at the front of the list of recently selected ones.\n\
740 \n\
741 WARNING: This is NOT the way to work on another buffer temporarily\n\
742 within a Lisp program! Use `set-buffer' instead. That avoids messing with\n\
743 the window-buffer correspondences.")
744 (bufname, norecord)
745 Lisp_Object bufname, norecord;
746 {
747 register Lisp_Object buf;
748 Lisp_Object tem;
749
750 if (EQ (minibuf_window, selected_window))
751 error ("Cannot switch buffers in minibuffer window");
752 tem = Fwindow_dedicated_p (selected_window);
753 if (!NULL (tem))
754 error ("Cannot switch buffers in a dedicated window");
755
756 if (NULL (bufname))
757 buf = Fother_buffer (Fcurrent_buffer ());
758 else
759 buf = Fget_buffer_create (bufname);
760 Fset_buffer (buf);
761 if (NULL (norecord))
762 record_buffer (buf);
763
764 Fset_window_buffer (EQ (selected_window, minibuf_window)
765 ? Fnext_window (minibuf_window, Qnil) : selected_window,
766 buf);
767
768 return Qnil;
769 }
770
771 DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 2, 0,
772 "Select buffer BUFFER in some window, preferably a different one.\n\
773 If BUFFER is nil, then some other buffer is chosen.\n\
774 If `pop-up-windows' is non-nil, windows can be split to do this.\n\
775 If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
776 window even if BUFFER is already visible in the selected window.")
777 (bufname, other)
778 Lisp_Object bufname, other;
779 {
780 register Lisp_Object buf;
781 if (NULL (bufname))
782 buf = Fother_buffer (Fcurrent_buffer ());
783 else
784 buf = Fget_buffer_create (bufname);
785 Fset_buffer (buf);
786 record_buffer (buf);
787 Fselect_window (Fdisplay_buffer (buf, other));
788 return Qnil;
789 }
790
791 DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
792 "Return the current buffer as a Lisp object.")
793 ()
794 {
795 register Lisp_Object buf;
796 XSET (buf, Lisp_Buffer, current_buffer);
797 return buf;
798 }
799 \f
800 /* Set the current buffer to b */
801
802 void
803 set_buffer_internal (b)
804 register struct buffer *b;
805 {
806 register struct buffer *old_buf;
807 register Lisp_Object tail, valcontents;
808 enum Lisp_Type tem;
809
810 if (current_buffer == b)
811 return;
812
813 windows_or_buffers_changed = 1;
814 old_buf = current_buffer;
815 current_buffer = b;
816 last_known_column_point = -1; /* invalidate indentation cache */
817
818 /* Look down buffer's list of local Lisp variables
819 to find and update any that forward into C variables. */
820
821 for (tail = b->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr)
822 {
823 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
824 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
825 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
826 && (tem = XTYPE (XCONS (valcontents)->car),
827 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
828 || tem == Lisp_Objfwd)))
829 /* Just reference the variable
830 to cause it to become set for this buffer. */
831 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
832 }
833
834 /* Do the same with any others that were local to the previous buffer */
835
836 if (old_buf)
837 for (tail = old_buf->local_var_alist; !NULL (tail); tail = XCONS (tail)->cdr)
838 {
839 valcontents = XSYMBOL (XCONS (XCONS (tail)->car)->car)->value;
840 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value
841 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
842 && (tem = XTYPE (XCONS (valcontents)->car),
843 (tem == Lisp_Boolfwd || tem == Lisp_Intfwd
844 || tem == Lisp_Objfwd)))
845 /* Just reference the variable
846 to cause it to become set for this buffer. */
847 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
848 }
849 }
850
851 DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
852 "Make the buffer BUFFER current for editing operations.\n\
853 BUFFER may be a buffer or the name of an existing buffer.\n\
854 See also `save-excursion' when you want to make a buffer current temporarily.\n\
855 This function does not display the buffer, so its effect ends\n\
856 when the current command terminates.\n\
857 Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
858 (bufname)
859 register Lisp_Object bufname;
860 {
861 register Lisp_Object buffer;
862 buffer = Fget_buffer (bufname);
863 if (NULL (buffer))
864 nsberror (bufname);
865 if (NULL (XBUFFER (buffer)->name))
866 error ("Selecting deleted buffer");
867 set_buffer_internal (XBUFFER (buffer));
868 return buffer;
869 }
870 \f
871 DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
872 Sbarf_if_buffer_read_only, 0, 0, 0,
873 "Signal a `buffer-read-only' error if the current buffer is read-only.")
874 ()
875 {
876 while (!NULL (current_buffer->read_only))
877 Fsignal (Qbuffer_read_only, (Fcons (Fcurrent_buffer (), Qnil)));
878 return Qnil;
879 }
880
881 DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "",
882 "Put BUFFER at the end of the list of all buffers.\n\
883 There it is the least likely candidate for `other-buffer' to return;\n\
884 thus, the least likely buffer for \\[switch-to-buffer] to select by default.")
885 (buf)
886 register Lisp_Object buf;
887 {
888 register Lisp_Object aelt, link;
889
890 if (NULL (buf))
891 {
892 XSET (buf, Lisp_Buffer, current_buffer);
893 Fswitch_to_buffer (Fother_buffer (buf), Qnil);
894 }
895 else
896 {
897 Lisp_Object buf1;
898
899 buf1 = Fget_buffer (buf);
900 if (NULL (buf1))
901 nsberror (buf);
902 buf = buf1;
903 }
904
905 aelt = Frassq (buf, Vbuffer_alist);
906 link = Fmemq (aelt, Vbuffer_alist);
907 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
908 XCONS (link)->cdr = Qnil;
909 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
910 return Qnil;
911 }
912 \f
913 DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, 0,
914 "Delete the entire contents of the current buffer.\n\
915 Any clipping restriction in effect (see `narrow-to-buffer') is removed,\n\
916 so the buffer is truly empty after this.")
917 ()
918 {
919 Fwiden ();
920 del_range (BEG, Z);
921 current_buffer->last_window_start = 1;
922 /* Prevent warnings, or suspension of auto saving, that would happen
923 if future size is less than past size. Use of erase-buffer
924 implies that the future text is not really related to the past text. */
925 XFASTINT (current_buffer->save_length) = 0;
926 return Qnil;
927 }
928
929 validate_region (b, e)
930 register Lisp_Object *b, *e;
931 {
932 register int i;
933
934 CHECK_NUMBER_COERCE_MARKER (*b, 0);
935 CHECK_NUMBER_COERCE_MARKER (*e, 1);
936
937 if (XINT (*b) > XINT (*e))
938 {
939 i = XFASTINT (*b); /* This is legit even if *b is < 0 */
940 *b = *e;
941 XFASTINT (*e) = i; /* because this is all we do with i. */
942 }
943
944 if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e)
945 && XINT (*e) <= ZV))
946 args_out_of_range (*b, *e);
947 }
948 \f
949 Lisp_Object
950 list_buffers_1 (files)
951 Lisp_Object files;
952 {
953 register Lisp_Object tail, tem, buf;
954 Lisp_Object col1, col2, col3, minspace;
955 register struct buffer *old = current_buffer, *b;
956 int desired_point = 0;
957 Lisp_Object other_file_symbol;
958
959 other_file_symbol = intern ("list-buffers-directory");
960
961 XFASTINT (col1) = 19;
962 XFASTINT (col2) = 25;
963 XFASTINT (col3) = 40;
964 XFASTINT (minspace) = 1;
965
966 Fset_buffer (Vstandard_output);
967
968 tail = intern ("Buffer-menu-mode");
969 if (!EQ (tail, current_buffer->major_mode)
970 && (tem = Ffboundp (tail), !NULL (tem)))
971 call0 (tail);
972 Fbuffer_disable_undo (Vstandard_output);
973 current_buffer->read_only = Qnil;
974
975 write_string ("\
976 MR Buffer Size Mode File\n\
977 -- ------ ---- ---- ----\n", -1);
978
979 for (tail = Vbuffer_alist; !NULL (tail); tail = Fcdr (tail))
980 {
981 buf = Fcdr (Fcar (tail));
982 b = XBUFFER (buf);
983 /* Don't mention the minibuffers. */
984 if (XSTRING (b->name)->data[0] == ' ')
985 continue;
986 /* Optionally don't mention buffers that lack files. */
987 if (!NULL (files) && NULL (b->filename))
988 continue;
989 /* Identify the current buffer. */
990 if (b == old)
991 desired_point = point;
992 write_string (b == old ? "." : " ", -1);
993 /* Identify modified buffers */
994 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1);
995 write_string (NULL (b->read_only) ? " " : "% ", -1);
996 Fprinc (b->name, Qnil);
997 Findent_to (col1, make_number (2));
998 XFASTINT (tem) = BUF_Z (b) - BUF_BEG (b);
999 Fprin1 (tem, Qnil);
1000 Findent_to (col2, minspace);
1001 Fprinc (b->mode_name, Qnil);
1002 Findent_to (col3, minspace);
1003
1004 if (!NULL (b->filename))
1005 Fprinc (b->filename, Qnil);
1006 else
1007 {
1008 /* No visited file; check local value of list-buffers-directory. */
1009 Lisp_Object tem;
1010 set_buffer_internal (b);
1011 tem = Fboundp (other_file_symbol);
1012 if (!NULL (tem))
1013 {
1014 tem = Fsymbol_value (other_file_symbol);
1015 Fset_buffer (Vstandard_output);
1016 if (XTYPE (tem) == Lisp_String)
1017 Fprinc (tem, Qnil);
1018 }
1019 else
1020 Fset_buffer (Vstandard_output);
1021 }
1022 write_string ("\n", -1);
1023 }
1024
1025 current_buffer->read_only = Qt;
1026 set_buffer_internal (old);
1027 /* Foo. This doesn't work since temp_output_buffer_show sets point to 1
1028 if (desired_point)
1029 XBUFFER (Vstandard_output)->text.pointloc = desired_point;
1030 */
1031 return Qnil;
1032 }
1033
1034 DEFUN ("list-buffers", Flist_buffers, Slist_buffers, 0, 1, "P",
1035 "Display a list of names of existing buffers.\n\
1036 The list is displayed in a buffer named `*Buffer List*'.\n\
1037 Note that buffers with names starting with spaces are omitted.\n\
1038 Non-null optional arg FILES-ONLY means mention only file buffers.\n\
1039 \n\
1040 The M column contains a * for buffers that are modified.\n\
1041 The R column contains a % for buffers that are read-only.")
1042 (files)
1043 Lisp_Object files;
1044 {
1045 internal_with_output_to_temp_buffer ("*Buffer List*",
1046 list_buffers_1, files);
1047 return Qnil;
1048 }
1049
1050 DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
1051 0, 0, 0,
1052 "Switch to Fundamental mode by killing current buffer's local variables.\n\
1053 Most local variable bindings are eliminated so that the default values\n\
1054 become effective once more. Also, the syntax table is set from\n\
1055 `standard-syntax-table', the local keymap is set to nil,\n\
1056 and the abbrev table from `fundamental-mode-abbrev-table'.\n\
1057 This function also forces redisplay of the mode line.\n\
1058 \n\
1059 Every function to select a new major mode starts by\n\
1060 calling this function.\n\n\
1061 As a special exception, local variables whose names have\n\
1062 a non-nil `permanent-local' property are not eliminated by this function.")
1063 ()
1064 {
1065 register Lisp_Object alist, sym, tem;
1066 Lisp_Object oalist;
1067 oalist = current_buffer->local_var_alist;
1068
1069 /* Make sure no local variables remain set up with this buffer
1070 for their current values. */
1071
1072 for (alist = oalist; !NULL (alist); alist = XCONS (alist)->cdr)
1073 {
1074 sym = XCONS (XCONS (alist)->car)->car;
1075
1076 /* Need not do anything if some other buffer's binding is now encached. */
1077 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car;
1078 if (XBUFFER (tem) == current_buffer)
1079 {
1080 /* Symbol is set up for this buffer's old local value.
1081 Set it up for the current buffer with the default value. */
1082
1083 tem = XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr;
1084 XCONS (tem)->car = tem;
1085 XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Fcurrent_buffer ();
1086 store_symval_forwarding (sym, XCONS (XSYMBOL (sym)->value)->car,
1087 XCONS (tem)->cdr);
1088 }
1089 }
1090
1091 /* Actually eliminate all local bindings of this buffer. */
1092
1093 reset_buffer_local_variables (current_buffer);
1094
1095 /* Redisplay mode lines; we are changing major mode. */
1096
1097 update_mode_lines++;
1098
1099 /* Any which are supposed to be permanent,
1100 make local again, with the same values they had. */
1101
1102 for (alist = oalist; !NULL (alist); alist = XCONS (alist)->cdr)
1103 {
1104 sym = XCONS (XCONS (alist)->car)->car;
1105 tem = Fget (sym, Qpermanent_local);
1106 if (! NULL (tem))
1107 Fmake_local_variable (sym, XCONS (XCONS (alist)->car)->cdr);
1108 }
1109
1110 /* Force mode-line redisplay. Useful here because all major mode
1111 commands call this function. */
1112 update_mode_lines++;
1113
1114 return Qnil;
1115 }
1116 \f
1117 DEFUN ("region-fields", Fregion_fields, Sregion_fields, 2, 4, "",
1118 "Return list of fields overlapping a given portion of a buffer.\n\
1119 The portion is specified by arguments START, END and BUFFER.\n\
1120 BUFFER defaults to the current buffer.\n\
1121 Optional 4th arg ERROR-CHECK non nil means just report an error\n\
1122 if any protected fields overlap this portion.")
1123 (start, end, buffer, error_check)
1124 Lisp_Object start, end, buffer, error_check;
1125 {
1126 register int start_loc, end_loc;
1127 Lisp_Object fieldlist;
1128 Lisp_Object collector;
1129
1130 if (NULL (buffer))
1131 fieldlist = current_buffer->fieldlist;
1132 else
1133 {
1134 CHECK_BUFFER (buffer, 1);
1135 fieldlist = XBUFFER (buffer)->fieldlist;
1136 }
1137
1138 CHECK_NUMBER_COERCE_MARKER (start, 2);
1139 start_loc = XINT (start);
1140
1141 CHECK_NUMBER_COERCE_MARKER (end, 2);
1142 end_loc = XINT (end);
1143
1144 collector = Qnil;
1145
1146 while (XTYPE (fieldlist) == Lisp_Cons)
1147 {
1148 register Lisp_Object field;
1149 register int field_start, field_end;
1150
1151 field = XCONS (fieldlist)->car;
1152 field_start = marker_position (FIELD_START_MARKER (field)) - 1;
1153 field_end = marker_position (FIELD_END_MARKER (field));
1154
1155 if ((start_loc < field_start && end_loc > field_start)
1156 || (start_loc >= field_start && start_loc < field_end))
1157 {
1158 if (!NULL (error_check))
1159 {
1160 if (!NULL (FIELD_PROTECTED_FLAG (field)))
1161 {
1162 struct gcpro gcpro1;
1163 GCPRO1 (fieldlist);
1164 Fsignal (Qprotected_field, Fcons (field, Qnil));
1165 UNGCPRO;
1166 }
1167 }
1168 else
1169 collector = Fcons (field, collector);
1170 }
1171
1172 fieldlist = XCONS (fieldlist)->cdr;
1173 }
1174
1175 return collector;
1176 }
1177 \f
1178 init_buffer_once ()
1179 {
1180 register Lisp_Object tem;
1181
1182 /* Make sure all markable slots in buffer_defaults
1183 are initialized reasonably, so mark_buffer won't choke. */
1184 reset_buffer (&buffer_defaults);
1185 reset_buffer (&buffer_local_symbols);
1186 XSET (Vbuffer_defaults, Lisp_Buffer, &buffer_defaults);
1187 XSET (Vbuffer_local_symbols, Lisp_Buffer, &buffer_local_symbols);
1188
1189 /* Set up the default values of various buffer slots. */
1190 /* Must do these before making the first buffer! */
1191
1192 /* real setup is done in loaddefs.el */
1193 buffer_defaults.mode_line_format = build_string ("%-");
1194 buffer_defaults.abbrev_mode = Qnil;
1195 buffer_defaults.overwrite_mode = Qnil;
1196 buffer_defaults.case_fold_search = Qt;
1197 buffer_defaults.auto_fill_function = Qnil;
1198 buffer_defaults.selective_display = Qnil;
1199 #ifndef old
1200 buffer_defaults.selective_display_ellipses = Qt;
1201 #endif
1202 buffer_defaults.abbrev_table = Qnil;
1203 buffer_defaults.display_table = Qnil;
1204 buffer_defaults.fieldlist = Qnil;
1205 buffer_defaults.undo_list = Qnil;
1206
1207 XFASTINT (buffer_defaults.tab_width) = 8;
1208 buffer_defaults.truncate_lines = Qnil;
1209 buffer_defaults.ctl_arrow = Qt;
1210
1211 XFASTINT (buffer_defaults.fill_column) = 70;
1212 XFASTINT (buffer_defaults.left_margin) = 0;
1213
1214 /* Assign the local-flags to the slots that have default values.
1215 The local flag is a bit that is used in the buffer
1216 to say that it has its own local value for the slot.
1217 The local flag bits are in the local_var_flags slot of the buffer. */
1218
1219 /* Nothing can work if this isn't true */
1220 if (sizeof (int) != sizeof (Lisp_Object)) abort ();
1221
1222 /* 0 means not a lisp var, -1 means always local, else mask */
1223 bzero (&buffer_local_flags, sizeof buffer_local_flags);
1224 XFASTINT (buffer_local_flags.filename) = -1;
1225 XFASTINT (buffer_local_flags.directory) = -1;
1226 XFASTINT (buffer_local_flags.backed_up) = -1;
1227 XFASTINT (buffer_local_flags.save_length) = -1;
1228 XFASTINT (buffer_local_flags.auto_save_file_name) = -1;
1229 XFASTINT (buffer_local_flags.read_only) = -1;
1230 XFASTINT (buffer_local_flags.major_mode) = -1;
1231 XFASTINT (buffer_local_flags.mode_name) = -1;
1232 XFASTINT (buffer_local_flags.undo_list) = -1;
1233
1234 XFASTINT (buffer_local_flags.mode_line_format) = 1;
1235 XFASTINT (buffer_local_flags.abbrev_mode) = 2;
1236 XFASTINT (buffer_local_flags.overwrite_mode) = 4;
1237 XFASTINT (buffer_local_flags.case_fold_search) = 8;
1238 XFASTINT (buffer_local_flags.auto_fill_function) = 0x10;
1239 XFASTINT (buffer_local_flags.selective_display) = 0x20;
1240 #ifndef old
1241 XFASTINT (buffer_local_flags.selective_display_ellipses) = 0x40;
1242 #endif
1243 XFASTINT (buffer_local_flags.tab_width) = 0x80;
1244 XFASTINT (buffer_local_flags.truncate_lines) = 0x100;
1245 XFASTINT (buffer_local_flags.ctl_arrow) = 0x200;
1246 XFASTINT (buffer_local_flags.fill_column) = 0x400;
1247 XFASTINT (buffer_local_flags.left_margin) = 0x800;
1248 XFASTINT (buffer_local_flags.abbrev_table) = 0x1000;
1249 XFASTINT (buffer_local_flags.display_table) = 0x2000;
1250 XFASTINT (buffer_local_flags.fieldlist) = 0x4000;
1251 XFASTINT (buffer_local_flags.syntax_table) = 0x8000;
1252
1253 Vbuffer_alist = Qnil;
1254 current_buffer = 0;
1255 all_buffers = 0;
1256
1257 QSFundamental = build_string ("Fundamental");
1258
1259 Qfundamental_mode = intern ("fundamental-mode");
1260 buffer_defaults.major_mode = Qfundamental_mode;
1261
1262 Qmode_class = intern ("mode-class");
1263
1264 Qprotected_field = intern ("protected-field");
1265
1266 Qpermanent_local = intern ("permanent-local");
1267
1268 Qkill_buffer_hook = intern ("kill-buffer-hook");
1269
1270 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
1271 /* super-magic invisible buffer */
1272 Vbuffer_alist = Qnil;
1273
1274 tem = Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1275 /* Want no undo records for *scratch*
1276 until after Emacs is dumped */
1277 Fbuffer_disable_undo (tem);
1278 }
1279
1280 init_buffer ()
1281 {
1282 char buf[MAXPATHLEN+1];
1283
1284 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
1285 if (getwd (buf) == 0)
1286 fatal ("`getwd' failed: %s.\n", buf);
1287
1288 #ifndef VMS
1289 /* Maybe this should really use some standard subroutine
1290 whose definition is filename syntax dependent. */
1291 if (buf[strlen (buf) - 1] != '/')
1292 strcat (buf, "/");
1293 #endif /* not VMS */
1294 current_buffer->directory = build_string (buf);
1295 }
1296
1297 /* initialize the buffer routines */
1298 syms_of_buffer ()
1299 {
1300 staticpro (&Vbuffer_defaults);
1301 staticpro (&Vbuffer_local_symbols);
1302 staticpro (&Qfundamental_mode);
1303 staticpro (&Qmode_class);
1304 staticpro (&QSFundamental);
1305 staticpro (&Vbuffer_alist);
1306 staticpro (&Qprotected_field);
1307 staticpro (&Qpermanent_local);
1308 staticpro (&Qkill_buffer_hook);
1309
1310 Fput (Qprotected_field, Qerror_conditions,
1311 Fcons (Qprotected_field, Fcons (Qerror, Qnil)));
1312 Fput (Qprotected_field, Qerror_message,
1313 build_string ("Attempt to modify a protected field"));
1314
1315 /* All these use DEFVAR_LISP_NOPRO because the slots in
1316 buffer_defaults will all be marked via Vbuffer_defaults. */
1317
1318 DEFVAR_LISP_NOPRO ("default-mode-line-format",
1319 &buffer_defaults.mode_line_format,
1320 "Default value of `mode-line-format' for buffers that don't override it.\n\
1321 This is the same as (default-value 'mode-line-format).");
1322
1323 DEFVAR_LISP_NOPRO ("default-abbrev-mode",
1324 &buffer_defaults.abbrev_mode,
1325 "Default value of `abbrev-mode' for buffers that do not override it.\n\
1326 This is the same as (default-value 'abbrev-mode).");
1327
1328 DEFVAR_LISP_NOPRO ("default-ctl-arrow",
1329 &buffer_defaults.ctl_arrow,
1330 "Default value of `ctl-arrow' for buffers that do not override it.\n\
1331 This is the same as (default-value 'ctl-arrow).");
1332
1333 DEFVAR_LISP_NOPRO ("default-truncate-lines",
1334 &buffer_defaults.truncate_lines,
1335 "Default value of `truncate-lines' for buffers that do not override it.\n\
1336 This is the same as (default-value 'truncate-lines).");
1337
1338 DEFVAR_LISP_NOPRO ("default-fill-column",
1339 &buffer_defaults.fill_column,
1340 "Default value of `fill-column' for buffers that do not override it.\n\
1341 This is the same as (default-value 'fill-column).");
1342
1343 DEFVAR_LISP_NOPRO ("default-left-margin",
1344 &buffer_defaults.left_margin,
1345 "Default value of `left-margin' for buffers that do not override it.\n\
1346 This is the same as (default-value 'left-margin).");
1347
1348 DEFVAR_LISP_NOPRO ("default-tab-width",
1349 &buffer_defaults.tab_width,
1350 "Default value of `tab-width' for buffers that do not override it.\n\
1351 This is the same as (default-value 'tab-width).");
1352
1353 DEFVAR_LISP_NOPRO ("default-case-fold-search",
1354 &buffer_defaults.case_fold_search,
1355 "Default value of `case-fold-search' for buffers that don't override it.\n\
1356 This is the same as (default-value 'case-fold-search).");
1357
1358 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format, 0);
1359
1360 /* This doc string is too long for cpp; cpp dies if it isn't in a comment.
1361 But make-docfile finds it!
1362 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
1363 "Template for displaying mode line for current buffer.\n\
1364 Each buffer has its own value of this variable.\n\
1365 Value may be a string, a symbol or a list or cons cell.\n\
1366 For a symbol, its value is used (but it is ignored if t or nil).\n\
1367 A string appearing directly as the value of a symbol is processed verbatim\n\
1368 in that the %-constructs below are not recognized.\n\
1369 For a list whose car is a symbol, the symbol's value is taken,\n\
1370 and if that is non-nil, the cadr of the list is processed recursively.\n\
1371 Otherwise, the caddr of the list (if there is one) is processed.\n\
1372 For a list whose car is a string or list, each element is processed\n\
1373 recursively and the results are effectively concatenated.\n\
1374 For a list whose car is an integer, the cdr of the list is processed\n\
1375 and padded (if the number is positive) or truncated (if negative)\n\
1376 to the width specified by that number.\n\
1377 A string is printed verbatim in the mode line except for %-constructs:\n\
1378 (%-constructs are allowed when the string is the entire mode-line-format\n\
1379 or when it is found in a cons-cell or a list)\n\
1380 %b -- print buffer name. %f -- print visited file name.\n\
1381 %* -- print *, % or hyphen. %m -- print value of mode-name (obsolete).\n\
1382 %s -- print process status. %M -- print value of global-mode-string. (obs)\n\
1383 %p -- print percent of buffer above top of window, or top, bot or all.\n\
1384 %n -- print Narrow if appropriate.\n\
1385 %[ -- print one [ for each recursive editing level. %] similar.\n\
1386 %% -- print %. %- -- print infinitely many dashes.\n\
1387 Decimal digits after the % specify field width to which to pad.");
1388 */
1389
1390 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode,
1391 "*Major mode for new buffers. Defaults to `fundamental-mode'.\n\
1392 nil here means use current buffer's major mode.");
1393
1394 DEFVAR_PER_BUFFER ("major-mode", &current_buffer->major_mode,
1395 "Symbol for current buffer's major mode.");
1396
1397 DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
1398 "Pretty name of current buffer's major mode (a string).");
1399
1400 DEFVAR_PER_BUFFER ("abbrev-mode", &current_buffer->abbrev_mode,
1401 "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\
1402 Automatically becomes buffer-local when set in any fashion.");
1403
1404 DEFVAR_PER_BUFFER ("case-fold-search", &current_buffer->case_fold_search,
1405 "*Non-nil if searches should ignore case.\n\
1406 Automatically becomes buffer-local when set in any fashion.");
1407
1408 DEFVAR_PER_BUFFER ("fill-column", &current_buffer->fill_column,
1409 "*Column beyond which automatic line-wrapping should happen.\n\
1410 Automatically becomes buffer-local when set in any fashion.");
1411
1412 DEFVAR_PER_BUFFER ("left-margin", &current_buffer->left_margin,
1413 "*Column for the default indent-line-function to indent to.\n\
1414 Linefeed indents to this column in Fundamental mode.\n\
1415 Automatically becomes buffer-local when set in any fashion.");
1416
1417 DEFVAR_PER_BUFFER ("tab-width", &current_buffer->tab_width,
1418 "*Distance between tab stops (for display of tab characters), in columns.\n\
1419 Automatically becomes buffer-local when set in any fashion.");
1420
1421 DEFVAR_PER_BUFFER ("ctl-arrow", &current_buffer->ctl_arrow,
1422 "*Non-nil means display control chars with uparrow.\n\
1423 Nil means use backslash and octal digits.\n\
1424 Automatically becomes buffer-local when set in any fashion.\n\
1425 This variable does not apply to characters whose display is specified\n\
1426 in the current display table (if there is one).");
1427
1428 DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines,
1429 "*Non-nil means do not display continuation lines;\n\
1430 give each line of text one screen line.\n\
1431 Automatically becomes buffer-local when set in any fashion.\n\
1432 \n\
1433 Note that this is overridden by the variable\n\
1434 `truncate-partial-width-windows' if that variable is non-nil\n\
1435 and this buffer is not full-screen width.");
1436
1437 DEFVAR_PER_BUFFER ("default-directory", &current_buffer->directory,
1438 "Name of default directory of current buffer. Should end with slash.\n\
1439 Each buffer has its own value of this variable.");
1440
1441 DEFVAR_PER_BUFFER ("auto-fill-function", &current_buffer->auto_fill_function,
1442 "Function called (if non-nil) to perform auto-fill.\n\
1443 It is called after self-inserting a space at a column beyond `fill-column'.\n\
1444 Each buffer has its own value of this variable.\n\
1445 NOTE: This variable is not an ordinary hook;\n\
1446 It may not be a list of functions.");
1447
1448 DEFVAR_PER_BUFFER ("buffer-file-name", &current_buffer->filename,
1449 "Name of file visited in current buffer, or nil if not visiting a file.\n\
1450 Each buffer has its own value of this variable.");
1451
1452 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
1453 &current_buffer->auto_save_file_name,
1454 "Name of file for auto-saving current buffer,\n\
1455 or nil if buffer should not be auto-saved.\n\
1456 Each buffer has its own value of this variable.");
1457
1458 DEFVAR_PER_BUFFER ("buffer-read-only", &current_buffer->read_only,
1459 "Non-nil if this buffer is read-only.\n\
1460 Each buffer has its own value of this variable.");
1461
1462 DEFVAR_PER_BUFFER ("buffer-backed-up", &current_buffer->backed_up,
1463 "Non-nil if this buffer's file has been backed up.\n\
1464 Backing up is done before the first time the file is saved.\n\
1465 Each buffer has its own value of this variable.");
1466
1467 DEFVAR_PER_BUFFER ("buffer-saved-size", &current_buffer->save_length,
1468 "Length of current buffer when last read in, saved or auto-saved.\n\
1469 0 initially.\n\
1470 Each buffer has its own value of this variable.");
1471
1472 DEFVAR_PER_BUFFER ("selective-display", &current_buffer->selective_display,
1473 "Non-nil enables selective display:\n\
1474 Integer N as value means display only lines\n\
1475 that start with less than n columns of space.\n\
1476 A value of t means, after a ^M, all the rest of the line is invisible.\n\
1477 Then ^M's in the file are written into files as newlines.\n\n\
1478 Automatically becomes buffer-local when set in any fashion.");
1479
1480 #ifndef old
1481 DEFVAR_PER_BUFFER ("selective-display-ellipses",
1482 &current_buffer->selective_display_ellipses,
1483 "t means display ... on previous line when a line is invisible.\n\
1484 Automatically becomes buffer-local when set in any fashion.");
1485 #endif
1486
1487 DEFVAR_PER_BUFFER ("overwrite-mode", &current_buffer->overwrite_mode,
1488 "Non-nil if self-insertion should replace existing text.\n\
1489 Automatically becomes buffer-local when set in any fashion.");
1490
1491 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
1492 "Display table that controls display of the contents of current buffer.\n\
1493 Automatically becomes buffer-local when set in any fashion.\n\
1494 The display table is a vector created with `make-display-table'.\n\
1495 The first 256 elements control how to display each possible text character.\n\
1496 The value should be a \"rope\" (see `make-rope') or nil;\n\
1497 nil means display the character in the default fashion.\n\
1498 The remaining five elements are ropes that control the display of\n\
1499 the end of a truncated screen line (element 256);\n\
1500 the end of a continued line (element 257);\n\
1501 the escape character used to display character codes in octal (element 258);\n\
1502 the character used as an arrow for control characters (element 259);\n\
1503 the decoration indicating the presence of invisible lines (element 260).\n\
1504 If this variable is nil, the value of `standard-display-table' is used.\n\
1505 Each window can have its own, overriding display table.");
1506
1507 DEFVAR_PER_BUFFER ("buffer-field-list", &current_buffer->fieldlist,
1508 "List of fields in the current buffer. See `add-field'.");
1509
1510 DEFVAR_BOOL ("check-protected-fields", check_protected_fields,
1511 "Non-nil means don't allow modification of a protected field.\n\
1512 See `add-field'.");
1513 check_protected_fields = 0;
1514
1515 /*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
1516 "Don't ask.");
1517 */
1518 DEFVAR_LISP ("bgfore-change-function", &Vbefore_change_function,
1519 "Function to call before each text change.\n\
1520 Two arguments are passed to the function: the positions of\n\
1521 the beginning and end of the range of old text to be changed.\n\
1522 \(For an insertion, the beginning and end are at the same place.)\n\
1523 No information is given about the length of the text after the change.\n\
1524 position of the change\n\
1525 \n\
1526 While executing the `before-change-function', changes to buffers do not\n\
1527 cause calls to any `before-change-function' or `after-change-function'.");
1528 Vbefore_change_function = Qnil;
1529
1530 DEFVAR_LISP ("after-change-function", &Vafter_change_function,
1531 "Function to call after each text change.\n\
1532 Three arguments are passed to the function: the positions of\n\
1533 the beginning and end of the range of changed text,\n\
1534 and the length of the pre-change text replaced by that range.\n\
1535 \(For an insertion, the pre-change length is zero;\n\
1536 for a deletion, that length is the number of characters deleted,\n\
1537 and the post-change beginning and end are at the same place.)\n\
1538 \n\
1539 While executing the `after-change-function', changes to buffers do not\n\
1540 cause calls to any `before-change-function' or `after-change-function'.");
1541 Vafter_change_function = Qnil;
1542
1543 DEFVAR_LISP ("first-change-function", &Vfirst_change_function,
1544 "Function to call before changing a buffer which is unmodified.\n\
1545 The function is called, with no arguments, if it is non-nil.");
1546 Vfirst_change_function = Qnil;
1547
1548 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list,
1549 "List of undo entries in current buffer.\n\
1550 Recent changes come first; older changes follow newer.\n\
1551 \n\
1552 An entry (START . END) represents an insertion which begins at\n\
1553 position START and ends at position END.\n\
1554 \n\
1555 An entry (TEXT . POSITION) represents the deletion of the string TEXT\n\
1556 from (abs POSITION). If POSITION is positive, point was at the front\n\
1557 of the text being deleted; if negative, point was at the end.\n\
1558 \n\
1559 An entry (t HIGHWORD LOWWORD) indicates that the buffer had been\n\
1560 previously unmodified. HIGHWORD and LOWWORD are the high and low\n\
1561 16-bit words of the buffer's modification count at the time. If the\n\
1562 modification count of the most recent save is different, this entry is\n\
1563 obsolete.\n\
1564 \n\
1565 nil marks undo boundaries. The undo command treats the changes\n\
1566 between two undo boundaries as a single step to be undone.\n\
1567 \n\
1568 If the value of the variable is t, undo information is not recorded.\n\
1569 ");
1570
1571 defsubr (&Sbuffer_list);
1572 defsubr (&Sget_buffer);
1573 defsubr (&Sget_file_buffer);
1574 defsubr (&Sget_buffer_create);
1575 defsubr (&Sgenerate_new_buffer);
1576 defsubr (&Sbuffer_name);
1577 /*defsubr (&Sbuffer_number);*/
1578 defsubr (&Sbuffer_file_name);
1579 defsubr (&Sbuffer_local_variables);
1580 defsubr (&Sbuffer_modified_p);
1581 defsubr (&Sset_buffer_modified_p);
1582 defsubr (&Sbuffer_modified_tick);
1583 defsubr (&Srename_buffer);
1584 defsubr (&Sother_buffer);
1585 defsubr (&Sbuffer_disable_undo);
1586 defsubr (&Sbuffer_enable_undo);
1587 defsubr (&Skill_buffer);
1588 defsubr (&Serase_buffer);
1589 defsubr (&Sswitch_to_buffer);
1590 defsubr (&Spop_to_buffer);
1591 defsubr (&Scurrent_buffer);
1592 defsubr (&Sset_buffer);
1593 defsubr (&Sbarf_if_buffer_read_only);
1594 defsubr (&Sbury_buffer);
1595 defsubr (&Slist_buffers);
1596 defsubr (&Skill_all_local_variables);
1597 defsubr (&Sregion_fields);
1598 }
1599
1600 keys_of_buffer ()
1601 {
1602 initial_define_key (control_x_map, 'b', "switch-to-buffer");
1603 initial_define_key (control_x_map, 'k', "kill-buffer");
1604 initial_define_key (control_x_map, Ctl ('B'), "list-buffers");
1605 }