Mercurial > emacs
comparison src/buffer.c @ 88155:d7ddb3e565de
sync with trunk
| author | Henrik Enberg <henrik.enberg@telia.com> |
|---|---|
| date | Mon, 16 Jan 2006 00:03:54 +0000 |
| parents | 8bcbac2617a9 |
| children |
comparison
equal
deleted
inserted
replaced
| 88154:8ce476d3ba36 | 88155:d7ddb3e565de |
|---|---|
| 1 /* Buffer manipulation primitives for GNU Emacs. | 1 /* Buffer manipulation primitives for GNU Emacs. |
| 2 Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 2002 | 2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994, |
| 3 Free Software Foundation, Inc. | 3 1995, 1997, 1998, 1999, 2000, 2001, 2002, |
| 4 2003, 2004, 2005 Free Software Foundation, Inc. | |
| 4 | 5 |
| 5 This file is part of GNU Emacs. | 6 This file is part of GNU Emacs. |
| 6 | 7 |
| 7 GNU Emacs is free software; you can redistribute it and/or modify | 8 GNU Emacs is free software; you can redistribute it and/or modify |
| 8 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 GNU General Public License for more details. | 16 GNU General Public License for more details. |
| 16 | 17 |
| 17 You should have received a copy of the GNU General Public License | 18 You should have received a copy of the GNU General Public License |
| 18 along with GNU Emacs; see the file COPYING. If not, write to | 19 along with GNU Emacs; see the file COPYING. If not, write to |
| 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 Boston, MA 02111-1307, USA. */ | 21 Boston, MA 02110-1301, USA. */ |
| 21 | 22 |
| 22 #include <config.h> | 23 #include <config.h> |
| 23 | 24 |
| 24 #include <sys/types.h> | 25 #include <sys/types.h> |
| 25 #include <sys/stat.h> | 26 #include <sys/stat.h> |
| 29 | 30 |
| 30 #ifndef USE_CRT_DLL | 31 #ifndef USE_CRT_DLL |
| 31 extern int errno; | 32 extern int errno; |
| 32 #endif | 33 #endif |
| 33 | 34 |
| 34 #ifndef MAXPATHLEN | |
| 35 /* in 4.1, param.h fails to define this. */ | |
| 36 #define MAXPATHLEN 1024 | |
| 37 #endif /* not MAXPATHLEN */ | |
| 38 | 35 |
| 39 #ifdef HAVE_UNISTD_H | 36 #ifdef HAVE_UNISTD_H |
| 40 #include <unistd.h> | 37 #include <unistd.h> |
| 41 #endif | 38 #endif |
| 42 | 39 |
| 65 The default value occupies the same slot in this structure | 62 The default value occupies the same slot in this structure |
| 66 as an individual buffer's value occupies in that buffer. | 63 as an individual buffer's value occupies in that buffer. |
| 67 Setting the default value also goes through the alist of buffers | 64 Setting the default value also goes through the alist of buffers |
| 68 and stores into each buffer that does not say it has a local value. */ | 65 and stores into each buffer that does not say it has a local value. */ |
| 69 | 66 |
| 70 struct buffer buffer_defaults; | 67 DECL_ALIGN (struct buffer, buffer_defaults); |
| 71 | 68 |
| 72 /* A Lisp_Object pointer to the above, used for staticpro */ | 69 /* A Lisp_Object pointer to the above, used for staticpro */ |
| 73 | 70 |
| 74 static Lisp_Object Vbuffer_defaults; | 71 static Lisp_Object Vbuffer_defaults; |
| 75 | 72 |
| 87 and the corresponding slot in buffer_defaults is not used. | 84 and the corresponding slot in buffer_defaults is not used. |
| 88 | 85 |
| 89 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it, | 86 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it, |
| 90 but there is a default value which is copied into each buffer. | 87 but there is a default value which is copied into each buffer. |
| 91 | 88 |
| 92 If a slot in this structure is negative, then even though there may | |
| 93 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it; | |
| 94 and the corresponding slot in buffer_defaults is not used. | |
| 95 | |
| 96 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is | 89 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is |
| 97 zero, that is a bug */ | 90 zero, that is a bug */ |
| 98 | 91 |
| 99 struct buffer buffer_local_flags; | 92 struct buffer buffer_local_flags; |
| 100 | 93 |
| 101 /* This structure holds the names of symbols whose values may be | 94 /* This structure holds the names of symbols whose values may be |
| 102 buffer-local. It is indexed and accessed in the same way as the above. */ | 95 buffer-local. It is indexed and accessed in the same way as the above. */ |
| 103 | 96 |
| 104 struct buffer buffer_local_symbols; | 97 DECL_ALIGN (struct buffer, buffer_local_symbols); |
| 98 | |
| 105 /* A Lisp_Object pointer to the above, used for staticpro */ | 99 /* A Lisp_Object pointer to the above, used for staticpro */ |
| 106 static Lisp_Object Vbuffer_local_symbols; | 100 static Lisp_Object Vbuffer_local_symbols; |
| 107 | 101 |
| 108 /* This structure holds the required types for the values in the | 102 /* This structure holds the required types for the values in the |
| 109 buffer-local slots. If a slot contains Qnil, then the | 103 buffer-local slots. If a slot contains Qnil, then the |
| 148 Lisp_Object Vinhibit_read_only; | 142 Lisp_Object Vinhibit_read_only; |
| 149 | 143 |
| 150 /* List of functions to call that can query about killing a buffer. | 144 /* List of functions to call that can query about killing a buffer. |
| 151 If any of these functions returns nil, we don't kill it. */ | 145 If any of these functions returns nil, we don't kill it. */ |
| 152 Lisp_Object Vkill_buffer_query_functions; | 146 Lisp_Object Vkill_buffer_query_functions; |
| 147 Lisp_Object Qkill_buffer_query_functions; | |
| 153 | 148 |
| 154 /* List of functions to call before changing an unmodified buffer. */ | 149 /* List of functions to call before changing an unmodified buffer. */ |
| 155 Lisp_Object Vfirst_change_hook; | 150 Lisp_Object Vfirst_change_hook; |
| 156 | 151 |
| 157 Lisp_Object Qfirst_change_hook; | 152 Lisp_Object Qfirst_change_hook; |
| 180 Lisp_Object Qinsert_in_front_hooks; | 175 Lisp_Object Qinsert_in_front_hooks; |
| 181 Lisp_Object Qinsert_behind_hooks; | 176 Lisp_Object Qinsert_behind_hooks; |
| 182 | 177 |
| 183 static void alloc_buffer_text P_ ((struct buffer *, size_t)); | 178 static void alloc_buffer_text P_ ((struct buffer *, size_t)); |
| 184 static void free_buffer_text P_ ((struct buffer *b)); | 179 static void free_buffer_text P_ ((struct buffer *b)); |
| 185 static Lisp_Object copy_overlays P_ ((struct buffer *, Lisp_Object)); | 180 static struct Lisp_Overlay * copy_overlays P_ ((struct buffer *, struct Lisp_Overlay *)); |
| 186 static void modify_overlay P_ ((struct buffer *, int, int)); | 181 static void modify_overlay P_ ((struct buffer *, EMACS_INT, EMACS_INT)); |
| 182 static Lisp_Object buffer_lisp_local_variables P_ ((struct buffer *)); | |
| 187 | 183 |
| 188 | 184 |
| 189 /* For debugging; temporary. See set_buffer_internal. */ | 185 /* For debugging; temporary. See set_buffer_internal. */ |
| 190 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */ | 186 /* Lisp_Object Qlisp_mode, Vcheck_symbol; */ |
| 191 | 187 |
| 410 | 406 |
| 411 reset_buffer (b); | 407 reset_buffer (b); |
| 412 reset_buffer_local_variables (b, 1); | 408 reset_buffer_local_variables (b, 1); |
| 413 | 409 |
| 414 b->mark = Fmake_marker (); | 410 b->mark = Fmake_marker (); |
| 415 BUF_MARKERS (b) = Qnil; | 411 BUF_MARKERS (b) = NULL; |
| 416 b->name = name; | 412 b->name = name; |
| 417 | 413 |
| 418 /* Put this in the alist of all live buffers. */ | 414 /* Put this in the alist of all live buffers. */ |
| 419 XSETBUFFER (buf, b); | 415 XSETBUFFER (buf, b); |
| 420 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); | 416 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); |
| 421 | 417 |
| 422 /* Fixme: Protect against errors, which would trigger infinite | 418 /* An error in calling the function here (should someone redfine it) |
| 423 regress? */ | 419 can lead to infinite regress until you run out of stack. rms |
| 420 says that's not worth protecting against. */ | |
| 424 if (!NILP (Ffboundp (Qucs_set_table_for_input))) | 421 if (!NILP (Ffboundp (Qucs_set_table_for_input))) |
| 425 /* buff is on buffer-alist, so no gcpro */ | 422 /* buf is on buffer-alist, so no gcpro. */ |
| 426 call1 (Qucs_set_table_for_input, buf); | 423 call1 (Qucs_set_table_for_input, buf); |
| 427 | 424 |
| 428 return buf; | 425 return buf; |
| 429 } | 426 } |
| 430 | 427 |
| 431 | 428 |
| 432 /* Return a list of overlays which is a copy of the overlay list | 429 /* Return a list of overlays which is a copy of the overlay list |
| 433 LIST, but for buffer B. */ | 430 LIST, but for buffer B. */ |
| 434 | 431 |
| 435 static Lisp_Object | 432 static struct Lisp_Overlay * |
| 436 copy_overlays (b, list) | 433 copy_overlays (b, list) |
| 437 struct buffer *b; | 434 struct buffer *b; |
| 438 Lisp_Object list; | 435 struct Lisp_Overlay *list; |
| 439 { | 436 { |
| 440 Lisp_Object result, buffer; | 437 Lisp_Object buffer; |
| 438 struct Lisp_Overlay *result = NULL, *tail = NULL; | |
| 441 | 439 |
| 442 XSETBUFFER (buffer, b); | 440 XSETBUFFER (buffer, b); |
| 443 | 441 |
| 444 for (result = Qnil; CONSP (list); list = XCDR (list)) | 442 for (; list; list = list->next) |
| 445 { | 443 { |
| 446 Lisp_Object overlay, start, end, old_overlay; | 444 Lisp_Object overlay, start, end, old_overlay; |
| 447 int charpos; | 445 EMACS_INT charpos; |
| 448 | 446 |
| 449 old_overlay = XCAR (list); | 447 XSETMISC (old_overlay, list); |
| 450 charpos = marker_position (OVERLAY_START (old_overlay)); | 448 charpos = marker_position (OVERLAY_START (old_overlay)); |
| 451 start = Fmake_marker (); | 449 start = Fmake_marker (); |
| 452 Fset_marker (start, make_number (charpos), buffer); | 450 Fset_marker (start, make_number (charpos), buffer); |
| 453 XMARKER (start)->insertion_type | 451 XMARKER (start)->insertion_type |
| 454 = XMARKER (OVERLAY_START (old_overlay))->insertion_type; | 452 = XMARKER (OVERLAY_START (old_overlay))->insertion_type; |
| 462 overlay = allocate_misc (); | 460 overlay = allocate_misc (); |
| 463 XMISCTYPE (overlay) = Lisp_Misc_Overlay; | 461 XMISCTYPE (overlay) = Lisp_Misc_Overlay; |
| 464 OVERLAY_START (overlay) = start; | 462 OVERLAY_START (overlay) = start; |
| 465 OVERLAY_END (overlay) = end; | 463 OVERLAY_END (overlay) = end; |
| 466 OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay)); | 464 OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay)); |
| 467 | 465 XOVERLAY (overlay)->next = NULL; |
| 468 result = Fcons (overlay, result); | 466 |
| 469 } | 467 if (tail) |
| 470 | 468 tail = tail->next = XOVERLAY (overlay); |
| 471 return Fnreverse (result); | 469 else |
| 470 result = tail = XOVERLAY (overlay); | |
| 471 } | |
| 472 | |
| 473 return result; | |
| 472 } | 474 } |
| 473 | 475 |
| 474 | 476 |
| 475 /* Clone per-buffer values of buffer FROM. | 477 /* Clone per-buffer values of buffer FROM. |
| 476 | 478 |
| 508 | 510 |
| 509 bcopy (from->local_flags, to->local_flags, sizeof to->local_flags); | 511 bcopy (from->local_flags, to->local_flags, sizeof to->local_flags); |
| 510 | 512 |
| 511 to->overlays_before = copy_overlays (to, from->overlays_before); | 513 to->overlays_before = copy_overlays (to, from->overlays_before); |
| 512 to->overlays_after = copy_overlays (to, from->overlays_after); | 514 to->overlays_after = copy_overlays (to, from->overlays_after); |
| 513 } | 515 |
| 514 | 516 /* Get (a copy of) the alist of Lisp-level local variables of FROM |
| 517 and install that in TO. */ | |
| 518 to->local_var_alist = buffer_lisp_local_variables (from); | |
| 519 } | |
| 515 | 520 |
| 516 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, | 521 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, |
| 517 2, 3, | 522 2, 3, |
| 518 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", | 523 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", |
| 519 doc: /* Create and return an indirect buffer for buffer BASE-BUFFER, named NAME. | 524 doc: /* Create and return an indirect buffer for buffer BASE-BUFFER, named NAME. |
| 520 BASE-BUFFER should be an existing buffer (or buffer name). | 525 BASE-BUFFER should be a live buffer, or the name of an existing buffer. |
| 521 NAME should be a string which is not the name of an existing buffer. | 526 NAME should be a string which is not the name of an existing buffer. |
| 522 Optional argument CLONE non-nil means preserve BASE-BUFFER's state, | 527 Optional argument CLONE non-nil means preserve BASE-BUFFER's state, |
| 523 such as major and minor modes, in the indirect buffer. | 528 such as major and minor modes, in the indirect buffer. |
| 524 CLONE nil means the indirect buffer's state is reset to default values. */) | 529 CLONE nil means the indirect buffer's state is reset to default values. */) |
| 525 (base_buffer, name, clone) | 530 (base_buffer, name, clone) |
| 526 Lisp_Object base_buffer, name, clone; | 531 Lisp_Object base_buffer, name, clone; |
| 527 { | 532 { |
| 528 Lisp_Object buf; | 533 Lisp_Object buf, tem; |
| 529 struct buffer *b; | 534 struct buffer *b; |
| 530 | 535 |
| 536 CHECK_STRING (name); | |
| 531 buf = Fget_buffer (name); | 537 buf = Fget_buffer (name); |
| 532 if (!NILP (buf)) | 538 if (!NILP (buf)) |
| 533 error ("Buffer name `%s' is in use", SDATA (name)); | 539 error ("Buffer name `%s' is in use", SDATA (name)); |
| 534 | 540 |
| 541 tem = base_buffer; | |
| 535 base_buffer = Fget_buffer (base_buffer); | 542 base_buffer = Fget_buffer (base_buffer); |
| 536 if (NILP (base_buffer)) | 543 if (NILP (base_buffer)) |
| 537 error ("No such buffer: `%s'", SDATA (name)); | 544 error ("No such buffer: `%s'", SDATA (tem)); |
| 545 if (NILP (XBUFFER (base_buffer)->name)) | |
| 546 error ("Base buffer has been killed"); | |
| 538 | 547 |
| 539 if (SCHARS (name) == 0) | 548 if (SCHARS (name) == 0) |
| 540 error ("Empty string for buffer name is not allowed"); | 549 error ("Empty string for buffer name is not allowed"); |
| 541 | 550 |
| 542 b = (struct buffer *) allocate_buffer (); | 551 b = (struct buffer *) allocate_buffer (); |
| 616 b->zv_marker = Fmake_marker (); | 625 b->zv_marker = Fmake_marker (); |
| 617 set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); | 626 set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); |
| 618 XMARKER (b->zv_marker)->insertion_type = 1; | 627 XMARKER (b->zv_marker)->insertion_type = 1; |
| 619 } | 628 } |
| 620 else | 629 else |
| 621 clone_per_buffer_values (b->base_buffer, b); | 630 { |
| 631 struct buffer *old_b = current_buffer; | |
| 632 | |
| 633 clone_per_buffer_values (b->base_buffer, b); | |
| 634 b->filename = Qnil; | |
| 635 b->file_truename = Qnil; | |
| 636 b->display_count = make_number (0); | |
| 637 b->backed_up = Qnil; | |
| 638 b->auto_save_file_name = Qnil; | |
| 639 set_buffer_internal_1 (b); | |
| 640 Fset (intern ("buffer-save-without-query"), Qnil); | |
| 641 Fset (intern ("buffer-file-number"), Qnil); | |
| 642 Fset (intern ("buffer-stale-function"), Qnil); | |
| 643 set_buffer_internal_1 (old_b); | |
| 644 } | |
| 622 | 645 |
| 623 return buf; | 646 return buf; |
| 624 } | 647 } |
| 625 | 648 |
| 649 void | |
| 650 delete_all_overlays (b) | |
| 651 struct buffer *b; | |
| 652 { | |
| 653 Lisp_Object overlay; | |
| 654 | |
| 655 /* `reset_buffer' blindly sets the list of overlays to NULL, so we | |
| 656 have to empty the list, otherwise we end up with overlays that | |
| 657 think they belong to this buffer while the buffer doesn't know about | |
| 658 them any more. */ | |
| 659 while (b->overlays_before) | |
| 660 { | |
| 661 XSETMISC (overlay, b->overlays_before); | |
| 662 Fdelete_overlay (overlay); | |
| 663 } | |
| 664 while (b->overlays_after) | |
| 665 { | |
| 666 XSETMISC (overlay, b->overlays_after); | |
| 667 Fdelete_overlay (overlay); | |
| 668 } | |
| 669 eassert (b->overlays_before == NULL); | |
| 670 eassert (b->overlays_after == NULL); | |
| 671 } | |
| 672 | |
| 626 /* Reinitialize everything about a buffer except its name and contents | 673 /* Reinitialize everything about a buffer except its name and contents |
| 627 and local variables. */ | 674 and local variables. |
| 675 If called on an already-initialized buffer, the list of overlays | |
| 676 should be deleted before calling this function, otherwise we end up | |
| 677 with overlays that claim to belong to the buffer but the buffer | |
| 678 claims it doesn't belong to it. */ | |
| 628 | 679 |
| 629 void | 680 void |
| 630 reset_buffer (b) | 681 reset_buffer (b) |
| 631 register struct buffer *b; | 682 register struct buffer *b; |
| 632 { | 683 { |
| 642 b->backed_up = Qnil; | 693 b->backed_up = Qnil; |
| 643 b->auto_save_modified = 0; | 694 b->auto_save_modified = 0; |
| 644 b->auto_save_failure_time = -1; | 695 b->auto_save_failure_time = -1; |
| 645 b->auto_save_file_name = Qnil; | 696 b->auto_save_file_name = Qnil; |
| 646 b->read_only = Qnil; | 697 b->read_only = Qnil; |
| 647 b->overlays_before = Qnil; | 698 b->overlays_before = NULL; |
| 648 b->overlays_after = Qnil; | 699 b->overlays_after = NULL; |
| 649 XSETFASTINT (b->overlay_center, 1); | 700 b->overlay_center = BEG; |
| 650 b->mark_active = Qnil; | 701 b->mark_active = Qnil; |
| 651 b->point_before_scroll = Qnil; | 702 b->point_before_scroll = Qnil; |
| 652 b->file_format = Qnil; | 703 b->file_format = Qnil; |
| 704 b->auto_save_file_format = Qt; | |
| 653 b->last_selected_window = Qnil; | 705 b->last_selected_window = Qnil; |
| 654 XSETINT (b->display_count, 0); | 706 XSETINT (b->display_count, 0); |
| 655 b->display_time = Qnil; | 707 b->display_time = Qnil; |
| 656 b->enable_multibyte_characters = buffer_defaults.enable_multibyte_characters; | 708 b->enable_multibyte_characters = buffer_defaults.enable_multibyte_characters; |
| 657 b->cursor_type = buffer_defaults.cursor_type; | 709 b->cursor_type = buffer_defaults.cursor_type; |
| 681 things that depend on the major mode. | 733 things that depend on the major mode. |
| 682 default-major-mode is handled at a higher level. | 734 default-major-mode is handled at a higher level. |
| 683 We ignore it here. */ | 735 We ignore it here. */ |
| 684 b->major_mode = Qfundamental_mode; | 736 b->major_mode = Qfundamental_mode; |
| 685 b->keymap = Qnil; | 737 b->keymap = Qnil; |
| 686 b->abbrev_table = Vfundamental_mode_abbrev_table; | |
| 687 b->mode_name = QSFundamental; | 738 b->mode_name = QSFundamental; |
| 688 b->minor_modes = Qnil; | 739 b->minor_modes = Qnil; |
| 689 | 740 |
| 690 /* If the standard case table has been altered and invalidated, | 741 /* If the standard case table has been altered and invalidated, |
| 691 fix up its insides first. */ | 742 fix up its insides first. */ |
| 733 DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name, | 784 DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name, |
| 734 1, 2, 0, | 785 1, 2, 0, |
| 735 doc: /* Return a string that is the name of no existing buffer based on NAME. | 786 doc: /* Return a string that is the name of no existing buffer based on NAME. |
| 736 If there is no live buffer named NAME, then return NAME. | 787 If there is no live buffer named NAME, then return NAME. |
| 737 Otherwise modify name by appending `<NUMBER>', incrementing NUMBER | 788 Otherwise modify name by appending `<NUMBER>', incrementing NUMBER |
| 738 until an unused name is found, and then return that name. | 789 \(starting at 2) until an unused name is found, and then return that name. |
| 739 Optional second argument IGNORE specifies a name that is okay to use | 790 Optional second argument IGNORE specifies a name that is okay to use |
| 740 \(if it is in the sequence to be tried) | 791 \(if it is in the sequence to be tried) |
| 741 even if a buffer with that name exists. */) | 792 even if a buffer with that name exists. */) |
| 742 (name, ignore) | 793 (name, ignore) |
| 743 register Lisp_Object name, ignore; | 794 register Lisp_Object name, ignore; |
| 746 int count; | 797 int count; |
| 747 char number[10]; | 798 char number[10]; |
| 748 | 799 |
| 749 CHECK_STRING (name); | 800 CHECK_STRING (name); |
| 750 | 801 |
| 802 tem = Fstring_equal (name, ignore); | |
| 803 if (!NILP (tem)) | |
| 804 return name; | |
| 751 tem = Fget_buffer (name); | 805 tem = Fget_buffer (name); |
| 752 if (NILP (tem)) | 806 if (NILP (tem)) |
| 753 return name; | 807 return name; |
| 754 | 808 |
| 755 count = 1; | 809 count = 1; |
| 792 } | 846 } |
| 793 | 847 |
| 794 DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer, | 848 DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer, |
| 795 0, 1, 0, | 849 0, 1, 0, |
| 796 doc: /* Return the base buffer of indirect buffer BUFFER. | 850 doc: /* Return the base buffer of indirect buffer BUFFER. |
| 797 If BUFFER is not indirect, return nil. */) | 851 If BUFFER is not indirect, return nil. |
| 852 BUFFER defaults to the current buffer. */) | |
| 798 (buffer) | 853 (buffer) |
| 799 register Lisp_Object buffer; | 854 register Lisp_Object buffer; |
| 800 { | 855 { |
| 801 struct buffer *base; | 856 struct buffer *base; |
| 802 Lisp_Object base_buffer; | 857 Lisp_Object base_buffer; |
| 817 | 872 |
| 818 DEFUN ("buffer-local-value", Fbuffer_local_value, | 873 DEFUN ("buffer-local-value", Fbuffer_local_value, |
| 819 Sbuffer_local_value, 2, 2, 0, | 874 Sbuffer_local_value, 2, 2, 0, |
| 820 doc: /* Return the value of VARIABLE in BUFFER. | 875 doc: /* Return the value of VARIABLE in BUFFER. |
| 821 If VARIABLE does not have a buffer-local binding in BUFFER, the value | 876 If VARIABLE does not have a buffer-local binding in BUFFER, the value |
| 822 is the default binding of variable. */) | 877 is the default binding of the variable. */) |
| 823 (symbol, buffer) | 878 (variable, buffer) |
| 824 register Lisp_Object symbol; | 879 register Lisp_Object variable; |
| 825 register Lisp_Object buffer; | 880 register Lisp_Object buffer; |
| 826 { | 881 { |
| 827 register struct buffer *buf; | 882 register struct buffer *buf; |
| 828 register Lisp_Object result; | 883 register Lisp_Object result; |
| 829 | 884 |
| 830 CHECK_SYMBOL (symbol); | 885 CHECK_SYMBOL (variable); |
| 831 CHECK_BUFFER (buffer); | 886 CHECK_BUFFER (buffer); |
| 832 buf = XBUFFER (buffer); | 887 buf = XBUFFER (buffer); |
| 833 | 888 |
| 889 if (SYMBOLP (variable)) | |
| 890 variable = indirect_variable (variable); | |
| 891 | |
| 834 /* Look in local_var_list */ | 892 /* Look in local_var_list */ |
| 835 result = Fassoc (symbol, buf->local_var_alist); | 893 result = Fassoc (variable, buf->local_var_alist); |
| 836 if (NILP (result)) | 894 if (NILP (result)) |
| 837 { | 895 { |
| 838 int offset, idx; | 896 int offset, idx; |
| 839 int found = 0; | 897 int found = 0; |
| 840 | 898 |
| 845 offset += (sizeof (EMACS_INT))) | 903 offset += (sizeof (EMACS_INT))) |
| 846 { | 904 { |
| 847 idx = PER_BUFFER_IDX (offset); | 905 idx = PER_BUFFER_IDX (offset); |
| 848 if ((idx == -1 || PER_BUFFER_VALUE_P (buf, idx)) | 906 if ((idx == -1 || PER_BUFFER_VALUE_P (buf, idx)) |
| 849 && SYMBOLP (PER_BUFFER_SYMBOL (offset)) | 907 && SYMBOLP (PER_BUFFER_SYMBOL (offset)) |
| 850 && EQ (PER_BUFFER_SYMBOL (offset), symbol)) | 908 && EQ (PER_BUFFER_SYMBOL (offset), variable)) |
| 851 { | 909 { |
| 852 result = PER_BUFFER_VALUE (buf, offset); | 910 result = PER_BUFFER_VALUE (buf, offset); |
| 853 found = 1; | 911 found = 1; |
| 854 break; | 912 break; |
| 855 } | 913 } |
| 856 } | 914 } |
| 857 | 915 |
| 858 if (!found) | 916 if (!found) |
| 859 result = Fdefault_value (symbol); | 917 result = Fdefault_value (variable); |
| 860 } | 918 } |
| 861 else | 919 else |
| 862 { | 920 { |
| 863 Lisp_Object valcontents; | 921 Lisp_Object valcontents; |
| 864 Lisp_Object current_alist_element; | 922 Lisp_Object current_alist_element; |
| 865 | 923 |
| 866 /* What binding is loaded right now? */ | 924 /* What binding is loaded right now? */ |
| 867 valcontents = SYMBOL_VALUE (symbol); | 925 valcontents = SYMBOL_VALUE (variable); |
| 868 current_alist_element | 926 current_alist_element |
| 869 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr); | 927 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr); |
| 870 | 928 |
| 871 /* The value of the currently loaded binding is not | 929 /* The value of the currently loaded binding is not |
| 872 stored in it, but rather in the realvalue slot. | 930 stored in it, but rather in the realvalue slot. |
| 879 /* Now get the (perhaps updated) value out of the binding. */ | 937 /* Now get the (perhaps updated) value out of the binding. */ |
| 880 result = XCDR (result); | 938 result = XCDR (result); |
| 881 } | 939 } |
| 882 | 940 |
| 883 if (EQ (result, Qunbound)) | 941 if (EQ (result, Qunbound)) |
| 884 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil)); | 942 return Fsignal (Qvoid_variable, Fcons (variable, Qnil)); |
| 943 | |
| 944 return result; | |
| 945 } | |
| 946 | |
| 947 /* Return an alist of the Lisp-level buffer-local bindings of | |
| 948 buffer BUF. That is, don't include the variables maintained | |
| 949 in special slots in the buffer object. */ | |
| 950 | |
| 951 static Lisp_Object | |
| 952 buffer_lisp_local_variables (buf) | |
| 953 struct buffer *buf; | |
| 954 { | |
| 955 Lisp_Object result = Qnil; | |
| 956 register Lisp_Object tail; | |
| 957 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) | |
| 958 { | |
| 959 Lisp_Object val, elt; | |
| 960 | |
| 961 elt = XCAR (tail); | |
| 962 | |
| 963 /* Reference each variable in the alist in buf. | |
| 964 If inquiring about the current buffer, this gets the current values, | |
| 965 so store them into the alist so the alist is up to date. | |
| 966 If inquiring about some other buffer, this swaps out any values | |
| 967 for that buffer, making the alist up to date automatically. */ | |
| 968 val = find_symbol_value (XCAR (elt)); | |
| 969 /* Use the current buffer value only if buf is the current buffer. */ | |
| 970 if (buf != current_buffer) | |
| 971 val = XCDR (elt); | |
| 972 | |
| 973 /* If symbol is unbound, put just the symbol in the list. */ | |
| 974 if (EQ (val, Qunbound)) | |
| 975 result = Fcons (XCAR (elt), result); | |
| 976 /* Otherwise, put (symbol . value) in the list. */ | |
| 977 else | |
| 978 result = Fcons (Fcons (XCAR (elt), val), result); | |
| 979 } | |
| 885 | 980 |
| 886 return result; | 981 return result; |
| 887 } | 982 } |
| 888 | 983 |
| 889 DEFUN ("buffer-local-variables", Fbuffer_local_variables, | 984 DEFUN ("buffer-local-variables", Fbuffer_local_variables, |
| 905 { | 1000 { |
| 906 CHECK_BUFFER (buffer); | 1001 CHECK_BUFFER (buffer); |
| 907 buf = XBUFFER (buffer); | 1002 buf = XBUFFER (buffer); |
| 908 } | 1003 } |
| 909 | 1004 |
| 910 result = Qnil; | 1005 result = buffer_lisp_local_variables (buf); |
| 911 | |
| 912 { | |
| 913 register Lisp_Object tail; | |
| 914 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) | |
| 915 { | |
| 916 Lisp_Object val, elt; | |
| 917 | |
| 918 elt = XCAR (tail); | |
| 919 | |
| 920 /* Reference each variable in the alist in buf. | |
| 921 If inquiring about the current buffer, this gets the current values, | |
| 922 so store them into the alist so the alist is up to date. | |
| 923 If inquiring about some other buffer, this swaps out any values | |
| 924 for that buffer, making the alist up to date automatically. */ | |
| 925 val = find_symbol_value (XCAR (elt)); | |
| 926 /* Use the current buffer value only if buf is the current buffer. */ | |
| 927 if (buf != current_buffer) | |
| 928 val = XCDR (elt); | |
| 929 | |
| 930 /* If symbol is unbound, put just the symbol in the list. */ | |
| 931 if (EQ (val, Qunbound)) | |
| 932 result = Fcons (XCAR (elt), result); | |
| 933 /* Otherwise, put (symbol . value) in the list. */ | |
| 934 else | |
| 935 result = Fcons (Fcons (XCAR (elt), val), result); | |
| 936 } | |
| 937 } | |
| 938 | 1006 |
| 939 /* Add on all the variables stored in special slots. */ | 1007 /* Add on all the variables stored in special slots. */ |
| 940 { | 1008 { |
| 941 int offset, idx; | 1009 int offset, idx; |
| 942 | 1010 |
| 954 } | 1022 } |
| 955 } | 1023 } |
| 956 | 1024 |
| 957 return result; | 1025 return result; |
| 958 } | 1026 } |
| 959 | |
| 960 | 1027 |
| 961 DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p, | 1028 DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p, |
| 962 0, 1, 0, | 1029 0, 1, 0, |
| 963 doc: /* Return t if BUFFER was modified since its file was last read or saved. | 1030 doc: /* Return t if BUFFER was modified since its file was last read or saved. |
| 964 No argument or nil as argument means use current buffer as BUFFER. */) | 1031 No argument or nil as argument means use current buffer as BUFFER. */) |
| 1028 return flag; | 1095 return flag; |
| 1029 } | 1096 } |
| 1030 | 1097 |
| 1031 DEFUN ("restore-buffer-modified-p", Frestore_buffer_modified_p, | 1098 DEFUN ("restore-buffer-modified-p", Frestore_buffer_modified_p, |
| 1032 Srestore_buffer_modified_p, 1, 1, 0, | 1099 Srestore_buffer_modified_p, 1, 1, 0, |
| 1033 doc: /* Like `set-buffer-modified-p', with a differences concerning redisplay. | 1100 doc: /* Like `set-buffer-modified-p', with a difference concerning redisplay. |
| 1034 It is not ensured that mode lines will be updated to show the modified | 1101 It is not ensured that mode lines will be updated to show the modified |
| 1035 state of the current buffer. Use with care. */) | 1102 state of the current buffer. Use with care. */) |
| 1036 (flag) | 1103 (flag) |
| 1037 Lisp_Object flag; | 1104 Lisp_Object flag; |
| 1038 { | 1105 { |
| 1166 for (; CONSP (tail); tail = XCDR (tail)) | 1233 for (; CONSP (tail); tail = XCDR (tail)) |
| 1167 { | 1234 { |
| 1168 buf = Fcdr (XCAR (tail)); | 1235 buf = Fcdr (XCAR (tail)); |
| 1169 if (EQ (buf, buffer)) | 1236 if (EQ (buf, buffer)) |
| 1170 continue; | 1237 continue; |
| 1238 if (NILP (buf)) | |
| 1239 continue; | |
| 1240 if (NILP (XBUFFER (buf)->name)) | |
| 1241 continue; | |
| 1171 if (SREF (XBUFFER (buf)->name, 0) == ' ') | 1242 if (SREF (XBUFFER (buf)->name, 0) == ' ') |
| 1172 continue; | 1243 continue; |
| 1173 /* If the selected frame has a buffer_predicate, | 1244 /* If the selected frame has a buffer_predicate, |
| 1174 disregard buffers that don't fit the predicate. */ | 1245 disregard buffers that don't fit the predicate. */ |
| 1175 if (!NILP (pred)) | 1246 if (!NILP (pred)) |
| 1197 Fset_buffer_major_mode (buf); | 1268 Fset_buffer_major_mode (buf); |
| 1198 } | 1269 } |
| 1199 return buf; | 1270 return buf; |
| 1200 } | 1271 } |
| 1201 | 1272 |
| 1202 DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, | |
| 1203 0, 1, "", | |
| 1204 doc: /* Make BUFFER stop keeping undo information. | |
| 1205 No argument or nil as argument means do this for the current buffer. */) | |
| 1206 (buffer) | |
| 1207 register Lisp_Object buffer; | |
| 1208 { | |
| 1209 Lisp_Object real_buffer; | |
| 1210 | |
| 1211 if (NILP (buffer)) | |
| 1212 XSETBUFFER (real_buffer, current_buffer); | |
| 1213 else | |
| 1214 { | |
| 1215 real_buffer = Fget_buffer (buffer); | |
| 1216 if (NILP (real_buffer)) | |
| 1217 nsberror (buffer); | |
| 1218 } | |
| 1219 | |
| 1220 XBUFFER (real_buffer)->undo_list = Qt; | |
| 1221 | |
| 1222 return Qnil; | |
| 1223 } | |
| 1224 | |
| 1225 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo, | 1273 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo, |
| 1226 0, 1, "", | 1274 0, 1, "", |
| 1227 doc: /* Start keeping undo information for buffer BUFFER. | 1275 doc: /* Start keeping undo information for buffer BUFFER. |
| 1228 No argument or nil as argument means do this for the current buffer. */) | 1276 No argument or nil as argument means do this for the current buffer. */) |
| 1229 (buffer) | 1277 (buffer) |
| 1301 } | 1349 } |
| 1302 | 1350 |
| 1303 /* Run hooks with the buffer to be killed the current buffer. */ | 1351 /* Run hooks with the buffer to be killed the current buffer. */ |
| 1304 { | 1352 { |
| 1305 int count = SPECPDL_INDEX (); | 1353 int count = SPECPDL_INDEX (); |
| 1306 Lisp_Object list; | 1354 Lisp_Object arglist[1]; |
| 1307 | 1355 |
| 1308 record_unwind_protect (save_excursion_restore, save_excursion_save ()); | 1356 record_unwind_protect (save_excursion_restore, save_excursion_save ()); |
| 1309 set_buffer_internal (b); | 1357 set_buffer_internal (b); |
| 1310 | 1358 |
| 1311 /* First run the query functions; if any query is answered no, | 1359 /* First run the query functions; if any query is answered no, |
| 1312 don't kill the buffer. */ | 1360 don't kill the buffer. */ |
| 1313 for (list = Vkill_buffer_query_functions; CONSP (list); list = XCDR (list)) | 1361 arglist[0] = Qkill_buffer_query_functions; |
| 1314 { | 1362 tem = Frun_hook_with_args_until_failure (1, arglist); |
| 1315 tem = call0 (XCAR (list)); | 1363 if (NILP (tem)) |
| 1316 if (NILP (tem)) | 1364 return unbind_to (count, Qnil); |
| 1317 return unbind_to (count, Qnil); | |
| 1318 } | |
| 1319 | 1365 |
| 1320 /* Then run the hooks. */ | 1366 /* Then run the hooks. */ |
| 1321 Frun_hooks (1, &Qkill_buffer_hook); | 1367 Frun_hooks (1, &Qkill_buffer_hook); |
| 1322 unbind_to (count, Qnil); | 1368 unbind_to (count, Qnil); |
| 1323 } | 1369 } |
| 1382 /* Unlock this buffer's file, if it is locked. */ | 1428 /* Unlock this buffer's file, if it is locked. */ |
| 1383 unlock_buffer (b); | 1429 unlock_buffer (b); |
| 1384 #endif /* CLASH_DETECTION */ | 1430 #endif /* CLASH_DETECTION */ |
| 1385 | 1431 |
| 1386 kill_buffer_processes (buf); | 1432 kill_buffer_processes (buf); |
| 1433 clear_charpos_cache (b); | |
| 1387 | 1434 |
| 1388 tem = Vinhibit_quit; | 1435 tem = Vinhibit_quit; |
| 1389 Vinhibit_quit = Qt; | 1436 Vinhibit_quit = Qt; |
| 1390 replace_buffer_in_all_windows (buf); | 1437 replace_buffer_in_all_windows (buf); |
| 1391 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist); | 1438 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist); |
| 1395 /* Delete any auto-save file, if we saved it in this session. | 1442 /* Delete any auto-save file, if we saved it in this session. |
| 1396 But not if the buffer is modified. */ | 1443 But not if the buffer is modified. */ |
| 1397 if (STRINGP (b->auto_save_file_name) | 1444 if (STRINGP (b->auto_save_file_name) |
| 1398 && b->auto_save_modified != 0 | 1445 && b->auto_save_modified != 0 |
| 1399 && BUF_SAVE_MODIFF (b) < b->auto_save_modified | 1446 && BUF_SAVE_MODIFF (b) < b->auto_save_modified |
| 1400 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)) | 1447 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b) |
| 1448 && NILP (Fsymbol_value (intern ("auto-save-visited-file-name")))) | |
| 1401 { | 1449 { |
| 1402 Lisp_Object tem; | 1450 Lisp_Object tem; |
| 1403 tem = Fsymbol_value (intern ("delete-auto-save-files")); | 1451 tem = Fsymbol_value (intern ("delete-auto-save-files")); |
| 1404 if (! NILP (tem)) | 1452 if (! NILP (tem)) |
| 1405 internal_delete_file (b->auto_save_file_name); | 1453 internal_delete_file (b->auto_save_file_name); |
| 1408 if (b->base_buffer) | 1456 if (b->base_buffer) |
| 1409 { | 1457 { |
| 1410 /* Unchain all markers that belong to this indirect buffer. | 1458 /* Unchain all markers that belong to this indirect buffer. |
| 1411 Don't unchain the markers that belong to the base buffer | 1459 Don't unchain the markers that belong to the base buffer |
| 1412 or its other indirect buffers. */ | 1460 or its other indirect buffers. */ |
| 1413 for (tem = BUF_MARKERS (b); !NILP (tem); ) | 1461 for (m = BUF_MARKERS (b); m; ) |
| 1414 { | 1462 { |
| 1415 Lisp_Object next; | 1463 struct Lisp_Marker *next = m->next; |
| 1416 m = XMARKER (tem); | |
| 1417 next = m->chain; | |
| 1418 if (m->buffer == b) | 1464 if (m->buffer == b) |
| 1419 unchain_marker (tem); | 1465 unchain_marker (m); |
| 1420 tem = next; | 1466 m = next; |
| 1421 } | 1467 } |
| 1422 } | 1468 } |
| 1423 else | 1469 else |
| 1424 { | 1470 { |
| 1425 /* Unchain all markers of this buffer and its indirect buffers. | 1471 /* Unchain all markers of this buffer and its indirect buffers. |
| 1426 and leave them pointing nowhere. */ | 1472 and leave them pointing nowhere. */ |
| 1427 for (tem = BUF_MARKERS (b); !NILP (tem); ) | 1473 for (m = BUF_MARKERS (b); m; ) |
| 1428 { | 1474 { |
| 1429 m = XMARKER (tem); | 1475 struct Lisp_Marker *next = m->next; |
| 1430 m->buffer = 0; | 1476 m->buffer = 0; |
| 1431 tem = m->chain; | 1477 m->next = NULL; |
| 1432 m->chain = Qnil; | 1478 m = next; |
| 1433 } | 1479 } |
| 1434 BUF_MARKERS (b) = Qnil; | 1480 BUF_MARKERS (b) = NULL; |
| 1435 BUF_INTERVALS (b) = NULL_INTERVAL; | 1481 BUF_INTERVALS (b) = NULL_INTERVAL; |
| 1436 | 1482 |
| 1437 /* Perhaps we should explicitly free the interval tree here... */ | 1483 /* Perhaps we should explicitly free the interval tree here... */ |
| 1438 } | 1484 } |
| 1439 | 1485 |
| 1607 record_buffer (buf); | 1653 record_buffer (buf); |
| 1608 | 1654 |
| 1609 Fset_window_buffer (EQ (selected_window, minibuf_window) | 1655 Fset_window_buffer (EQ (selected_window, minibuf_window) |
| 1610 ? Fnext_window (minibuf_window, Qnil, Qnil) | 1656 ? Fnext_window (minibuf_window, Qnil, Qnil) |
| 1611 : selected_window, | 1657 : selected_window, |
| 1612 buf); | 1658 buf, Qnil); |
| 1613 | 1659 |
| 1614 return buf; | 1660 return buf; |
| 1615 } | 1661 } |
| 1616 | 1662 |
| 1617 DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ", | 1663 DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ", |
| 1618 doc: /* Select buffer BUFFER in the current window. | 1664 doc: /* Select buffer BUFFER in the current window. |
| 1619 BUFFER may be a buffer or a buffer name. | 1665 If BUFFER does not identify an existing buffer, |
| 1666 then this function creates a buffer with that name. | |
| 1667 | |
| 1668 When called from Lisp, BUFFER may be a buffer, a string \(a buffer name), | |
| 1669 or nil. If BUFFER is nil, then this function chooses a buffer | |
| 1670 using `other-buffer'. | |
| 1620 Optional second arg NORECORD non-nil means | 1671 Optional second arg NORECORD non-nil means |
| 1621 do not put this buffer at the front of the list of recently selected ones. | 1672 do not put this buffer at the front of the list of recently selected ones. |
| 1673 This function returns the buffer it switched to. | |
| 1622 | 1674 |
| 1623 WARNING: This is NOT the way to work on another buffer temporarily | 1675 WARNING: This is NOT the way to work on another buffer temporarily |
| 1624 within a Lisp program! Use `set-buffer' instead. That avoids messing with | 1676 within a Lisp program! Use `set-buffer' instead. That avoids messing with |
| 1625 the window-buffer correspondences. */) | 1677 the window-buffer correspondences. */) |
| 1626 (buffer, norecord) | 1678 (buffer, norecord) |
| 1627 Lisp_Object buffer, norecord; | 1679 Lisp_Object buffer, norecord; |
| 1628 { | 1680 { |
| 1629 char *err; | 1681 char *err; |
| 1630 | 1682 |
| 1683 if (EQ (buffer, Fwindow_buffer (selected_window))) | |
| 1684 /* Basically a NOP. Avoid signalling an error if the selected window | |
| 1685 is dedicated, or a minibuffer, ... */ | |
| 1686 return Fset_buffer (buffer); | |
| 1687 | |
| 1631 err = no_switch_window (selected_window); | 1688 err = no_switch_window (selected_window); |
| 1632 if (err) error (err); | 1689 if (err) error (err); |
| 1633 | 1690 |
| 1634 return switch_to_buffer_1 (buffer, norecord); | 1691 return switch_to_buffer_1 (buffer, norecord); |
| 1635 } | 1692 } |
| 1636 | 1693 |
| 1637 DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 3, 0, | 1694 DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 3, 0, |
| 1638 doc: /* Select buffer BUFFER in some window, preferably a different one. | 1695 doc: /* Select buffer BUFFER in some window, preferably a different one. |
| 1639 If BUFFER is nil, then some other buffer is chosen. | 1696 BUFFER may be a buffer, a string \(a buffer name), or nil. |
| 1697 If BUFFER is a string which is not the name of an existing buffer, | |
| 1698 then this function creates a buffer with that name. | |
| 1699 If BUFFER is nil, then it chooses some other buffer. | |
| 1640 If `pop-up-windows' is non-nil, windows can be split to do this. | 1700 If `pop-up-windows' is non-nil, windows can be split to do this. |
| 1641 If optional second arg OTHER-WINDOW is non-nil, insist on finding another | 1701 If optional second arg OTHER-WINDOW is non-nil, insist on finding another |
| 1642 window even if BUFFER is already visible in the selected window. | 1702 window even if BUFFER is already visible in the selected window, |
| 1703 and ignore `same-window-regexps' and `same-window-buffer-names'. | |
| 1704 This function returns the buffer it switched to. | |
| 1643 This uses the function `display-buffer' as a subroutine; see the documentation | 1705 This uses the function `display-buffer' as a subroutine; see the documentation |
| 1644 of `display-buffer' for additional customization information. | 1706 of `display-buffer' for additional customization information. |
| 1645 | 1707 |
| 1646 Optional third arg NORECORD non-nil means | 1708 Optional third arg NORECORD non-nil means |
| 1647 do not put this buffer at the front of the list of recently selected ones. */) | 1709 do not put this buffer at the front of the list of recently selected ones. */) |
| 1659 buf = Fget_buffer_create (buffer); | 1721 buf = Fget_buffer_create (buffer); |
| 1660 Fset_buffer_major_mode (buf); | 1722 Fset_buffer_major_mode (buf); |
| 1661 } | 1723 } |
| 1662 } | 1724 } |
| 1663 Fset_buffer (buf); | 1725 Fset_buffer (buf); |
| 1664 if (NILP (norecord)) | 1726 Fselect_window (Fdisplay_buffer (buf, other_window, Qnil), norecord); |
| 1665 /* This seems bogus since Fselect_window will call record_buffer anyway. */ | |
| 1666 record_buffer (buf); | |
| 1667 Fselect_window (Fdisplay_buffer (buf, other_window, Qnil)); | |
| 1668 return buf; | 1727 return buf; |
| 1669 } | 1728 } |
| 1670 | 1729 |
| 1671 DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0, | 1730 DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0, |
| 1672 doc: /* Return the current buffer as a Lisp object. */) | 1731 doc: /* Return the current buffer as a Lisp object. */) |
| 1773 } | 1832 } |
| 1774 | 1833 |
| 1775 /* Look down buffer's list of local Lisp variables | 1834 /* Look down buffer's list of local Lisp variables |
| 1776 to find and update any that forward into C variables. */ | 1835 to find and update any that forward into C variables. */ |
| 1777 | 1836 |
| 1778 for (tail = b->local_var_alist; !NILP (tail); tail = XCDR (tail)) | 1837 for (tail = b->local_var_alist; CONSP (tail); tail = XCDR (tail)) |
| 1779 { | 1838 { |
| 1780 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); | 1839 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); |
| 1781 if ((BUFFER_LOCAL_VALUEP (valcontents) | 1840 if ((BUFFER_LOCAL_VALUEP (valcontents) |
| 1782 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) | 1841 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) |
| 1783 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, | 1842 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, |
| 1788 } | 1847 } |
| 1789 | 1848 |
| 1790 /* Do the same with any others that were local to the previous buffer */ | 1849 /* Do the same with any others that were local to the previous buffer */ |
| 1791 | 1850 |
| 1792 if (old_buf) | 1851 if (old_buf) |
| 1793 for (tail = old_buf->local_var_alist; !NILP (tail); tail = XCDR (tail)) | 1852 for (tail = old_buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) |
| 1794 { | 1853 { |
| 1795 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); | 1854 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); |
| 1796 if ((BUFFER_LOCAL_VALUEP (valcontents) | 1855 if ((BUFFER_LOCAL_VALUEP (valcontents) |
| 1797 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) | 1856 || SOME_BUFFER_LOCAL_VALUEP (valcontents)) |
| 1798 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, | 1857 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, |
| 1908 | 1967 |
| 1909 DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "", | 1968 DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "", |
| 1910 doc: /* Put BUFFER at the end of the list of all buffers. | 1969 doc: /* Put BUFFER at the end of the list of all buffers. |
| 1911 There it is the least likely candidate for `other-buffer' to return; | 1970 There it is the least likely candidate for `other-buffer' to return; |
| 1912 thus, the least likely buffer for \\[switch-to-buffer] to select by default. | 1971 thus, the least likely buffer for \\[switch-to-buffer] to select by default. |
| 1972 You can specify a buffer name as BUFFER, or an actual buffer object. | |
| 1913 If BUFFER is nil or omitted, bury the current buffer. | 1973 If BUFFER is nil or omitted, bury the current buffer. |
| 1914 Also, if BUFFER is nil or omitted, remove the current buffer from the | 1974 Also, if BUFFER is nil or omitted, remove the current buffer from the |
| 1915 selected window if it is displayed there. */) | 1975 selected window if it is displayed there. */) |
| 1916 (buffer) | 1976 (buffer) |
| 1917 register Lisp_Object buffer; | 1977 register Lisp_Object buffer; |
| 2042 1, 1, 0, | 2102 1, 1, 0, |
| 2043 doc: /* Set the multibyte flag of the current buffer to FLAG. | 2103 doc: /* Set the multibyte flag of the current buffer to FLAG. |
| 2044 If FLAG is t, this makes the buffer a multibyte buffer. | 2104 If FLAG is t, this makes the buffer a multibyte buffer. |
| 2045 If FLAG is nil, this makes the buffer a single-byte buffer. | 2105 If FLAG is nil, this makes the buffer a single-byte buffer. |
| 2046 The buffer contents remain unchanged as a sequence of bytes | 2106 The buffer contents remain unchanged as a sequence of bytes |
| 2047 but the contents viewed as characters do change. */) | 2107 but the contents viewed as characters do change. |
| 2108 If the multibyte flag was really changed, undo information of the | |
| 2109 current buffer is cleared. */) | |
| 2048 (flag) | 2110 (flag) |
| 2049 Lisp_Object flag; | 2111 Lisp_Object flag; |
| 2050 { | 2112 { |
| 2051 Lisp_Object tail, markers; | 2113 struct Lisp_Marker *tail, *markers; |
| 2052 struct buffer *other; | 2114 struct buffer *other; |
| 2053 int undo_enabled_p = !EQ (current_buffer->undo_list, Qt); | 2115 int undo_enabled_p = !EQ (current_buffer->undo_list, Qt); |
| 2054 int begv = BEGV, zv = ZV; | 2116 int begv, zv; |
| 2055 int narrowed = (BEG != begv || Z != zv); | 2117 int narrowed = (BEG != BEGV || Z != ZV); |
| 2056 int modified_p = !NILP (Fbuffer_modified_p (Qnil)); | 2118 int modified_p = !NILP (Fbuffer_modified_p (Qnil)); |
| 2057 | 2119 |
| 2058 if (current_buffer->base_buffer) | 2120 if (current_buffer->base_buffer) |
| 2059 error ("Cannot do `set-buffer-multibyte' on an indirect buffer"); | 2121 error ("Cannot do `set-buffer-multibyte' on an indirect buffer"); |
| 2060 | 2122 |
| 2067 if (undo_enabled_p) | 2129 if (undo_enabled_p) |
| 2068 current_buffer->undo_list = Qt; | 2130 current_buffer->undo_list = Qt; |
| 2069 | 2131 |
| 2070 /* If the cached position is for this buffer, clear it out. */ | 2132 /* If the cached position is for this buffer, clear it out. */ |
| 2071 clear_charpos_cache (current_buffer); | 2133 clear_charpos_cache (current_buffer); |
| 2134 | |
| 2135 if (NILP (flag)) | |
| 2136 begv = BEGV_BYTE, zv = ZV_BYTE; | |
| 2137 else | |
| 2138 begv = BEGV, zv = ZV; | |
| 2072 | 2139 |
| 2073 if (narrowed) | 2140 if (narrowed) |
| 2074 Fwiden (); | 2141 Fwiden (); |
| 2075 | 2142 |
| 2076 if (NILP (flag)) | 2143 if (NILP (flag)) |
| 2088 BEGV = BEGV_BYTE; | 2155 BEGV = BEGV_BYTE; |
| 2089 ZV = ZV_BYTE; | 2156 ZV = ZV_BYTE; |
| 2090 GPT = GPT_BYTE; | 2157 GPT = GPT_BYTE; |
| 2091 TEMP_SET_PT_BOTH (PT_BYTE, PT_BYTE); | 2158 TEMP_SET_PT_BOTH (PT_BYTE, PT_BYTE); |
| 2092 | 2159 |
| 2093 tail = BUF_MARKERS (current_buffer); | 2160 |
| 2094 while (! NILP (tail)) | 2161 for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) |
| 2095 { | 2162 tail->charpos = tail->bytepos; |
| 2096 XMARKER (tail)->charpos = XMARKER (tail)->bytepos; | |
| 2097 tail = XMARKER (tail)->chain; | |
| 2098 } | |
| 2099 | 2163 |
| 2100 /* Convert multibyte form of 8-bit characters to unibyte. */ | 2164 /* Convert multibyte form of 8-bit characters to unibyte. */ |
| 2101 pos = BEG; | 2165 pos = BEG; |
| 2102 stop = GPT; | 2166 stop = GPT; |
| 2103 p = BEG_ADDR; | 2167 p = BEG_ADDR; |
| 2241 tail = markers = BUF_MARKERS (current_buffer); | 2305 tail = markers = BUF_MARKERS (current_buffer); |
| 2242 | 2306 |
| 2243 /* This prevents BYTE_TO_CHAR (that is, buf_bytepos_to_charpos) from | 2307 /* This prevents BYTE_TO_CHAR (that is, buf_bytepos_to_charpos) from |
| 2244 getting confused by the markers that have not yet been updated. | 2308 getting confused by the markers that have not yet been updated. |
| 2245 It is also a signal that it should never create a marker. */ | 2309 It is also a signal that it should never create a marker. */ |
| 2246 BUF_MARKERS (current_buffer) = Qnil; | 2310 BUF_MARKERS (current_buffer) = NULL; |
| 2247 | 2311 |
| 2248 while (! NILP (tail)) | 2312 for (; tail; tail = tail->next) |
| 2249 { | 2313 { |
| 2250 XMARKER (tail)->bytepos | 2314 tail->bytepos = advance_to_char_boundary (tail->bytepos); |
| 2251 = advance_to_char_boundary (XMARKER (tail)->bytepos); | 2315 tail->charpos = BYTE_TO_CHAR (tail->bytepos); |
| 2252 XMARKER (tail)->charpos = BYTE_TO_CHAR (XMARKER (tail)->bytepos); | |
| 2253 | |
| 2254 tail = XMARKER (tail)->chain; | |
| 2255 } | 2316 } |
| 2256 | 2317 |
| 2257 /* Make sure no markers were put on the chain | 2318 /* Make sure no markers were put on the chain |
| 2258 while the chain value was incorrect. */ | 2319 while the chain value was incorrect. */ |
| 2259 if (! EQ (BUF_MARKERS (current_buffer), Qnil)) | 2320 if (BUF_MARKERS (current_buffer)) |
| 2260 abort (); | 2321 abort (); |
| 2261 | 2322 |
| 2262 BUF_MARKERS (current_buffer) = markers; | 2323 BUF_MARKERS (current_buffer) = markers; |
| 2263 | 2324 |
| 2264 /* Do this last, so it can calculate the new correspondences | 2325 /* Do this last, so it can calculate the new correspondences |
| 2286 | 2347 |
| 2287 /* Restore the modifiedness of the buffer. */ | 2348 /* Restore the modifiedness of the buffer. */ |
| 2288 if (!modified_p && !NILP (Fbuffer_modified_p (Qnil))) | 2349 if (!modified_p && !NILP (Fbuffer_modified_p (Qnil))) |
| 2289 Fset_buffer_modified_p (Qnil); | 2350 Fset_buffer_modified_p (Qnil); |
| 2290 | 2351 |
| 2352 #ifdef subprocesses | |
| 2291 /* Update coding systems of this buffer's process (if any). */ | 2353 /* Update coding systems of this buffer's process (if any). */ |
| 2292 { | 2354 { |
| 2293 Lisp_Object process; | 2355 Lisp_Object process; |
| 2294 | 2356 |
| 2295 process = Fget_buffer_process (Fcurrent_buffer ()); | 2357 process = Fget_buffer_process (Fcurrent_buffer ()); |
| 2296 if (PROCESSP (process)) | 2358 if (PROCESSP (process)) |
| 2297 setup_process_coding_systems (process); | 2359 setup_process_coding_systems (process); |
| 2298 } | 2360 } |
| 2361 #endif /* subprocesses */ | |
| 2299 | 2362 |
| 2300 return flag; | 2363 return flag; |
| 2301 } | 2364 } |
| 2302 | 2365 |
| 2303 DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables, | 2366 DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables, |
| 2420 *NEXT_PTR is guaranteed to be not equal to POS, unless it is the | 2483 *NEXT_PTR is guaranteed to be not equal to POS, unless it is the |
| 2421 default (BEGV or ZV). */ | 2484 default (BEGV or ZV). */ |
| 2422 | 2485 |
| 2423 int | 2486 int |
| 2424 overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req) | 2487 overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req) |
| 2425 int pos; | 2488 EMACS_INT pos; |
| 2426 int extend; | 2489 int extend; |
| 2427 Lisp_Object **vec_ptr; | 2490 Lisp_Object **vec_ptr; |
| 2428 int *len_ptr; | 2491 int *len_ptr; |
| 2429 int *next_ptr; | 2492 int *next_ptr; |
| 2430 int *prev_ptr; | 2493 int *prev_ptr; |
| 2431 int change_req; | 2494 int change_req; |
| 2432 { | 2495 { |
| 2433 Lisp_Object tail, overlay, start, end; | 2496 Lisp_Object overlay, start, end; |
| 2497 struct Lisp_Overlay *tail; | |
| 2434 int idx = 0; | 2498 int idx = 0; |
| 2435 int len = *len_ptr; | 2499 int len = *len_ptr; |
| 2436 Lisp_Object *vec = *vec_ptr; | 2500 Lisp_Object *vec = *vec_ptr; |
| 2437 int next = ZV; | 2501 int next = ZV; |
| 2438 int prev = BEGV; | 2502 int prev = BEGV; |
| 2439 int inhibit_storing = 0; | 2503 int inhibit_storing = 0; |
| 2440 | 2504 |
| 2441 for (tail = current_buffer->overlays_before; | 2505 for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2442 GC_CONSP (tail); | |
| 2443 tail = XCDR (tail)) | |
| 2444 { | 2506 { |
| 2445 int startpos, endpos; | 2507 int startpos, endpos; |
| 2446 | 2508 |
| 2447 overlay = XCAR (tail); | 2509 XSETMISC (overlay, tail); |
| 2448 | 2510 |
| 2449 start = OVERLAY_START (overlay); | 2511 start = OVERLAY_START (overlay); |
| 2450 end = OVERLAY_END (overlay); | 2512 end = OVERLAY_END (overlay); |
| 2451 endpos = OVERLAY_POSITION (end); | 2513 endpos = OVERLAY_POSITION (end); |
| 2452 if (endpos < pos) | 2514 if (endpos < pos) |
| 2489 } | 2551 } |
| 2490 else if (startpos < next) | 2552 else if (startpos < next) |
| 2491 next = startpos; | 2553 next = startpos; |
| 2492 } | 2554 } |
| 2493 | 2555 |
| 2494 for (tail = current_buffer->overlays_after; | 2556 for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2495 GC_CONSP (tail); | |
| 2496 tail = XCDR (tail)) | |
| 2497 { | 2557 { |
| 2498 int startpos, endpos; | 2558 int startpos, endpos; |
| 2499 | 2559 |
| 2500 overlay = XCAR (tail); | 2560 XSETMISC (overlay, tail); |
| 2501 | 2561 |
| 2502 start = OVERLAY_START (overlay); | 2562 start = OVERLAY_START (overlay); |
| 2503 end = OVERLAY_END (overlay); | 2563 end = OVERLAY_END (overlay); |
| 2504 startpos = OVERLAY_POSITION (start); | 2564 startpos = OVERLAY_POSITION (start); |
| 2505 if (pos < startpos) | 2565 if (pos < startpos) |
| 2565 If EXTEND is non-zero, we make the vector bigger if necessary. | 2625 If EXTEND is non-zero, we make the vector bigger if necessary. |
| 2566 If EXTEND is zero, we never extend the vector, | 2626 If EXTEND is zero, we never extend the vector, |
| 2567 and we store only as many overlays as will fit. | 2627 and we store only as many overlays as will fit. |
| 2568 But we still return the total number of overlays. */ | 2628 But we still return the total number of overlays. */ |
| 2569 | 2629 |
| 2570 int | 2630 static int |
| 2571 overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr) | 2631 overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr) |
| 2572 int beg, end; | 2632 int beg, end; |
| 2573 int extend; | 2633 int extend; |
| 2574 Lisp_Object **vec_ptr; | 2634 Lisp_Object **vec_ptr; |
| 2575 int *len_ptr; | 2635 int *len_ptr; |
| 2576 int *next_ptr; | 2636 int *next_ptr; |
| 2577 int *prev_ptr; | 2637 int *prev_ptr; |
| 2578 { | 2638 { |
| 2579 Lisp_Object tail, overlay, ostart, oend; | 2639 Lisp_Object overlay, ostart, oend; |
| 2640 struct Lisp_Overlay *tail; | |
| 2580 int idx = 0; | 2641 int idx = 0; |
| 2581 int len = *len_ptr; | 2642 int len = *len_ptr; |
| 2582 Lisp_Object *vec = *vec_ptr; | 2643 Lisp_Object *vec = *vec_ptr; |
| 2583 int next = ZV; | 2644 int next = ZV; |
| 2584 int prev = BEGV; | 2645 int prev = BEGV; |
| 2585 int inhibit_storing = 0; | 2646 int inhibit_storing = 0; |
| 2586 | 2647 |
| 2587 for (tail = current_buffer->overlays_before; | 2648 for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2588 GC_CONSP (tail); | |
| 2589 tail = XCDR (tail)) | |
| 2590 { | 2649 { |
| 2591 int startpos, endpos; | 2650 int startpos, endpos; |
| 2592 | 2651 |
| 2593 overlay = XCAR (tail); | 2652 XSETMISC (overlay, tail); |
| 2594 | 2653 |
| 2595 ostart = OVERLAY_START (overlay); | 2654 ostart = OVERLAY_START (overlay); |
| 2596 oend = OVERLAY_END (overlay); | 2655 oend = OVERLAY_END (overlay); |
| 2597 endpos = OVERLAY_POSITION (oend); | 2656 endpos = OVERLAY_POSITION (oend); |
| 2598 if (endpos < beg) | 2657 if (endpos < beg) |
| 2632 } | 2691 } |
| 2633 else if (startpos < next) | 2692 else if (startpos < next) |
| 2634 next = startpos; | 2693 next = startpos; |
| 2635 } | 2694 } |
| 2636 | 2695 |
| 2637 for (tail = current_buffer->overlays_after; | 2696 for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2638 GC_CONSP (tail); | |
| 2639 tail = XCDR (tail)) | |
| 2640 { | 2697 { |
| 2641 int startpos, endpos; | 2698 int startpos, endpos; |
| 2642 | 2699 |
| 2643 overlay = XCAR (tail); | 2700 XSETMISC (overlay, tail); |
| 2644 | 2701 |
| 2645 ostart = OVERLAY_START (overlay); | 2702 ostart = OVERLAY_START (overlay); |
| 2646 oend = OVERLAY_END (overlay); | 2703 oend = OVERLAY_END (overlay); |
| 2647 startpos = OVERLAY_POSITION (ostart); | 2704 startpos = OVERLAY_POSITION (ostart); |
| 2648 if (end < startpos) | 2705 if (end < startpos) |
| 2724 /* Fast function to just test if we're at an overlay boundary. */ | 2781 /* Fast function to just test if we're at an overlay boundary. */ |
| 2725 int | 2782 int |
| 2726 overlay_touches_p (pos) | 2783 overlay_touches_p (pos) |
| 2727 int pos; | 2784 int pos; |
| 2728 { | 2785 { |
| 2729 Lisp_Object tail, overlay; | 2786 Lisp_Object overlay; |
| 2730 | 2787 struct Lisp_Overlay *tail; |
| 2731 for (tail = current_buffer->overlays_before; GC_CONSP (tail); | 2788 |
| 2732 tail = XCDR (tail)) | 2789 for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 2733 { | 2790 { |
| 2734 int endpos; | 2791 int endpos; |
| 2735 | 2792 |
| 2736 overlay = XCAR (tail); | 2793 XSETMISC (overlay ,tail); |
| 2737 if (!GC_OVERLAYP (overlay)) | 2794 if (!GC_OVERLAYP (overlay)) |
| 2738 abort (); | 2795 abort (); |
| 2739 | 2796 |
| 2740 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 2797 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 2741 if (endpos < pos) | 2798 if (endpos < pos) |
| 2742 break; | 2799 break; |
| 2743 if (endpos == pos || OVERLAY_POSITION (OVERLAY_START (overlay)) == pos) | 2800 if (endpos == pos || OVERLAY_POSITION (OVERLAY_START (overlay)) == pos) |
| 2744 return 1; | 2801 return 1; |
| 2745 } | 2802 } |
| 2746 | 2803 |
| 2747 for (tail = current_buffer->overlays_after; GC_CONSP (tail); | 2804 for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 2748 tail = XCDR (tail)) | |
| 2749 { | 2805 { |
| 2750 int startpos; | 2806 int startpos; |
| 2751 | 2807 |
| 2752 overlay = XCAR (tail); | 2808 XSETMISC (overlay, tail); |
| 2753 if (!GC_OVERLAYP (overlay)) | 2809 if (!GC_OVERLAYP (overlay)) |
| 2754 abort (); | 2810 abort (); |
| 2755 | 2811 |
| 2756 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 2812 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 2757 if (pos < startpos) | 2813 if (pos < startpos) |
| 2942 PSTR, if that variable is non-null. The string may be overwritten by | 2998 PSTR, if that variable is non-null. The string may be overwritten by |
| 2943 subsequent calls. */ | 2999 subsequent calls. */ |
| 2944 | 3000 |
| 2945 int | 3001 int |
| 2946 overlay_strings (pos, w, pstr) | 3002 overlay_strings (pos, w, pstr) |
| 2947 int pos; | 3003 EMACS_INT pos; |
| 2948 struct window *w; | 3004 struct window *w; |
| 2949 unsigned char **pstr; | 3005 unsigned char **pstr; |
| 2950 { | 3006 { |
| 2951 Lisp_Object ov, overlay, window, str; | 3007 Lisp_Object overlay, window, str; |
| 3008 struct Lisp_Overlay *ov; | |
| 2952 int startpos, endpos; | 3009 int startpos, endpos; |
| 2953 int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | 3010 int multibyte = ! NILP (current_buffer->enable_multibyte_characters); |
| 2954 | 3011 |
| 2955 overlay_heads.used = overlay_heads.bytes = 0; | 3012 overlay_heads.used = overlay_heads.bytes = 0; |
| 2956 overlay_tails.used = overlay_tails.bytes = 0; | 3013 overlay_tails.used = overlay_tails.bytes = 0; |
| 2957 for (ov = current_buffer->overlays_before; CONSP (ov); ov = XCDR (ov)) | 3014 for (ov = current_buffer->overlays_before; ov; ov = ov->next) |
| 2958 { | 3015 { |
| 2959 overlay = XCAR (ov); | 3016 XSETMISC (overlay, ov); |
| 2960 if (!OVERLAYP (overlay)) | 3017 eassert (OVERLAYP (overlay)); |
| 2961 abort (); | |
| 2962 | 3018 |
| 2963 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 3019 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 2964 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3020 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 2965 if (endpos < pos) | 3021 if (endpos < pos) |
| 2966 break; | 3022 break; |
| 2981 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str))) | 3037 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str))) |
| 2982 record_overlay_string (&overlay_tails, str, Qnil, | 3038 record_overlay_string (&overlay_tails, str, Qnil, |
| 2983 Foverlay_get (overlay, Qpriority), | 3039 Foverlay_get (overlay, Qpriority), |
| 2984 endpos - startpos); | 3040 endpos - startpos); |
| 2985 } | 3041 } |
| 2986 for (ov = current_buffer->overlays_after; CONSP (ov); ov = XCDR (ov)) | 3042 for (ov = current_buffer->overlays_after; ov; ov = ov->next) |
| 2987 { | 3043 { |
| 2988 overlay = XCAR (ov); | 3044 XSETMISC (overlay, ov); |
| 2989 if (!OVERLAYP (overlay)) | 3045 eassert (OVERLAYP (overlay)); |
| 2990 abort (); | |
| 2991 | 3046 |
| 2992 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 3047 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 2993 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3048 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 2994 if (startpos > pos) | 3049 if (startpos > pos) |
| 2995 break; | 3050 break; |
| 3070 /* Shift overlays in BUF's overlay lists, to center the lists at POS. */ | 3125 /* Shift overlays in BUF's overlay lists, to center the lists at POS. */ |
| 3071 | 3126 |
| 3072 void | 3127 void |
| 3073 recenter_overlay_lists (buf, pos) | 3128 recenter_overlay_lists (buf, pos) |
| 3074 struct buffer *buf; | 3129 struct buffer *buf; |
| 3075 int pos; | 3130 EMACS_INT pos; |
| 3076 { | 3131 { |
| 3077 Lisp_Object overlay, tail, next, prev, beg, end; | 3132 Lisp_Object overlay, beg, end; |
| 3133 struct Lisp_Overlay *prev, *tail, *next; | |
| 3078 | 3134 |
| 3079 /* See if anything in overlays_before should move to overlays_after. */ | 3135 /* See if anything in overlays_before should move to overlays_after. */ |
| 3080 | 3136 |
| 3081 /* We don't strictly need prev in this loop; it should always be nil. | 3137 /* We don't strictly need prev in this loop; it should always be nil. |
| 3082 But we use it for symmetry and in case that should cease to be true | 3138 But we use it for symmetry and in case that should cease to be true |
| 3083 with some future change. */ | 3139 with some future change. */ |
| 3084 prev = Qnil; | 3140 prev = NULL; |
| 3085 for (tail = buf->overlays_before; | 3141 for (tail = buf->overlays_before; tail; prev = tail, tail = next) |
| 3086 CONSP (tail); | 3142 { |
| 3087 prev = tail, tail = next) | 3143 next = tail->next; |
| 3088 { | 3144 XSETMISC (overlay, tail); |
| 3089 next = XCDR (tail); | |
| 3090 overlay = XCAR (tail); | |
| 3091 | 3145 |
| 3092 /* If the overlay is not valid, get rid of it. */ | 3146 /* If the overlay is not valid, get rid of it. */ |
| 3093 if (!OVERLAY_VALID (overlay)) | 3147 if (!OVERLAY_VALID (overlay)) |
| 3094 #if 1 | 3148 #if 1 |
| 3095 abort (); | 3149 abort (); |
| 3110 | 3164 |
| 3111 if (OVERLAY_POSITION (end) > pos) | 3165 if (OVERLAY_POSITION (end) > pos) |
| 3112 { | 3166 { |
| 3113 /* OVERLAY needs to be moved. */ | 3167 /* OVERLAY needs to be moved. */ |
| 3114 int where = OVERLAY_POSITION (beg); | 3168 int where = OVERLAY_POSITION (beg); |
| 3115 Lisp_Object other, other_prev; | 3169 struct Lisp_Overlay *other, *other_prev; |
| 3116 | 3170 |
| 3117 /* Splice the cons cell TAIL out of overlays_before. */ | 3171 /* Splice the cons cell TAIL out of overlays_before. */ |
| 3118 if (!NILP (prev)) | 3172 if (prev) |
| 3119 XSETCDR (prev, next); | 3173 prev->next = next; |
| 3120 else | 3174 else |
| 3121 buf->overlays_before = next; | 3175 buf->overlays_before = next; |
| 3122 | 3176 |
| 3123 /* Search thru overlays_after for where to put it. */ | 3177 /* Search thru overlays_after for where to put it. */ |
| 3124 other_prev = Qnil; | 3178 other_prev = NULL; |
| 3125 for (other = buf->overlays_after; | 3179 for (other = buf->overlays_after; other; |
| 3126 CONSP (other); | 3180 other_prev = other, other = other->next) |
| 3127 other_prev = other, other = XCDR (other)) | |
| 3128 { | 3181 { |
| 3129 Lisp_Object otherbeg, otheroverlay; | 3182 Lisp_Object otherbeg, otheroverlay; |
| 3130 | 3183 |
| 3131 otheroverlay = XCAR (other); | 3184 XSETMISC (otheroverlay, other); |
| 3132 if (! OVERLAY_VALID (otheroverlay)) | 3185 eassert (OVERLAY_VALID (otheroverlay)); |
| 3133 abort (); | |
| 3134 | 3186 |
| 3135 otherbeg = OVERLAY_START (otheroverlay); | 3187 otherbeg = OVERLAY_START (otheroverlay); |
| 3136 if (OVERLAY_POSITION (otherbeg) >= where) | 3188 if (OVERLAY_POSITION (otherbeg) >= where) |
| 3137 break; | 3189 break; |
| 3138 } | 3190 } |
| 3139 | 3191 |
| 3140 /* Add TAIL to overlays_after before OTHER. */ | 3192 /* Add TAIL to overlays_after before OTHER. */ |
| 3141 XSETCDR (tail, other); | 3193 tail->next = other; |
| 3142 if (!NILP (other_prev)) | 3194 if (other_prev) |
| 3143 XSETCDR (other_prev, tail); | 3195 other_prev->next = tail; |
| 3144 else | 3196 else |
| 3145 buf->overlays_after = tail; | 3197 buf->overlays_after = tail; |
| 3146 tail = prev; | 3198 tail = prev; |
| 3147 } | 3199 } |
| 3148 else | 3200 else |
| 3151 so stop now. */ | 3203 so stop now. */ |
| 3152 break; | 3204 break; |
| 3153 } | 3205 } |
| 3154 | 3206 |
| 3155 /* See if anything in overlays_after should be in overlays_before. */ | 3207 /* See if anything in overlays_after should be in overlays_before. */ |
| 3156 prev = Qnil; | 3208 prev = NULL; |
| 3157 for (tail = buf->overlays_after; | 3209 for (tail = buf->overlays_after; tail; prev = tail, tail = next) |
| 3158 CONSP (tail); | 3210 { |
| 3159 prev = tail, tail = next) | 3211 next = tail->next; |
| 3160 { | 3212 XSETMISC (overlay, tail); |
| 3161 next = XCDR (tail); | |
| 3162 overlay = XCAR (tail); | |
| 3163 | 3213 |
| 3164 /* If the overlay is not valid, get rid of it. */ | 3214 /* If the overlay is not valid, get rid of it. */ |
| 3165 if (!OVERLAY_VALID (overlay)) | 3215 if (!OVERLAY_VALID (overlay)) |
| 3166 #if 1 | 3216 #if 1 |
| 3167 abort (); | 3217 abort (); |
| 3187 | 3237 |
| 3188 if (OVERLAY_POSITION (end) <= pos) | 3238 if (OVERLAY_POSITION (end) <= pos) |
| 3189 { | 3239 { |
| 3190 /* OVERLAY needs to be moved. */ | 3240 /* OVERLAY needs to be moved. */ |
| 3191 int where = OVERLAY_POSITION (end); | 3241 int where = OVERLAY_POSITION (end); |
| 3192 Lisp_Object other, other_prev; | 3242 struct Lisp_Overlay *other, *other_prev; |
| 3193 | 3243 |
| 3194 /* Splice the cons cell TAIL out of overlays_after. */ | 3244 /* Splice the cons cell TAIL out of overlays_after. */ |
| 3195 if (!NILP (prev)) | 3245 if (prev) |
| 3196 XSETCDR (prev, next); | 3246 prev->next = next; |
| 3197 else | 3247 else |
| 3198 buf->overlays_after = next; | 3248 buf->overlays_after = next; |
| 3199 | 3249 |
| 3200 /* Search thru overlays_before for where to put it. */ | 3250 /* Search thru overlays_before for where to put it. */ |
| 3201 other_prev = Qnil; | 3251 other_prev = NULL; |
| 3202 for (other = buf->overlays_before; | 3252 for (other = buf->overlays_before; other; |
| 3203 CONSP (other); | 3253 other_prev = other, other = other->next) |
| 3204 other_prev = other, other = XCDR (other)) | |
| 3205 { | 3254 { |
| 3206 Lisp_Object otherend, otheroverlay; | 3255 Lisp_Object otherend, otheroverlay; |
| 3207 | 3256 |
| 3208 otheroverlay = XCAR (other); | 3257 XSETMISC (otheroverlay, other); |
| 3209 if (! OVERLAY_VALID (otheroverlay)) | 3258 eassert (OVERLAY_VALID (otheroverlay)); |
| 3210 abort (); | |
| 3211 | 3259 |
| 3212 otherend = OVERLAY_END (otheroverlay); | 3260 otherend = OVERLAY_END (otheroverlay); |
| 3213 if (OVERLAY_POSITION (otherend) <= where) | 3261 if (OVERLAY_POSITION (otherend) <= where) |
| 3214 break; | 3262 break; |
| 3215 } | 3263 } |
| 3216 | 3264 |
| 3217 /* Add TAIL to overlays_before before OTHER. */ | 3265 /* Add TAIL to overlays_before before OTHER. */ |
| 3218 XSETCDR (tail, other); | 3266 tail->next = other; |
| 3219 if (!NILP (other_prev)) | 3267 if (other_prev) |
| 3220 XSETCDR (other_prev, tail); | 3268 other_prev->next = tail; |
| 3221 else | 3269 else |
| 3222 buf->overlays_before = tail; | 3270 buf->overlays_before = tail; |
| 3223 tail = prev; | 3271 tail = prev; |
| 3224 } | 3272 } |
| 3225 } | 3273 } |
| 3226 | 3274 |
| 3227 XSETFASTINT (buf->overlay_center, pos); | 3275 buf->overlay_center = pos; |
| 3228 } | 3276 } |
| 3229 | 3277 |
| 3230 void | 3278 void |
| 3231 adjust_overlays_for_insert (pos, length) | 3279 adjust_overlays_for_insert (pos, length) |
| 3232 int pos; | 3280 EMACS_INT pos; |
| 3233 int length; | 3281 EMACS_INT length; |
| 3234 { | 3282 { |
| 3235 /* After an insertion, the lists are still sorted properly, | 3283 /* After an insertion, the lists are still sorted properly, |
| 3236 but we may need to update the value of the overlay center. */ | 3284 but we may need to update the value of the overlay center. */ |
| 3237 if (XFASTINT (current_buffer->overlay_center) >= pos) | 3285 if (current_buffer->overlay_center >= pos) |
| 3238 XSETFASTINT (current_buffer->overlay_center, | 3286 current_buffer->overlay_center += length; |
| 3239 XFASTINT (current_buffer->overlay_center) + length); | |
| 3240 } | 3287 } |
| 3241 | 3288 |
| 3242 void | 3289 void |
| 3243 adjust_overlays_for_delete (pos, length) | 3290 adjust_overlays_for_delete (pos, length) |
| 3244 int pos; | 3291 EMACS_INT pos; |
| 3245 int length; | 3292 EMACS_INT length; |
| 3246 { | 3293 { |
| 3247 if (XFASTINT (current_buffer->overlay_center) < pos) | 3294 if (current_buffer->overlay_center < pos) |
| 3248 /* The deletion was to our right. No change needed; the before- and | 3295 /* The deletion was to our right. No change needed; the before- and |
| 3249 after-lists are still consistent. */ | 3296 after-lists are still consistent. */ |
| 3250 ; | 3297 ; |
| 3251 else if (XFASTINT (current_buffer->overlay_center) > pos + length) | 3298 else if (current_buffer->overlay_center > pos + length) |
| 3252 /* The deletion was to our left. We need to adjust the center value | 3299 /* The deletion was to our left. We need to adjust the center value |
| 3253 to account for the change in position, but the lists are consistent | 3300 to account for the change in position, but the lists are consistent |
| 3254 given the new value. */ | 3301 given the new value. */ |
| 3255 XSETFASTINT (current_buffer->overlay_center, | 3302 current_buffer->overlay_center -= length; |
| 3256 XFASTINT (current_buffer->overlay_center) - length); | |
| 3257 else | 3303 else |
| 3258 /* We're right in the middle. There might be things on the after-list | 3304 /* We're right in the middle. There might be things on the after-list |
| 3259 that now belong on the before-list. Recentering will move them, | 3305 that now belong on the before-list. Recentering will move them, |
| 3260 and also update the center point. */ | 3306 and also update the center point. */ |
| 3261 recenter_overlay_lists (current_buffer, pos); | 3307 recenter_overlay_lists (current_buffer, pos); |
| 3264 /* Fix up overlays that were garbled as a result of permuting markers | 3310 /* Fix up overlays that were garbled as a result of permuting markers |
| 3265 in the range START through END. Any overlay with at least one | 3311 in the range START through END. Any overlay with at least one |
| 3266 endpoint in this range will need to be unlinked from the overlay | 3312 endpoint in this range will need to be unlinked from the overlay |
| 3267 list and reinserted in its proper place. | 3313 list and reinserted in its proper place. |
| 3268 Such an overlay might even have negative size at this point. | 3314 Such an overlay might even have negative size at this point. |
| 3269 If so, we'll reverse the endpoints. Can you think of anything | 3315 If so, we'll make the overlay empty. */ |
| 3270 better to do in this situation? */ | |
| 3271 void | 3316 void |
| 3272 fix_overlays_in_range (start, end) | 3317 fix_start_end_in_overlays (start, end) |
| 3273 register int start, end; | 3318 register int start, end; |
| 3274 { | 3319 { |
| 3275 Lisp_Object overlay; | 3320 Lisp_Object overlay; |
| 3276 Lisp_Object before_list, after_list; | 3321 struct Lisp_Overlay *before_list, *after_list; |
| 3277 /* These are either nil, indicating that before_list or after_list | 3322 /* These are either nil, indicating that before_list or after_list |
| 3278 should be assigned, or the cons cell the cdr of which should be | 3323 should be assigned, or the cons cell the cdr of which should be |
| 3279 assigned. */ | 3324 assigned. */ |
| 3280 Lisp_Object beforep = Qnil, afterp = Qnil; | 3325 struct Lisp_Overlay *beforep = NULL, *afterp = NULL; |
| 3281 /* 'Parent', likewise, indicates a cons cell or | 3326 /* 'Parent', likewise, indicates a cons cell or |
| 3282 current_buffer->overlays_before or overlays_after, depending | 3327 current_buffer->overlays_before or overlays_after, depending |
| 3283 which loop we're in. */ | 3328 which loop we're in. */ |
| 3284 Lisp_Object tail, parent; | 3329 struct Lisp_Overlay *tail, *parent; |
| 3285 int startpos, endpos; | 3330 int startpos, endpos; |
| 3286 | 3331 |
| 3287 /* This algorithm shifts links around instead of consing and GCing. | 3332 /* This algorithm shifts links around instead of consing and GCing. |
| 3288 The loop invariant is that before_list (resp. after_list) is a | 3333 The loop invariant is that before_list (resp. after_list) is a |
| 3289 well-formed list except that its last element, the CDR of beforep | 3334 well-formed list except that its last element, the CDR of beforep |
| 3290 (resp. afterp) if beforep (afterp) isn't nil or before_list | 3335 (resp. afterp) if beforep (afterp) isn't nil or before_list |
| 3291 (after_list) if it is, is still uninitialized. So it's not a bug | 3336 (after_list) if it is, is still uninitialized. So it's not a bug |
| 3292 that before_list isn't initialized, although it may look | 3337 that before_list isn't initialized, although it may look |
| 3293 strange. */ | 3338 strange. */ |
| 3294 for (parent = Qnil, tail = current_buffer->overlays_before; CONSP (tail);) | 3339 for (parent = NULL, tail = current_buffer->overlays_before; tail;) |
| 3295 { | 3340 { |
| 3296 overlay = XCAR (tail); | 3341 XSETMISC (overlay, tail); |
| 3342 | |
| 3297 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3343 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 3344 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | |
| 3345 | |
| 3346 /* If the overlay is backwards, make it empty. */ | |
| 3347 if (endpos < startpos) | |
| 3348 { | |
| 3349 startpos = endpos; | |
| 3350 Fset_marker (OVERLAY_START (overlay), make_number (startpos), | |
| 3351 Qnil); | |
| 3352 } | |
| 3353 | |
| 3298 if (endpos < start) | 3354 if (endpos < start) |
| 3299 break; | 3355 break; |
| 3300 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 3356 |
| 3301 if (endpos < end | 3357 if (endpos < end |
| 3302 || (startpos >= start && startpos < end)) | 3358 || (startpos >= start && startpos < end)) |
| 3303 { | 3359 { |
| 3304 /* If the overlay is backwards, fix that now. */ | |
| 3305 if (startpos > endpos) | |
| 3306 { | |
| 3307 int tem; | |
| 3308 Fset_marker (OVERLAY_START (overlay), make_number (endpos), | |
| 3309 Qnil); | |
| 3310 Fset_marker (OVERLAY_END (overlay), make_number (startpos), | |
| 3311 Qnil); | |
| 3312 tem = startpos; startpos = endpos; endpos = tem; | |
| 3313 } | |
| 3314 /* Add it to the end of the wrong list. Later on, | 3360 /* Add it to the end of the wrong list. Later on, |
| 3315 recenter_overlay_lists will move it to the right place. */ | 3361 recenter_overlay_lists will move it to the right place. */ |
| 3316 if (endpos < XINT (current_buffer->overlay_center)) | 3362 if (endpos < current_buffer->overlay_center) |
| 3317 { | 3363 { |
| 3318 if (NILP (afterp)) | 3364 if (!afterp) |
| 3319 after_list = tail; | 3365 after_list = tail; |
| 3320 else | 3366 else |
| 3321 XSETCDR (afterp, tail); | 3367 afterp->next = tail; |
| 3322 afterp = tail; | 3368 afterp = tail; |
| 3323 } | 3369 } |
| 3324 else | 3370 else |
| 3325 { | 3371 { |
| 3326 if (NILP (beforep)) | 3372 if (!beforep) |
| 3327 before_list = tail; | 3373 before_list = tail; |
| 3328 else | 3374 else |
| 3329 XSETCDR (beforep, tail); | 3375 beforep->next = tail; |
| 3330 beforep = tail; | 3376 beforep = tail; |
| 3331 } | 3377 } |
| 3332 if (NILP (parent)) | 3378 if (!parent) |
| 3333 current_buffer->overlays_before = XCDR (tail); | 3379 current_buffer->overlays_before = tail->next; |
| 3334 else | 3380 else |
| 3335 XSETCDR (parent, XCDR (tail)); | 3381 parent->next = tail->next; |
| 3336 tail = XCDR (tail); | 3382 tail = tail->next; |
| 3337 } | 3383 } |
| 3338 else | 3384 else |
| 3339 parent = tail, tail = XCDR (parent); | 3385 parent = tail, tail = parent->next; |
| 3340 } | 3386 } |
| 3341 for (parent = Qnil, tail = current_buffer->overlays_after; CONSP (tail);) | 3387 for (parent = NULL, tail = current_buffer->overlays_after; tail;) |
| 3342 { | 3388 { |
| 3343 overlay = XCAR (tail); | 3389 XSETMISC (overlay, tail); |
| 3390 | |
| 3344 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 3391 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 3392 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | |
| 3393 | |
| 3394 /* If the overlay is backwards, make it empty. */ | |
| 3395 if (endpos < startpos) | |
| 3396 { | |
| 3397 startpos = endpos; | |
| 3398 Fset_marker (OVERLAY_START (overlay), make_number (startpos), | |
| 3399 Qnil); | |
| 3400 } | |
| 3401 | |
| 3345 if (startpos >= end) | 3402 if (startpos >= end) |
| 3346 break; | 3403 break; |
| 3347 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 3404 |
| 3348 if (startpos >= start | 3405 if (startpos >= start |
| 3349 || (endpos >= start && endpos < end)) | 3406 || (endpos >= start && endpos < end)) |
| 3350 { | 3407 { |
| 3351 if (startpos > endpos) | 3408 if (endpos < current_buffer->overlay_center) |
| 3352 { | 3409 { |
| 3353 int tem; | 3410 if (!afterp) |
| 3354 Fset_marker (OVERLAY_START (overlay), make_number (endpos), | |
| 3355 Qnil); | |
| 3356 Fset_marker (OVERLAY_END (overlay), make_number (startpos), | |
| 3357 Qnil); | |
| 3358 tem = startpos; startpos = endpos; endpos = tem; | |
| 3359 } | |
| 3360 if (endpos < XINT (current_buffer->overlay_center)) | |
| 3361 { | |
| 3362 if (NILP (afterp)) | |
| 3363 after_list = tail; | 3411 after_list = tail; |
| 3364 else | 3412 else |
| 3365 XSETCDR (afterp, tail); | 3413 afterp->next = tail; |
| 3366 afterp = tail; | 3414 afterp = tail; |
| 3367 } | 3415 } |
| 3368 else | 3416 else |
| 3369 { | 3417 { |
| 3370 if (NILP (beforep)) | 3418 if (!beforep) |
| 3371 before_list = tail; | 3419 before_list = tail; |
| 3372 else | 3420 else |
| 3373 XSETCDR (beforep, tail); | 3421 beforep->next = tail; |
| 3374 beforep = tail; | 3422 beforep = tail; |
| 3375 } | 3423 } |
| 3376 if (NILP (parent)) | 3424 if (!parent) |
| 3377 current_buffer->overlays_after = XCDR (tail); | 3425 current_buffer->overlays_after = tail->next; |
| 3378 else | 3426 else |
| 3379 XSETCDR (parent, XCDR (tail)); | 3427 parent->next = tail->next; |
| 3380 tail = XCDR (tail); | 3428 tail = tail->next; |
| 3381 } | 3429 } |
| 3382 else | 3430 else |
| 3383 parent = tail, tail = XCDR (parent); | 3431 parent = tail, tail = parent->next; |
| 3384 } | 3432 } |
| 3385 | 3433 |
| 3386 /* Splice the constructed (wrong) lists into the buffer's lists, | 3434 /* Splice the constructed (wrong) lists into the buffer's lists, |
| 3387 and let the recenter function make it sane again. */ | 3435 and let the recenter function make it sane again. */ |
| 3388 if (!NILP (beforep)) | 3436 if (beforep) |
| 3389 { | 3437 { |
| 3390 XSETCDR (beforep, current_buffer->overlays_before); | 3438 beforep->next = current_buffer->overlays_before; |
| 3391 current_buffer->overlays_before = before_list; | 3439 current_buffer->overlays_before = before_list; |
| 3392 } | 3440 } |
| 3393 recenter_overlay_lists (current_buffer, | 3441 recenter_overlay_lists (current_buffer, current_buffer->overlay_center); |
| 3394 XINT (current_buffer->overlay_center)); | 3442 |
| 3395 | 3443 if (afterp) |
| 3396 if (!NILP (afterp)) | 3444 { |
| 3397 { | 3445 afterp->next = current_buffer->overlays_after; |
| 3398 XSETCDR (afterp, current_buffer->overlays_after); | |
| 3399 current_buffer->overlays_after = after_list; | 3446 current_buffer->overlays_after = after_list; |
| 3400 } | 3447 } |
| 3401 recenter_overlay_lists (current_buffer, | 3448 recenter_overlay_lists (current_buffer, current_buffer->overlay_center); |
| 3402 XINT (current_buffer->overlay_center)); | |
| 3403 } | 3449 } |
| 3404 | 3450 |
| 3405 /* We have two types of overlay: the one whose ending marker is | 3451 /* We have two types of overlay: the one whose ending marker is |
| 3406 after-insertion-marker (this is the usual case) and the one whose | 3452 after-insertion-marker (this is the usual case) and the one whose |
| 3407 ending marker is before-insertion-marker. When `overlays_before' | 3453 ending marker is before-insertion-marker. When `overlays_before' |
| 3415 was at PREV, and now is at POS. */ | 3461 was at PREV, and now is at POS. */ |
| 3416 | 3462 |
| 3417 void | 3463 void |
| 3418 fix_overlays_before (bp, prev, pos) | 3464 fix_overlays_before (bp, prev, pos) |
| 3419 struct buffer *bp; | 3465 struct buffer *bp; |
| 3420 int prev, pos; | 3466 EMACS_INT prev, pos; |
| 3421 { | 3467 { |
| 3422 /* If parent is nil, replace overlays_before; otherwise, XCDR(parent). */ | 3468 /* If parent is nil, replace overlays_before; otherwise, parent->next. */ |
| 3423 Lisp_Object tail = bp->overlays_before, parent = Qnil; | 3469 struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair; |
| 3424 Lisp_Object right_pair; | 3470 Lisp_Object tem; |
| 3425 int end; | 3471 EMACS_INT end; |
| 3426 | 3472 |
| 3427 /* After the insertion, the several overlays may be in incorrect | 3473 /* After the insertion, the several overlays may be in incorrect |
| 3428 order. The possibility is that, in the list `overlays_before', | 3474 order. The possibility is that, in the list `overlays_before', |
| 3429 an overlay which ends at POS appears after an overlay which ends | 3475 an overlay which ends at POS appears after an overlay which ends |
| 3430 at PREV. Since POS is greater than PREV, we must fix the | 3476 at PREV. Since POS is greater than PREV, we must fix the |
| 3433 | 3479 |
| 3434 /* At first, find a place where disordered overlays should be linked | 3480 /* At first, find a place where disordered overlays should be linked |
| 3435 in. It is where an overlay which end before POS exists. (i.e. an | 3481 in. It is where an overlay which end before POS exists. (i.e. an |
| 3436 overlay whose ending marker is after-insertion-marker if disorder | 3482 overlay whose ending marker is after-insertion-marker if disorder |
| 3437 exists). */ | 3483 exists). */ |
| 3438 while (!NILP (tail) | 3484 while (tail |
| 3439 && ((end = OVERLAY_POSITION (OVERLAY_END (XCAR (tail)))) | 3485 && (XSETMISC (tem, tail), |
| 3440 >= pos)) | 3486 (end = OVERLAY_POSITION (OVERLAY_END (tem))) >= pos)) |
| 3441 { | 3487 { |
| 3442 parent = tail; | 3488 parent = tail; |
| 3443 tail = XCDR (tail); | 3489 tail = tail->next; |
| 3444 } | 3490 } |
| 3445 | 3491 |
| 3446 /* If we don't find such an overlay, | 3492 /* If we don't find such an overlay, |
| 3447 or the found one ends before PREV, | 3493 or the found one ends before PREV, |
| 3448 or the found one is the last one in the list, | 3494 or the found one is the last one in the list, |
| 3449 we don't have to fix anything. */ | 3495 we don't have to fix anything. */ |
| 3450 if (NILP (tail) | 3496 if (!tail || end < prev || !tail->next) |
| 3451 || end < prev | |
| 3452 || NILP (XCDR (tail))) | |
| 3453 return; | 3497 return; |
| 3454 | 3498 |
| 3455 right_pair = parent; | 3499 right_pair = parent; |
| 3456 parent = tail; | 3500 parent = tail; |
| 3457 tail = XCDR (tail); | 3501 tail = tail->next; |
| 3458 | 3502 |
| 3459 /* Now, end position of overlays in the list TAIL should be before | 3503 /* Now, end position of overlays in the list TAIL should be before |
| 3460 or equal to PREV. In the loop, an overlay which ends at POS is | 3504 or equal to PREV. In the loop, an overlay which ends at POS is |
| 3461 moved ahead to the place indicated by the CDR of RIGHT_PAIR. If | 3505 moved ahead to the place indicated by the CDR of RIGHT_PAIR. If |
| 3462 we found an overlay which ends before PREV, the remaining | 3506 we found an overlay which ends before PREV, the remaining |
| 3463 overlays are in correct order. */ | 3507 overlays are in correct order. */ |
| 3464 while (!NILP (tail)) | 3508 while (tail) |
| 3465 { | 3509 { |
| 3466 end = OVERLAY_POSITION (OVERLAY_END (XCAR (tail))); | 3510 XSETMISC (tem, tail); |
| 3511 end = OVERLAY_POSITION (OVERLAY_END (tem)); | |
| 3467 | 3512 |
| 3468 if (end == pos) | 3513 if (end == pos) |
| 3469 { /* This overlay is disordered. */ | 3514 { /* This overlay is disordered. */ |
| 3470 Lisp_Object found = tail; | 3515 struct Lisp_Overlay *found = tail; |
| 3471 | 3516 |
| 3472 /* Unlink the found overlay. */ | 3517 /* Unlink the found overlay. */ |
| 3473 tail = XCDR (found); | 3518 tail = found->next; |
| 3474 XSETCDR (parent, tail); | 3519 parent->next = tail; |
| 3475 /* Move an overlay at RIGHT_PLACE to the next of the found one, | 3520 /* Move an overlay at RIGHT_PLACE to the next of the found one, |
| 3476 and link it into the right place. */ | 3521 and link it into the right place. */ |
| 3477 if (NILP (right_pair)) | 3522 if (!right_pair) |
| 3478 { | 3523 { |
| 3479 XSETCDR (found, bp->overlays_before); | 3524 found->next = bp->overlays_before; |
| 3480 bp->overlays_before = found; | 3525 bp->overlays_before = found; |
| 3481 } | 3526 } |
| 3482 else | 3527 else |
| 3483 { | 3528 { |
| 3484 XSETCDR (found, XCDR (right_pair)); | 3529 found->next = right_pair->next; |
| 3485 XSETCDR (right_pair, found); | 3530 right_pair->next = found; |
| 3486 } | 3531 } |
| 3487 } | 3532 } |
| 3488 else if (end == prev) | 3533 else if (end == prev) |
| 3489 { | 3534 { |
| 3490 parent = tail; | 3535 parent = tail; |
| 3491 tail = XCDR (tail); | 3536 tail = tail->next; |
| 3492 } | 3537 } |
| 3493 else /* No more disordered overlay. */ | 3538 else /* No more disordered overlay. */ |
| 3494 break; | 3539 break; |
| 3495 } | 3540 } |
| 3496 } | 3541 } |
| 3505 | 3550 |
| 3506 DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 5, 0, | 3551 DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 5, 0, |
| 3507 doc: /* Create a new overlay with range BEG to END in BUFFER. | 3552 doc: /* Create a new overlay with range BEG to END in BUFFER. |
| 3508 If omitted, BUFFER defaults to the current buffer. | 3553 If omitted, BUFFER defaults to the current buffer. |
| 3509 BEG and END may be integers or markers. | 3554 BEG and END may be integers or markers. |
| 3510 The fourth arg FRONT-ADVANCE, if non-nil, makes the | 3555 The fourth arg FRONT-ADVANCE, if non-nil, makes the marker |
| 3511 front delimiter advance when text is inserted there. | 3556 for the front of the overlay advance when text is inserted there |
| 3512 The fifth arg REAR-ADVANCE, if non-nil, makes the | 3557 (which means the text *is not* included in the overlay). |
| 3513 rear delimiter advance when text is inserted there. */) | 3558 The fifth arg REAR-ADVANCE, if non-nil, makes the marker |
| 3559 for the rear of the overlay advance when text is inserted there | |
| 3560 (which means the text *is* included in the overlay). */) | |
| 3514 (beg, end, buffer, front_advance, rear_advance) | 3561 (beg, end, buffer, front_advance, rear_advance) |
| 3515 Lisp_Object beg, end, buffer; | 3562 Lisp_Object beg, end, buffer; |
| 3516 Lisp_Object front_advance, rear_advance; | 3563 Lisp_Object front_advance, rear_advance; |
| 3517 { | 3564 { |
| 3518 Lisp_Object overlay; | 3565 Lisp_Object overlay; |
| 3551 overlay = allocate_misc (); | 3598 overlay = allocate_misc (); |
| 3552 XMISCTYPE (overlay) = Lisp_Misc_Overlay; | 3599 XMISCTYPE (overlay) = Lisp_Misc_Overlay; |
| 3553 XOVERLAY (overlay)->start = beg; | 3600 XOVERLAY (overlay)->start = beg; |
| 3554 XOVERLAY (overlay)->end = end; | 3601 XOVERLAY (overlay)->end = end; |
| 3555 XOVERLAY (overlay)->plist = Qnil; | 3602 XOVERLAY (overlay)->plist = Qnil; |
| 3603 XOVERLAY (overlay)->next = NULL; | |
| 3556 | 3604 |
| 3557 /* Put the new overlay on the wrong list. */ | 3605 /* Put the new overlay on the wrong list. */ |
| 3558 end = OVERLAY_END (overlay); | 3606 end = OVERLAY_END (overlay); |
| 3559 if (OVERLAY_POSITION (end) < XINT (b->overlay_center)) | 3607 if (OVERLAY_POSITION (end) < b->overlay_center) |
| 3560 b->overlays_after = Fcons (overlay, b->overlays_after); | 3608 { |
| 3609 if (b->overlays_after) | |
| 3610 XOVERLAY (overlay)->next = b->overlays_after; | |
| 3611 b->overlays_after = XOVERLAY (overlay); | |
| 3612 } | |
| 3561 else | 3613 else |
| 3562 b->overlays_before = Fcons (overlay, b->overlays_before); | 3614 { |
| 3615 if (b->overlays_before) | |
| 3616 XOVERLAY (overlay)->next = b->overlays_before; | |
| 3617 b->overlays_before = XOVERLAY (overlay); | |
| 3618 } | |
| 3563 | 3619 |
| 3564 /* This puts it in the right list, and in the right order. */ | 3620 /* This puts it in the right list, and in the right order. */ |
| 3565 recenter_overlay_lists (b, XINT (b->overlay_center)); | 3621 recenter_overlay_lists (b, b->overlay_center); |
| 3566 | 3622 |
| 3567 /* We don't need to redisplay the region covered by the overlay, because | 3623 /* We don't need to redisplay the region covered by the overlay, because |
| 3568 the overlay has no properties at the moment. */ | 3624 the overlay has no properties at the moment. */ |
| 3569 | 3625 |
| 3570 return overlay; | 3626 return overlay; |
| 3573 /* Mark a section of BUF as needing redisplay because of overlays changes. */ | 3629 /* Mark a section of BUF as needing redisplay because of overlays changes. */ |
| 3574 | 3630 |
| 3575 static void | 3631 static void |
| 3576 modify_overlay (buf, start, end) | 3632 modify_overlay (buf, start, end) |
| 3577 struct buffer *buf; | 3633 struct buffer *buf; |
| 3578 int start, end; | 3634 EMACS_INT start, end; |
| 3579 { | 3635 { |
| 3580 if (start > end) | 3636 if (start > end) |
| 3581 { | 3637 { |
| 3582 int temp = start; | 3638 int temp = start; |
| 3583 start = end; | 3639 start = end; |
| 3597 ++BUF_OVERLAY_MODIFF (buf); | 3653 ++BUF_OVERLAY_MODIFF (buf); |
| 3598 } | 3654 } |
| 3599 | 3655 |
| 3600 | 3656 |
| 3601 Lisp_Object Fdelete_overlay (); | 3657 Lisp_Object Fdelete_overlay (); |
| 3658 | |
| 3659 static struct Lisp_Overlay * | |
| 3660 unchain_overlay (list, overlay) | |
| 3661 struct Lisp_Overlay *list, *overlay; | |
| 3662 { | |
| 3663 struct Lisp_Overlay *tmp, *prev; | |
| 3664 for (tmp = list, prev = NULL; tmp; prev = tmp, tmp = tmp->next) | |
| 3665 if (tmp == overlay) | |
| 3666 { | |
| 3667 if (prev) | |
| 3668 prev->next = tmp->next; | |
| 3669 else | |
| 3670 list = tmp->next; | |
| 3671 overlay->next = NULL; | |
| 3672 break; | |
| 3673 } | |
| 3674 return list; | |
| 3675 } | |
| 3602 | 3676 |
| 3603 DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0, | 3677 DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0, |
| 3604 doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER. | 3678 doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER. |
| 3605 If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now. | 3679 If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now. |
| 3606 If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current | 3680 If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current |
| 3682 } | 3756 } |
| 3683 } | 3757 } |
| 3684 | 3758 |
| 3685 if (!NILP (obuffer)) | 3759 if (!NILP (obuffer)) |
| 3686 { | 3760 { |
| 3687 ob->overlays_before = Fdelq (overlay, ob->overlays_before); | 3761 ob->overlays_before |
| 3688 ob->overlays_after = Fdelq (overlay, ob->overlays_after); | 3762 = unchain_overlay (ob->overlays_before, XOVERLAY (overlay)); |
| 3763 ob->overlays_after | |
| 3764 = unchain_overlay (ob->overlays_after, XOVERLAY (overlay)); | |
| 3765 eassert (XOVERLAY (overlay)->next == NULL); | |
| 3689 } | 3766 } |
| 3690 | 3767 |
| 3691 Fset_marker (OVERLAY_START (overlay), beg, buffer); | 3768 Fset_marker (OVERLAY_START (overlay), beg, buffer); |
| 3692 Fset_marker (OVERLAY_END (overlay), end, buffer); | 3769 Fset_marker (OVERLAY_END (overlay), end, buffer); |
| 3693 | 3770 |
| 3694 /* Put the overlay on the wrong list. */ | 3771 /* Put the overlay on the wrong list. */ |
| 3695 end = OVERLAY_END (overlay); | 3772 end = OVERLAY_END (overlay); |
| 3696 if (OVERLAY_POSITION (end) < XINT (b->overlay_center)) | 3773 if (OVERLAY_POSITION (end) < b->overlay_center) |
| 3697 b->overlays_after = Fcons (overlay, b->overlays_after); | 3774 { |
| 3775 XOVERLAY (overlay)->next = b->overlays_after; | |
| 3776 b->overlays_after = XOVERLAY (overlay); | |
| 3777 } | |
| 3698 else | 3778 else |
| 3699 b->overlays_before = Fcons (overlay, b->overlays_before); | 3779 { |
| 3780 XOVERLAY (overlay)->next = b->overlays_before; | |
| 3781 b->overlays_before = XOVERLAY (overlay); | |
| 3782 } | |
| 3700 | 3783 |
| 3701 /* This puts it in the right list, and in the right order. */ | 3784 /* This puts it in the right list, and in the right order. */ |
| 3702 recenter_overlay_lists (b, XINT (b->overlay_center)); | 3785 recenter_overlay_lists (b, b->overlay_center); |
| 3703 | 3786 |
| 3704 return unbind_to (count, overlay); | 3787 return unbind_to (count, overlay); |
| 3705 } | 3788 } |
| 3706 | 3789 |
| 3707 DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0, | 3790 DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0, |
| 3720 return Qnil; | 3803 return Qnil; |
| 3721 | 3804 |
| 3722 b = XBUFFER (buffer); | 3805 b = XBUFFER (buffer); |
| 3723 specbind (Qinhibit_quit, Qt); | 3806 specbind (Qinhibit_quit, Qt); |
| 3724 | 3807 |
| 3725 b->overlays_before = Fdelq (overlay, b->overlays_before); | 3808 b->overlays_before = unchain_overlay (b->overlays_before,XOVERLAY (overlay)); |
| 3726 b->overlays_after = Fdelq (overlay, b->overlays_after); | 3809 b->overlays_after = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); |
| 3810 eassert (XOVERLAY (overlay)->next == NULL); | |
| 3727 modify_overlay (b, | 3811 modify_overlay (b, |
| 3728 marker_position (OVERLAY_START (overlay)), | 3812 marker_position (OVERLAY_START (overlay)), |
| 3729 marker_position (OVERLAY_END (overlay))); | 3813 marker_position (OVERLAY_END (overlay))); |
| 3730 Fset_marker (OVERLAY_START (overlay), Qnil, Qnil); | 3814 Fset_marker (OVERLAY_START (overlay), Qnil, Qnil); |
| 3731 Fset_marker (OVERLAY_END (overlay), Qnil, Qnil); | 3815 Fset_marker (OVERLAY_END (overlay), Qnil, Qnil); |
| 3763 | 3847 |
| 3764 return (Fmarker_position (OVERLAY_END (overlay))); | 3848 return (Fmarker_position (OVERLAY_END (overlay))); |
| 3765 } | 3849 } |
| 3766 | 3850 |
| 3767 DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0, | 3851 DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0, |
| 3768 doc: /* Return the buffer OVERLAY belongs to. */) | 3852 doc: /* Return the buffer OVERLAY belongs to. |
| 3853 Return nil if OVERLAY has been deleted. */) | |
| 3769 (overlay) | 3854 (overlay) |
| 3770 Lisp_Object overlay; | 3855 Lisp_Object overlay; |
| 3771 { | 3856 { |
| 3772 CHECK_OVERLAY (overlay); | 3857 CHECK_OVERLAY (overlay); |
| 3773 | 3858 |
| 3929 Recentering overlays moves overlays between these lists. | 4014 Recentering overlays moves overlays between these lists. |
| 3930 The lists you get are copies, so that changing them has no effect. | 4015 The lists you get are copies, so that changing them has no effect. |
| 3931 However, the overlays you get are the real objects that the buffer uses. */) | 4016 However, the overlays you get are the real objects that the buffer uses. */) |
| 3932 () | 4017 () |
| 3933 { | 4018 { |
| 3934 Lisp_Object before, after; | 4019 struct Lisp_Overlay *ol; |
| 3935 before = current_buffer->overlays_before; | 4020 Lisp_Object before = Qnil, after = Qnil, tmp; |
| 3936 if (CONSP (before)) | 4021 for (ol = current_buffer->overlays_before; ol; ol = ol->next) |
| 3937 before = Fcopy_sequence (before); | 4022 { |
| 3938 after = current_buffer->overlays_after; | 4023 XSETMISC (tmp, ol); |
| 3939 if (CONSP (after)) | 4024 before = Fcons (tmp, before); |
| 3940 after = Fcopy_sequence (after); | 4025 } |
| 3941 | 4026 for (ol = current_buffer->overlays_after; ol; ol = ol->next) |
| 3942 return Fcons (before, after); | 4027 { |
| 4028 XSETMISC (tmp, ol); | |
| 4029 after = Fcons (tmp, after); | |
| 4030 } | |
| 4031 return Fcons (Fnreverse (before), Fnreverse (after)); | |
| 3943 } | 4032 } |
| 3944 | 4033 |
| 3945 DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0, | 4034 DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0, |
| 3946 doc: /* Recenter the overlays of the current buffer around position POS. */) | 4035 doc: /* Recenter the overlays of the current buffer around position POS. |
| 4036 That makes overlay lookup faster for positions near POS (but perhaps slower | |
| 4037 for positions far away from POS). */) | |
| 3947 (pos) | 4038 (pos) |
| 3948 Lisp_Object pos; | 4039 Lisp_Object pos; |
| 3949 { | 4040 { |
| 3950 CHECK_NUMBER_COERCE_MARKER (pos); | 4041 CHECK_NUMBER_COERCE_MARKER (pos); |
| 3951 | 4042 |
| 4035 = Fmake_vector (make_number (oldsize * 2), Qnil); | 4126 = Fmake_vector (make_number (oldsize * 2), Qnil); |
| 4036 bcopy (XVECTOR (old)->contents, | 4127 bcopy (XVECTOR (old)->contents, |
| 4037 XVECTOR (last_overlay_modification_hooks)->contents, | 4128 XVECTOR (last_overlay_modification_hooks)->contents, |
| 4038 sizeof (Lisp_Object) * oldsize); | 4129 sizeof (Lisp_Object) * oldsize); |
| 4039 } | 4130 } |
| 4040 XVECTOR (last_overlay_modification_hooks)->contents[last_overlay_modification_hooks_used++] = functionlist; | 4131 AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = functionlist; |
| 4041 XVECTOR (last_overlay_modification_hooks)->contents[last_overlay_modification_hooks_used++] = overlay; | 4132 AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = overlay; |
| 4042 } | 4133 } |
| 4043 | 4134 |
| 4044 /* Run the modification-hooks of overlays that include | 4135 /* Run the modification-hooks of overlays that include |
| 4045 any part of the text in START to END. | 4136 any part of the text in START to END. |
| 4046 If this change is an insertion, also | 4137 If this change is an insertion, also |
| 4059 report_overlay_modification (start, end, after, arg1, arg2, arg3) | 4150 report_overlay_modification (start, end, after, arg1, arg2, arg3) |
| 4060 Lisp_Object start, end; | 4151 Lisp_Object start, end; |
| 4061 int after; | 4152 int after; |
| 4062 Lisp_Object arg1, arg2, arg3; | 4153 Lisp_Object arg1, arg2, arg3; |
| 4063 { | 4154 { |
| 4064 Lisp_Object prop, overlay, tail; | 4155 Lisp_Object prop, overlay; |
| 4156 struct Lisp_Overlay *tail; | |
| 4065 /* 1 if this change is an insertion. */ | 4157 /* 1 if this change is an insertion. */ |
| 4066 int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end)); | 4158 int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end)); |
| 4067 int tail_copied; | 4159 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
| 4068 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; | |
| 4069 | 4160 |
| 4070 overlay = Qnil; | 4161 overlay = Qnil; |
| 4071 tail = Qnil; | 4162 tail = NULL; |
| 4072 GCPRO5 (overlay, tail, arg1, arg2, arg3); | 4163 |
| 4073 | 4164 /* We used to run the functions as soon as we found them and only register |
| 4074 if (after) | 4165 them in last_overlay_modification_hooks for the purpose of the `after' |
| 4075 { | 4166 case. But running elisp code as we traverse the list of overlays is |
| 4076 /* Call the functions recorded in last_overlay_modification_hooks | 4167 painful because the list can be modified by the elisp code so we had to |
| 4077 rather than scanning the overlays again. | 4168 copy at several places. We now simply do a read-only traversal that |
| 4078 First copy the vector contents, in case some of these hooks | 4169 only collects the functions to run and we run them afterwards. It's |
| 4079 do subsequent modification of the buffer. */ | 4170 simpler, especially since all the code was already there. -stef */ |
| 4080 int size = last_overlay_modification_hooks_used; | 4171 |
| 4081 Lisp_Object *copy = (Lisp_Object *) alloca (size * sizeof (Lisp_Object)); | 4172 if (!after) |
| 4082 int i; | 4173 { |
| 4083 | 4174 /* We are being called before a change. |
| 4084 bcopy (XVECTOR (last_overlay_modification_hooks)->contents, | 4175 Scan the overlays to find the functions to call. */ |
| 4085 copy, size * sizeof (Lisp_Object)); | 4176 last_overlay_modification_hooks_used = 0; |
| 4086 gcpro1.var = copy; | 4177 for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 4087 gcpro1.nvars = size; | |
| 4088 | |
| 4089 for (i = 0; i < size;) | |
| 4090 { | 4178 { |
| 4091 Lisp_Object prop, overlay; | 4179 int startpos, endpos; |
| 4092 prop = copy[i++]; | 4180 Lisp_Object ostart, oend; |
| 4093 overlay = copy[i++]; | 4181 |
| 4094 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | 4182 XSETMISC (overlay, tail); |
| 4095 } | 4183 |
| 4096 UNGCPRO; | 4184 ostart = OVERLAY_START (overlay); |
| 4097 return; | 4185 oend = OVERLAY_END (overlay); |
| 4098 } | 4186 endpos = OVERLAY_POSITION (oend); |
| 4099 | 4187 if (XFASTINT (start) > endpos) |
| 4100 /* We are being called before a change. | 4188 break; |
| 4101 Scan the overlays to find the functions to call. */ | 4189 startpos = OVERLAY_POSITION (ostart); |
| 4102 last_overlay_modification_hooks_used = 0; | 4190 if (insertion && (XFASTINT (start) == startpos |
| 4103 tail_copied = 0; | 4191 || XFASTINT (end) == startpos)) |
| 4104 for (tail = current_buffer->overlays_before; | |
| 4105 CONSP (tail); | |
| 4106 tail = XCDR (tail)) | |
| 4107 { | |
| 4108 int startpos, endpos; | |
| 4109 Lisp_Object ostart, oend; | |
| 4110 | |
| 4111 overlay = XCAR (tail); | |
| 4112 | |
| 4113 ostart = OVERLAY_START (overlay); | |
| 4114 oend = OVERLAY_END (overlay); | |
| 4115 endpos = OVERLAY_POSITION (oend); | |
| 4116 if (XFASTINT (start) > endpos) | |
| 4117 break; | |
| 4118 startpos = OVERLAY_POSITION (ostart); | |
| 4119 if (insertion && (XFASTINT (start) == startpos | |
| 4120 || XFASTINT (end) == startpos)) | |
| 4121 { | |
| 4122 prop = Foverlay_get (overlay, Qinsert_in_front_hooks); | |
| 4123 if (!NILP (prop)) | |
| 4124 { | 4192 { |
| 4125 /* Copy TAIL in case the hook recenters the overlay lists. */ | 4193 prop = Foverlay_get (overlay, Qinsert_in_front_hooks); |
| 4126 if (!tail_copied) | 4194 if (!NILP (prop)) |
| 4127 tail = Fcopy_sequence (tail); | 4195 add_overlay_mod_hooklist (prop, overlay); |
| 4128 tail_copied = 1; | 4196 } |
| 4129 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | 4197 if (insertion && (XFASTINT (start) == endpos |
| 4198 || XFASTINT (end) == endpos)) | |
| 4199 { | |
| 4200 prop = Foverlay_get (overlay, Qinsert_behind_hooks); | |
| 4201 if (!NILP (prop)) | |
| 4202 add_overlay_mod_hooklist (prop, overlay); | |
| 4203 } | |
| 4204 /* Test for intersecting intervals. This does the right thing | |
| 4205 for both insertion and deletion. */ | |
| 4206 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos) | |
| 4207 { | |
| 4208 prop = Foverlay_get (overlay, Qmodification_hooks); | |
| 4209 if (!NILP (prop)) | |
| 4210 add_overlay_mod_hooklist (prop, overlay); | |
| 4130 } | 4211 } |
| 4131 } | 4212 } |
| 4132 if (insertion && (XFASTINT (start) == endpos | 4213 |
| 4133 || XFASTINT (end) == endpos)) | 4214 for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 4134 { | 4215 { |
| 4135 prop = Foverlay_get (overlay, Qinsert_behind_hooks); | 4216 int startpos, endpos; |
| 4136 if (!NILP (prop)) | 4217 Lisp_Object ostart, oend; |
| 4218 | |
| 4219 XSETMISC (overlay, tail); | |
| 4220 | |
| 4221 ostart = OVERLAY_START (overlay); | |
| 4222 oend = OVERLAY_END (overlay); | |
| 4223 startpos = OVERLAY_POSITION (ostart); | |
| 4224 endpos = OVERLAY_POSITION (oend); | |
| 4225 if (XFASTINT (end) < startpos) | |
| 4226 break; | |
| 4227 if (insertion && (XFASTINT (start) == startpos | |
| 4228 || XFASTINT (end) == startpos)) | |
| 4137 { | 4229 { |
| 4138 if (!tail_copied) | 4230 prop = Foverlay_get (overlay, Qinsert_in_front_hooks); |
| 4139 tail = Fcopy_sequence (tail); | 4231 if (!NILP (prop)) |
| 4140 tail_copied = 1; | 4232 add_overlay_mod_hooklist (prop, overlay); |
| 4141 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | 4233 } |
| 4234 if (insertion && (XFASTINT (start) == endpos | |
| 4235 || XFASTINT (end) == endpos)) | |
| 4236 { | |
| 4237 prop = Foverlay_get (overlay, Qinsert_behind_hooks); | |
| 4238 if (!NILP (prop)) | |
| 4239 add_overlay_mod_hooklist (prop, overlay); | |
| 4240 } | |
| 4241 /* Test for intersecting intervals. This does the right thing | |
| 4242 for both insertion and deletion. */ | |
| 4243 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos) | |
| 4244 { | |
| 4245 prop = Foverlay_get (overlay, Qmodification_hooks); | |
| 4246 if (!NILP (prop)) | |
| 4247 add_overlay_mod_hooklist (prop, overlay); | |
| 4142 } | 4248 } |
| 4143 } | 4249 } |
| 4144 /* Test for intersecting intervals. This does the right thing | 4250 } |
| 4145 for both insertion and deletion. */ | 4251 |
| 4146 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos) | 4252 GCPRO4 (overlay, arg1, arg2, arg3); |
| 4147 { | 4253 { |
| 4148 prop = Foverlay_get (overlay, Qmodification_hooks); | 4254 /* Call the functions recorded in last_overlay_modification_hooks. |
| 4149 if (!NILP (prop)) | 4255 First copy the vector contents, in case some of these hooks |
| 4150 { | 4256 do subsequent modification of the buffer. */ |
| 4151 if (!tail_copied) | 4257 int size = last_overlay_modification_hooks_used; |
| 4152 tail = Fcopy_sequence (tail); | 4258 Lisp_Object *copy = (Lisp_Object *) alloca (size * sizeof (Lisp_Object)); |
| 4153 tail_copied = 1; | 4259 int i; |
| 4154 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | 4260 |
| 4155 } | 4261 bcopy (XVECTOR (last_overlay_modification_hooks)->contents, |
| 4156 } | 4262 copy, size * sizeof (Lisp_Object)); |
| 4157 } | 4263 gcpro1.var = copy; |
| 4158 | 4264 gcpro1.nvars = size; |
| 4159 tail_copied = 0; | 4265 |
| 4160 for (tail = current_buffer->overlays_after; | 4266 for (i = 0; i < size;) |
| 4161 CONSP (tail); | 4267 { |
| 4162 tail = XCDR (tail)) | 4268 Lisp_Object prop, overlay; |
| 4163 { | 4269 prop = copy[i++]; |
| 4164 int startpos, endpos; | 4270 overlay = copy[i++]; |
| 4165 Lisp_Object ostart, oend; | 4271 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); |
| 4166 | 4272 } |
| 4167 overlay = XCAR (tail); | 4273 } |
| 4168 | |
| 4169 ostart = OVERLAY_START (overlay); | |
| 4170 oend = OVERLAY_END (overlay); | |
| 4171 startpos = OVERLAY_POSITION (ostart); | |
| 4172 endpos = OVERLAY_POSITION (oend); | |
| 4173 if (XFASTINT (end) < startpos) | |
| 4174 break; | |
| 4175 if (insertion && (XFASTINT (start) == startpos | |
| 4176 || XFASTINT (end) == startpos)) | |
| 4177 { | |
| 4178 prop = Foverlay_get (overlay, Qinsert_in_front_hooks); | |
| 4179 if (!NILP (prop)) | |
| 4180 { | |
| 4181 if (!tail_copied) | |
| 4182 tail = Fcopy_sequence (tail); | |
| 4183 tail_copied = 1; | |
| 4184 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | |
| 4185 } | |
| 4186 } | |
| 4187 if (insertion && (XFASTINT (start) == endpos | |
| 4188 || XFASTINT (end) == endpos)) | |
| 4189 { | |
| 4190 prop = Foverlay_get (overlay, Qinsert_behind_hooks); | |
| 4191 if (!NILP (prop)) | |
| 4192 { | |
| 4193 if (!tail_copied) | |
| 4194 tail = Fcopy_sequence (tail); | |
| 4195 tail_copied = 1; | |
| 4196 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | |
| 4197 } | |
| 4198 } | |
| 4199 /* Test for intersecting intervals. This does the right thing | |
| 4200 for both insertion and deletion. */ | |
| 4201 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos) | |
| 4202 { | |
| 4203 prop = Foverlay_get (overlay, Qmodification_hooks); | |
| 4204 if (!NILP (prop)) | |
| 4205 { | |
| 4206 if (!tail_copied) | |
| 4207 tail = Fcopy_sequence (tail); | |
| 4208 tail_copied = 1; | |
| 4209 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3); | |
| 4210 } | |
| 4211 } | |
| 4212 } | |
| 4213 | |
| 4214 UNGCPRO; | 4274 UNGCPRO; |
| 4215 } | 4275 } |
| 4216 | 4276 |
| 4217 static void | 4277 static void |
| 4218 call_overlay_mod_hooks (list, overlay, after, arg1, arg2, arg3) | 4278 call_overlay_mod_hooks (list, overlay, after, arg1, arg2, arg3) |
| 4221 Lisp_Object arg1, arg2, arg3; | 4281 Lisp_Object arg1, arg2, arg3; |
| 4222 { | 4282 { |
| 4223 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; | 4283 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
| 4224 | 4284 |
| 4225 GCPRO4 (list, arg1, arg2, arg3); | 4285 GCPRO4 (list, arg1, arg2, arg3); |
| 4226 if (! after) | |
| 4227 add_overlay_mod_hooklist (list, overlay); | |
| 4228 | 4286 |
| 4229 while (CONSP (list)) | 4287 while (CONSP (list)) |
| 4230 { | 4288 { |
| 4231 if (NILP (arg3)) | 4289 if (NILP (arg3)) |
| 4232 call4 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2); | 4290 call4 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2); |
| 4239 | 4297 |
| 4240 /* Delete any zero-sized overlays at position POS, if the `evaporate' | 4298 /* Delete any zero-sized overlays at position POS, if the `evaporate' |
| 4241 property is set. */ | 4299 property is set. */ |
| 4242 void | 4300 void |
| 4243 evaporate_overlays (pos) | 4301 evaporate_overlays (pos) |
| 4244 int pos; | 4302 EMACS_INT pos; |
| 4245 { | 4303 { |
| 4246 Lisp_Object tail, overlay, hit_list; | 4304 Lisp_Object overlay, hit_list; |
| 4305 struct Lisp_Overlay *tail; | |
| 4247 | 4306 |
| 4248 hit_list = Qnil; | 4307 hit_list = Qnil; |
| 4249 if (pos <= XFASTINT (current_buffer->overlay_center)) | 4308 if (pos <= current_buffer->overlay_center) |
| 4250 for (tail = current_buffer->overlays_before; CONSP (tail); | 4309 for (tail = current_buffer->overlays_before; tail; tail = tail->next) |
| 4251 tail = XCDR (tail)) | |
| 4252 { | 4310 { |
| 4253 int endpos; | 4311 int endpos; |
| 4254 overlay = XCAR (tail); | 4312 XSETMISC (overlay, tail); |
| 4255 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); | 4313 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 4256 if (endpos < pos) | 4314 if (endpos < pos) |
| 4257 break; | 4315 break; |
| 4258 if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos | 4316 if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos |
| 4259 && ! NILP (Foverlay_get (overlay, Qevaporate))) | 4317 && ! NILP (Foverlay_get (overlay, Qevaporate))) |
| 4260 hit_list = Fcons (overlay, hit_list); | 4318 hit_list = Fcons (overlay, hit_list); |
| 4261 } | 4319 } |
| 4262 else | 4320 else |
| 4263 for (tail = current_buffer->overlays_after; CONSP (tail); | 4321 for (tail = current_buffer->overlays_after; tail; tail = tail->next) |
| 4264 tail = XCDR (tail)) | |
| 4265 { | 4322 { |
| 4266 int startpos; | 4323 int startpos; |
| 4267 overlay = XCAR (tail); | 4324 XSETMISC (overlay, tail); |
| 4268 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); | 4325 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 4269 if (startpos > pos) | 4326 if (startpos > pos) |
| 4270 break; | 4327 break; |
| 4271 if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos | 4328 if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos |
| 4272 && ! NILP (Foverlay_get (overlay, Qevaporate))) | 4329 && ! NILP (Foverlay_get (overlay, Qevaporate))) |
| 4902 buffer_defaults.abbrev_table = Qnil; | 4959 buffer_defaults.abbrev_table = Qnil; |
| 4903 buffer_defaults.display_table = Qnil; | 4960 buffer_defaults.display_table = Qnil; |
| 4904 buffer_defaults.undo_list = Qnil; | 4961 buffer_defaults.undo_list = Qnil; |
| 4905 buffer_defaults.mark_active = Qnil; | 4962 buffer_defaults.mark_active = Qnil; |
| 4906 buffer_defaults.file_format = Qnil; | 4963 buffer_defaults.file_format = Qnil; |
| 4907 buffer_defaults.overlays_before = Qnil; | 4964 buffer_defaults.auto_save_file_format = Qt; |
| 4908 buffer_defaults.overlays_after = Qnil; | 4965 buffer_defaults.overlays_before = NULL; |
| 4909 XSETFASTINT (buffer_defaults.overlay_center, BEG); | 4966 buffer_defaults.overlays_after = NULL; |
| 4967 buffer_defaults.overlay_center = BEG; | |
| 4910 | 4968 |
| 4911 XSETFASTINT (buffer_defaults.tab_width, 8); | 4969 XSETFASTINT (buffer_defaults.tab_width, 8); |
| 4912 buffer_defaults.truncate_lines = Qnil; | 4970 buffer_defaults.truncate_lines = Qnil; |
| 4913 buffer_defaults.ctl_arrow = Qt; | 4971 buffer_defaults.ctl_arrow = Qt; |
| 4914 buffer_defaults.direction_reversed = Qnil; | 4972 buffer_defaults.direction_reversed = Qnil; |
| 4915 buffer_defaults.cursor_type = Qt; | 4973 buffer_defaults.cursor_type = Qt; |
| 4916 buffer_defaults.extra_line_spacing = Qnil; | 4974 buffer_defaults.extra_line_spacing = Qnil; |
| 4975 buffer_defaults.cursor_in_non_selected_windows = Qt; | |
| 4917 | 4976 |
| 4918 #ifdef DOS_NT | 4977 #ifdef DOS_NT |
| 4919 buffer_defaults.buffer_file_type = Qnil; /* TEXT */ | 4978 buffer_defaults.buffer_file_type = Qnil; /* TEXT */ |
| 4920 #endif | 4979 #endif |
| 4921 buffer_defaults.enable_multibyte_characters = Qt; | 4980 buffer_defaults.enable_multibyte_characters = Qt; |
| 4923 XSETFASTINT (buffer_defaults.fill_column, 70); | 4982 XSETFASTINT (buffer_defaults.fill_column, 70); |
| 4924 XSETFASTINT (buffer_defaults.left_margin, 0); | 4983 XSETFASTINT (buffer_defaults.left_margin, 0); |
| 4925 buffer_defaults.cache_long_line_scans = Qnil; | 4984 buffer_defaults.cache_long_line_scans = Qnil; |
| 4926 buffer_defaults.file_truename = Qnil; | 4985 buffer_defaults.file_truename = Qnil; |
| 4927 XSETFASTINT (buffer_defaults.display_count, 0); | 4986 XSETFASTINT (buffer_defaults.display_count, 0); |
| 4987 XSETFASTINT (buffer_defaults.left_margin_cols, 0); | |
| 4988 XSETFASTINT (buffer_defaults.right_margin_cols, 0); | |
| 4989 buffer_defaults.left_fringe_width = Qnil; | |
| 4990 buffer_defaults.right_fringe_width = Qnil; | |
| 4991 buffer_defaults.fringes_outside_margins = Qnil; | |
| 4992 buffer_defaults.scroll_bar_width = Qnil; | |
| 4993 buffer_defaults.vertical_scroll_bar_type = Qt; | |
| 4928 buffer_defaults.indicate_empty_lines = Qnil; | 4994 buffer_defaults.indicate_empty_lines = Qnil; |
| 4995 buffer_defaults.indicate_buffer_boundaries = Qnil; | |
| 4929 buffer_defaults.scroll_up_aggressively = Qnil; | 4996 buffer_defaults.scroll_up_aggressively = Qnil; |
| 4930 buffer_defaults.scroll_down_aggressively = Qnil; | 4997 buffer_defaults.scroll_down_aggressively = Qnil; |
| 4931 buffer_defaults.display_time = Qnil; | 4998 buffer_defaults.display_time = Qnil; |
| 4932 | 4999 |
| 4933 /* Assign the local-flags to the slots that have default values. | 5000 /* Assign the local-flags to the slots that have default values. |
| 4952 XSETINT (buffer_local_flags.mark_active, -1); | 5019 XSETINT (buffer_local_flags.mark_active, -1); |
| 4953 XSETINT (buffer_local_flags.point_before_scroll, -1); | 5020 XSETINT (buffer_local_flags.point_before_scroll, -1); |
| 4954 XSETINT (buffer_local_flags.file_truename, -1); | 5021 XSETINT (buffer_local_flags.file_truename, -1); |
| 4955 XSETINT (buffer_local_flags.invisibility_spec, -1); | 5022 XSETINT (buffer_local_flags.invisibility_spec, -1); |
| 4956 XSETINT (buffer_local_flags.file_format, -1); | 5023 XSETINT (buffer_local_flags.file_format, -1); |
| 5024 XSETINT (buffer_local_flags.auto_save_file_format, -1); | |
| 4957 XSETINT (buffer_local_flags.display_count, -1); | 5025 XSETINT (buffer_local_flags.display_count, -1); |
| 4958 XSETINT (buffer_local_flags.display_time, -1); | 5026 XSETINT (buffer_local_flags.display_time, -1); |
| 4959 XSETINT (buffer_local_flags.enable_multibyte_characters, -1); | 5027 XSETINT (buffer_local_flags.enable_multibyte_characters, -1); |
| 4960 | 5028 |
| 4961 idx = 1; | 5029 idx = 1; |
| 4985 XSETFASTINT (buffer_local_flags.category_table, idx); ++idx; | 5053 XSETFASTINT (buffer_local_flags.category_table, idx); ++idx; |
| 4986 XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx; | 5054 XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx; |
| 4987 XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx); | 5055 XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx); |
| 4988 /* Make this one a permanent local. */ | 5056 /* Make this one a permanent local. */ |
| 4989 buffer_permanent_local_flags[idx++] = 1; | 5057 buffer_permanent_local_flags[idx++] = 1; |
| 4990 XSETFASTINT (buffer_local_flags.left_margin_width, idx); ++idx; | 5058 XSETFASTINT (buffer_local_flags.left_margin_cols, idx); ++idx; |
| 4991 XSETFASTINT (buffer_local_flags.right_margin_width, idx); ++idx; | 5059 XSETFASTINT (buffer_local_flags.right_margin_cols, idx); ++idx; |
| 5060 XSETFASTINT (buffer_local_flags.left_fringe_width, idx); ++idx; | |
| 5061 XSETFASTINT (buffer_local_flags.right_fringe_width, idx); ++idx; | |
| 5062 XSETFASTINT (buffer_local_flags.fringes_outside_margins, idx); ++idx; | |
| 5063 XSETFASTINT (buffer_local_flags.scroll_bar_width, idx); ++idx; | |
| 5064 XSETFASTINT (buffer_local_flags.vertical_scroll_bar_type, idx); ++idx; | |
| 4992 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx; | 5065 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx; |
| 5066 XSETFASTINT (buffer_local_flags.indicate_buffer_boundaries, idx); ++idx; | |
| 4993 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx; | 5067 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx; |
| 4994 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx; | 5068 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx; |
| 4995 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx; | 5069 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx; |
| 4996 XSETFASTINT (buffer_local_flags.cursor_type, idx); ++idx; | 5070 XSETFASTINT (buffer_local_flags.cursor_type, idx); ++idx; |
| 4997 XSETFASTINT (buffer_local_flags.extra_line_spacing, idx); ++idx; | 5071 XSETFASTINT (buffer_local_flags.extra_line_spacing, idx); ++idx; |
| 5072 XSETFASTINT (buffer_local_flags.cursor_in_non_selected_windows, idx); ++idx; | |
| 4998 | 5073 |
| 4999 /* Need more room? */ | 5074 /* Need more room? */ |
| 5000 if (idx >= MAX_PER_BUFFER_VARS) | 5075 if (idx >= MAX_PER_BUFFER_VARS) |
| 5001 abort (); | 5076 abort (); |
| 5002 last_per_buffer_idx = idx; | 5077 last_per_buffer_idx = idx; |
| 5015 Qprotected_field = intern ("protected-field"); | 5090 Qprotected_field = intern ("protected-field"); |
| 5016 | 5091 |
| 5017 Qpermanent_local = intern ("permanent-local"); | 5092 Qpermanent_local = intern ("permanent-local"); |
| 5018 | 5093 |
| 5019 Qkill_buffer_hook = intern ("kill-buffer-hook"); | 5094 Qkill_buffer_hook = intern ("kill-buffer-hook"); |
| 5095 Fput (Qkill_buffer_hook, Qpermanent_local, Qt); | |
| 5020 | 5096 |
| 5021 Qucs_set_table_for_input = intern ("ucs-set-table-for-input"); | 5097 Qucs_set_table_for_input = intern ("ucs-set-table-for-input"); |
| 5022 | 5098 |
| 5023 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1")); | 5099 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1")); |
| 5024 | 5100 |
| 5031 } | 5107 } |
| 5032 | 5108 |
| 5033 void | 5109 void |
| 5034 init_buffer () | 5110 init_buffer () |
| 5035 { | 5111 { |
| 5036 char buf[MAXPATHLEN + 1]; | |
| 5037 char *pwd; | 5112 char *pwd; |
| 5038 struct stat dotstat, pwdstat; | |
| 5039 Lisp_Object temp; | 5113 Lisp_Object temp; |
| 5040 int rc; | 5114 int len; |
| 5041 | 5115 |
| 5042 #ifdef USE_MMAP_FOR_BUFFERS | 5116 #ifdef USE_MMAP_FOR_BUFFERS |
| 5043 { | 5117 { |
| 5044 /* When using the ralloc implementation based on mmap(2), buffer | 5118 /* When using the ralloc implementation based on mmap(2), buffer |
| 5045 text pointers will have been set to null in the dumped Emacs. | 5119 text pointers will have been set to null in the dumped Emacs. |
| 5054 | 5128 |
| 5055 Fset_buffer (Fget_buffer_create (build_string ("*scratch*"))); | 5129 Fset_buffer (Fget_buffer_create (build_string ("*scratch*"))); |
| 5056 if (NILP (buffer_defaults.enable_multibyte_characters)) | 5130 if (NILP (buffer_defaults.enable_multibyte_characters)) |
| 5057 Fset_buffer_multibyte (Qnil); | 5131 Fset_buffer_multibyte (Qnil); |
| 5058 | 5132 |
| 5059 /* If PWD is accurate, use it instead of calling getwd. PWD is | 5133 pwd = get_current_dir_name (); |
| 5060 sometimes a nicer name, and using it may avoid a fatal error if a | 5134 |
| 5061 parent directory is searchable but not readable. */ | 5135 if (!pwd) |
| 5062 if ((pwd = getenv ("PWD")) != 0 | 5136 fatal ("`get_current_dir_name' failed: %s\n", strerror (errno)); |
| 5063 && (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1]))) | |
| 5064 && stat (pwd, &pwdstat) == 0 | |
| 5065 && stat (".", &dotstat) == 0 | |
| 5066 && dotstat.st_ino == pwdstat.st_ino | |
| 5067 && dotstat.st_dev == pwdstat.st_dev | |
| 5068 && strlen (pwd) < MAXPATHLEN) | |
| 5069 strcpy (buf, pwd); | |
| 5070 #ifdef HAVE_GETCWD | |
| 5071 else if (getcwd (buf, MAXPATHLEN+1) == 0) | |
| 5072 fatal ("`getcwd' failed: %s\n", strerror (errno)); | |
| 5073 #else | |
| 5074 else if (getwd (buf) == 0) | |
| 5075 fatal ("`getwd' failed: %s\n", buf); | |
| 5076 #endif | |
| 5077 | 5137 |
| 5078 #ifndef VMS | 5138 #ifndef VMS |
| 5079 /* Maybe this should really use some standard subroutine | 5139 /* Maybe this should really use some standard subroutine |
| 5080 whose definition is filename syntax dependent. */ | 5140 whose definition is filename syntax dependent. */ |
| 5081 rc = strlen (buf); | 5141 len = strlen (pwd); |
| 5082 if (!(IS_DIRECTORY_SEP (buf[rc - 1]))) | 5142 if (!(IS_DIRECTORY_SEP (pwd[len - 1]))) |
| 5083 { | 5143 { |
| 5084 buf[rc] = DIRECTORY_SEP; | 5144 /* Grow buffer to add directory separator and '\0'. */ |
| 5085 buf[rc + 1] = '\0'; | 5145 pwd = (char *) xrealloc (pwd, len + 2); |
| 5146 pwd[len] = DIRECTORY_SEP; | |
| 5147 pwd[len + 1] = '\0'; | |
| 5086 } | 5148 } |
| 5087 #endif /* not VMS */ | 5149 #endif /* not VMS */ |
| 5088 | 5150 |
| 5089 current_buffer->directory = build_string (buf); | 5151 current_buffer->directory = make_unibyte_string (pwd, strlen (pwd)); |
| 5152 if (! NILP (buffer_defaults.enable_multibyte_characters)) | |
| 5153 /* At this moment, we still don't know how to decode the | |
| 5154 directory name. So, we keep the bytes in multibyte form so | |
| 5155 that ENCODE_FILE correctly gets the original bytes. */ | |
| 5156 current_buffer->directory | |
| 5157 = string_to_multibyte (current_buffer->directory); | |
| 5090 | 5158 |
| 5091 /* Add /: to the front of the name | 5159 /* Add /: to the front of the name |
| 5092 if it would otherwise be treated as magic. */ | 5160 if it would otherwise be treated as magic. */ |
| 5093 temp = Ffind_file_name_handler (current_buffer->directory, Qt); | 5161 temp = Ffind_file_name_handler (current_buffer->directory, Qt); |
| 5094 if (! NILP (temp) | 5162 if (! NILP (temp) |
| 5100 current_buffer->directory | 5168 current_buffer->directory |
| 5101 = concat2 (build_string ("/:"), current_buffer->directory); | 5169 = concat2 (build_string ("/:"), current_buffer->directory); |
| 5102 | 5170 |
| 5103 temp = get_minibuffer (0); | 5171 temp = get_minibuffer (0); |
| 5104 XBUFFER (temp)->directory = current_buffer->directory; | 5172 XBUFFER (temp)->directory = current_buffer->directory; |
| 5173 | |
| 5174 free (pwd); | |
| 5105 } | 5175 } |
| 5106 | 5176 |
| 5107 /* initialize the buffer routines */ | 5177 /* initialize the buffer routines */ |
| 5108 void | 5178 void |
| 5109 syms_of_buffer () | 5179 syms_of_buffer () |
| 5147 staticpro (&Qbefore_change_functions); | 5217 staticpro (&Qbefore_change_functions); |
| 5148 Qafter_change_functions = intern ("after-change-functions"); | 5218 Qafter_change_functions = intern ("after-change-functions"); |
| 5149 staticpro (&Qafter_change_functions); | 5219 staticpro (&Qafter_change_functions); |
| 5150 staticpro (&Qucs_set_table_for_input); | 5220 staticpro (&Qucs_set_table_for_input); |
| 5151 | 5221 |
| 5222 Qkill_buffer_query_functions = intern ("kill-buffer-query-functions"); | |
| 5223 staticpro (&Qkill_buffer_query_functions); | |
| 5224 | |
| 5152 Fput (Qprotected_field, Qerror_conditions, | 5225 Fput (Qprotected_field, Qerror_conditions, |
| 5153 Fcons (Qprotected_field, Fcons (Qerror, Qnil))); | 5226 Fcons (Qprotected_field, Fcons (Qerror, Qnil))); |
| 5154 Fput (Qprotected_field, Qerror_message, | 5227 Fput (Qprotected_field, Qerror_message, |
| 5155 build_string ("Attempt to modify a protected field")); | 5228 build_string ("Attempt to modify a protected field")); |
| 5156 | 5229 |
| 5174 DEFVAR_LISP_NOPRO ("default-line-spacing", | 5247 DEFVAR_LISP_NOPRO ("default-line-spacing", |
| 5175 &buffer_defaults.extra_line_spacing, | 5248 &buffer_defaults.extra_line_spacing, |
| 5176 doc: /* Default value of `line-spacing' for buffers that don't override it. | 5249 doc: /* Default value of `line-spacing' for buffers that don't override it. |
| 5177 This is the same as (default-value 'line-spacing). */); | 5250 This is the same as (default-value 'line-spacing). */); |
| 5178 | 5251 |
| 5252 DEFVAR_LISP_NOPRO ("default-cursor-in-non-selected-windows", | |
| 5253 &buffer_defaults.cursor_in_non_selected_windows, | |
| 5254 doc: /* Default value of `cursor-in-non-selected-windows'. | |
| 5255 This is the same as (default-value 'cursor-in-non-selected-windows). */); | |
| 5256 | |
| 5179 DEFVAR_LISP_NOPRO ("default-abbrev-mode", | 5257 DEFVAR_LISP_NOPRO ("default-abbrev-mode", |
| 5180 &buffer_defaults.abbrev_mode, | 5258 &buffer_defaults.abbrev_mode, |
| 5181 doc: /* Default value of `abbrev-mode' for buffers that do not override it. | 5259 doc: /* Default value of `abbrev-mode' for buffers that do not override it. |
| 5182 This is the same as (default-value 'abbrev-mode). */); | 5260 This is the same as (default-value 'abbrev-mode). */); |
| 5183 | 5261 |
| 5184 DEFVAR_LISP_NOPRO ("default-ctl-arrow", | 5262 DEFVAR_LISP_NOPRO ("default-ctl-arrow", |
| 5185 &buffer_defaults.ctl_arrow, | 5263 &buffer_defaults.ctl_arrow, |
| 5186 doc: /* Default value of `ctl-arrow' for buffers that do not override it. | 5264 doc: /* Default value of `ctl-arrow' for buffers that do not override it. |
| 5187 This is the same as (default-value 'ctl-arrow). */); | 5265 This is the same as (default-value 'ctl-arrow). */); |
| 5188 | 5266 |
| 5189 DEFVAR_LISP_NOPRO ("default-direction-reversed", | 5267 DEFVAR_LISP_NOPRO ("default-direction-reversed", |
| 5190 &buffer_defaults.direction_reversed, | 5268 &buffer_defaults.direction_reversed, |
| 5191 doc: /* Default value of `direction_reversed' for buffers that do not override it. | 5269 doc: /* Default value of `direction-reversed' for buffers that do not override it. |
| 5192 This is the same as (default-value 'direction-reversed). */); | 5270 This is the same as (default-value 'direction-reversed). */); |
| 5193 | 5271 |
| 5194 DEFVAR_LISP_NOPRO ("default-enable-multibyte-characters", | 5272 DEFVAR_LISP_NOPRO ("default-enable-multibyte-characters", |
| 5195 &buffer_defaults.enable_multibyte_characters, | 5273 &buffer_defaults.enable_multibyte_characters, |
| 5196 doc: /* *Default value of `enable-multibyte-characters' for buffers not overriding it. | 5274 doc: /* *Default value of `enable-multibyte-characters' for buffers not overriding it. |
| 5197 This is the same as (default-value 'enable-multibyte-characters). */); | 5275 This is the same as (default-value 'enable-multibyte-characters). */); |
| 5198 | 5276 |
| 5199 DEFVAR_LISP_NOPRO ("default-buffer-file-coding-system", | 5277 DEFVAR_LISP_NOPRO ("default-buffer-file-coding-system", |
| 5200 &buffer_defaults.buffer_file_coding_system, | 5278 &buffer_defaults.buffer_file_coding_system, |
| 5201 doc: /* Default value of `buffer-file-coding-system' for buffers not overriding it. | 5279 doc: /* Default value of `buffer-file-coding-system' for buffers not overriding it. |
| 5202 This is the same as (default-value 'buffer-file-coding-system). */); | 5280 This is the same as (default-value 'buffer-file-coding-system). */); |
| 5203 | 5281 |
| 5204 DEFVAR_LISP_NOPRO ("default-truncate-lines", | 5282 DEFVAR_LISP_NOPRO ("default-truncate-lines", |
| 5205 &buffer_defaults.truncate_lines, | 5283 &buffer_defaults.truncate_lines, |
| 5206 doc: /* Default value of `truncate-lines' for buffers that do not override it. | 5284 doc: /* Default value of `truncate-lines' for buffers that do not override it. |
| 5233 This is the same as (default-value 'buffer-file-type). | 5311 This is the same as (default-value 'buffer-file-type). |
| 5234 The file type is nil for text, t for binary. */); | 5312 The file type is nil for text, t for binary. */); |
| 5235 #endif | 5313 #endif |
| 5236 | 5314 |
| 5237 DEFVAR_LISP_NOPRO ("default-left-margin-width", | 5315 DEFVAR_LISP_NOPRO ("default-left-margin-width", |
| 5238 &buffer_defaults.left_margin_width, | 5316 &buffer_defaults.left_margin_cols, |
| 5239 doc: /* Default value of `left-margin-width' for buffers that don't override it. | 5317 doc: /* Default value of `left-margin-width' for buffers that don't override it. |
| 5240 This is the same as (default-value 'left-margin-width). */); | 5318 This is the same as (default-value 'left-margin-width). */); |
| 5241 | 5319 |
| 5242 DEFVAR_LISP_NOPRO ("default-right-margin-width", | 5320 DEFVAR_LISP_NOPRO ("default-right-margin-width", |
| 5243 &buffer_defaults.right_margin_width, | 5321 &buffer_defaults.right_margin_cols, |
| 5244 doc: /* Default value of `right_margin_width' for buffers that don't override it. | 5322 doc: /* Default value of `right-margin-width' for buffers that don't override it. |
| 5245 This is the same as (default-value 'right-margin-width). */); | 5323 This is the same as (default-value 'right-margin-width). */); |
| 5324 | |
| 5325 DEFVAR_LISP_NOPRO ("default-left-fringe-width", | |
| 5326 &buffer_defaults.left_fringe_width, | |
| 5327 doc: /* Default value of `left-fringe-width' for buffers that don't override it. | |
| 5328 This is the same as (default-value 'left-fringe-width). */); | |
| 5329 | |
| 5330 DEFVAR_LISP_NOPRO ("default-right-fringe-width", | |
| 5331 &buffer_defaults.right_fringe_width, | |
| 5332 doc: /* Default value of `right-fringe-width' for buffers that don't override it. | |
| 5333 This is the same as (default-value 'right-fringe-width). */); | |
| 5334 | |
| 5335 DEFVAR_LISP_NOPRO ("default-fringes-outside-margins", | |
| 5336 &buffer_defaults.fringes_outside_margins, | |
| 5337 doc: /* Default value of `fringes-outside-margins' for buffers that don't override it. | |
| 5338 This is the same as (default-value 'fringes-outside-margins). */); | |
| 5339 | |
| 5340 DEFVAR_LISP_NOPRO ("default-scroll-bar-width", | |
| 5341 &buffer_defaults.scroll_bar_width, | |
| 5342 doc: /* Default value of `scroll-bar-width' for buffers that don't override it. | |
| 5343 This is the same as (default-value 'scroll-bar-width). */); | |
| 5344 | |
| 5345 DEFVAR_LISP_NOPRO ("default-vertical-scroll-bar", | |
| 5346 &buffer_defaults.vertical_scroll_bar_type, | |
| 5347 doc: /* Default value of `vertical-scroll-bar' for buffers that don't override it. | |
| 5348 This is the same as (default-value 'vertical-scroll-bar). */); | |
| 5246 | 5349 |
| 5247 DEFVAR_LISP_NOPRO ("default-indicate-empty-lines", | 5350 DEFVAR_LISP_NOPRO ("default-indicate-empty-lines", |
| 5248 &buffer_defaults.indicate_empty_lines, | 5351 &buffer_defaults.indicate_empty_lines, |
| 5249 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it. | 5352 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it. |
| 5250 This is the same as (default-value 'indicate-empty-lines). */); | 5353 This is the same as (default-value 'indicate-empty-lines). */); |
| 5354 | |
| 5355 DEFVAR_LISP_NOPRO ("default-indicate-buffer-boundaries", | |
| 5356 &buffer_defaults.indicate_buffer_boundaries, | |
| 5357 doc: /* Default value of `indicate-buffer-boundaries' for buffers that don't override it. | |
| 5358 This is the same as (default-value 'indicate-buffer-boundaries). */); | |
| 5251 | 5359 |
| 5252 DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively", | 5360 DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively", |
| 5253 &buffer_defaults.scroll_up_aggressively, | 5361 &buffer_defaults.scroll_up_aggressively, |
| 5254 doc: /* Default value of `scroll-up-aggressively'. | 5362 doc: /* Default value of `scroll-up-aggressively'. |
| 5255 This value applies in buffers that don't have their own local values. | 5363 This value applies in buffers that don't have their own local values. |
| 5304 For a modified read-only buffer, %* gives % and %+ gives *. | 5412 For a modified read-only buffer, %* gives % and %+ gives *. |
| 5305 %s -- print process status. %l -- print the current line number. | 5413 %s -- print process status. %l -- print the current line number. |
| 5306 %c -- print the current column number (this makes editing slower). | 5414 %c -- print the current column number (this makes editing slower). |
| 5307 To make the column number update correctly in all cases, | 5415 To make the column number update correctly in all cases, |
| 5308 `column-number-mode' must be non-nil. | 5416 `column-number-mode' must be non-nil. |
| 5417 %i -- print the size of the buffer. | |
| 5418 %I -- like %i, but use k, M, G, etc., to abbreviate. | |
| 5309 %p -- print percent of buffer above top of window, or Top, Bot or All. | 5419 %p -- print percent of buffer above top of window, or Top, Bot or All. |
| 5310 %P -- print percent of buffer above bottom of window, perhaps plus Top, | 5420 %P -- print percent of buffer above bottom of window, perhaps plus Top, |
| 5311 or print Bottom or All. | 5421 or print Bottom or All. |
| 5312 %m -- print the mode name. | 5422 %m -- print the mode name. |
| 5313 %n -- print Narrow if appropriate. | 5423 %n -- print Narrow if appropriate. |
| 5317 %% -- print %. %- -- print infinitely many dashes. | 5427 %% -- print %. %- -- print infinitely many dashes. |
| 5318 Decimal digits after the % specify field width to which to pad. */); | 5428 Decimal digits after the % specify field width to which to pad. */); |
| 5319 | 5429 |
| 5320 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode, | 5430 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode, |
| 5321 doc: /* *Major mode for new buffers. Defaults to `fundamental-mode'. | 5431 doc: /* *Major mode for new buffers. Defaults to `fundamental-mode'. |
| 5322 nil here means use current buffer's major mode. */); | 5432 nil here means use current buffer's major mode, provided it is not |
| 5433 marked as "special". | |
| 5434 | |
| 5435 When a mode is used by default, `find-file' switches to it | |
| 5436 before it reads the contents into the buffer and before | |
| 5437 it finishes setting up the buffer. Thus, the mode and | |
| 5438 its hooks should not expect certain variables such as | |
| 5439 `buffer-read-only' and `buffer-file-coding-system' to be set up. */); | |
| 5323 | 5440 |
| 5324 DEFVAR_PER_BUFFER ("major-mode", ¤t_buffer->major_mode, | 5441 DEFVAR_PER_BUFFER ("major-mode", ¤t_buffer->major_mode, |
| 5325 make_number (Lisp_Symbol), | 5442 make_number (Lisp_Symbol), |
| 5326 doc: /* Symbol for current buffer's major mode. */); | 5443 doc: /* Symbol for current buffer's major mode. */); |
| 5327 | 5444 |
| 5337 doc: /* *Non-nil if searches and matches should ignore case. */); | 5454 doc: /* *Non-nil if searches and matches should ignore case. */); |
| 5338 | 5455 |
| 5339 DEFVAR_PER_BUFFER ("fill-column", ¤t_buffer->fill_column, | 5456 DEFVAR_PER_BUFFER ("fill-column", ¤t_buffer->fill_column, |
| 5340 make_number (Lisp_Int), | 5457 make_number (Lisp_Int), |
| 5341 doc: /* *Column beyond which automatic line-wrapping should happen. | 5458 doc: /* *Column beyond which automatic line-wrapping should happen. |
| 5342 Interactively, you can set this using \\[set-fill-column]. */); | 5459 Interactively, you can set the buffer local value using \\[set-fill-column]. */); |
| 5343 | 5460 |
| 5344 DEFVAR_PER_BUFFER ("left-margin", ¤t_buffer->left_margin, | 5461 DEFVAR_PER_BUFFER ("left-margin", ¤t_buffer->left_margin, |
| 5345 make_number (Lisp_Int), | 5462 make_number (Lisp_Int), |
| 5346 doc: /* *Column for the default indent-line-function to indent to. | 5463 doc: /* *Column for the default indent-line-function to indent to. |
| 5347 Linefeed indents to this column in Fundamental mode. */); | 5464 Linefeed indents to this column in Fundamental mode. */); |
| 5356 This variable does not apply to characters whose display is specified | 5473 This variable does not apply to characters whose display is specified |
| 5357 in the current display table (if there is one). */); | 5474 in the current display table (if there is one). */); |
| 5358 | 5475 |
| 5359 DEFVAR_PER_BUFFER ("enable-multibyte-characters", | 5476 DEFVAR_PER_BUFFER ("enable-multibyte-characters", |
| 5360 ¤t_buffer->enable_multibyte_characters, | 5477 ¤t_buffer->enable_multibyte_characters, |
| 5361 make_number (-1), | 5478 Qnil, |
| 5362 doc: /* Non-nil means the buffer contents are regarded as multi-byte characters. | 5479 doc: /* Non-nil means the buffer contents are regarded as multi-byte characters. |
| 5363 Otherwise they are regarded as unibyte. This affects the display, | 5480 Otherwise they are regarded as unibyte. This affects the display, |
| 5364 file I/O and the behavior of various editing commands. | 5481 file I/O and the behavior of various editing commands. |
| 5365 | 5482 |
| 5366 This variable is buffer-local but you cannot set it directly; | 5483 This variable is buffer-local but you cannot set it directly; |
| 5367 use the function `set-buffer-multibyte' to change a buffer's representation. | 5484 use the function `set-buffer-multibyte' to change a buffer's representation. |
| 5368 Changing its default value with `setq-default' is supported. | 5485 Changing its default value with `setq-default' is supported. |
| 5369 See also variable `default-enable-multibyte-characters' and Info node | 5486 See also variable `default-enable-multibyte-characters' and Info node |
| 5370 `(elisp)Text Representations'. */); | 5487 `(elisp)Text Representations'. */); |
| 5488 XSYMBOL (intern ("enable-multibyte-characters"))->constant = 1; | |
| 5371 | 5489 |
| 5372 DEFVAR_PER_BUFFER ("buffer-file-coding-system", | 5490 DEFVAR_PER_BUFFER ("buffer-file-coding-system", |
| 5373 ¤t_buffer->buffer_file_coding_system, Qnil, | 5491 ¤t_buffer->buffer_file_coding_system, Qnil, |
| 5374 doc: /* Coding system to be used for encoding the buffer contents on saving. | 5492 doc: /* Coding system to be used for encoding the buffer contents on saving. |
| 5375 This variable applies to saving the buffer, and also to `write-region' | 5493 This variable applies to saving the buffer, and also to `write-region' |
| 5509 the character used to draw the border between side-by-side windows | 5627 the character used to draw the border between side-by-side windows |
| 5510 (extra-slot 5, a single character). | 5628 (extra-slot 5, a single character). |
| 5511 | 5629 |
| 5512 See also the functions `display-table-slot' and `set-display-table-slot'. */); | 5630 See also the functions `display-table-slot' and `set-display-table-slot'. */); |
| 5513 | 5631 |
| 5514 DEFVAR_PER_BUFFER ("left-margin-width", ¤t_buffer->left_margin_width, | 5632 DEFVAR_PER_BUFFER ("left-margin-width", ¤t_buffer->left_margin_cols, |
| 5515 Qnil, | 5633 Qnil, |
| 5516 doc: /* *Width of left marginal area for display of a buffer. | 5634 doc: /* *Width of left marginal area for display of a buffer. |
| 5517 A value of nil means no marginal area. */); | 5635 A value of nil means no marginal area. */); |
| 5518 | 5636 |
| 5519 DEFVAR_PER_BUFFER ("right-margin-width", ¤t_buffer->right_margin_width, | 5637 DEFVAR_PER_BUFFER ("right-margin-width", ¤t_buffer->right_margin_cols, |
| 5520 Qnil, | 5638 Qnil, |
| 5521 doc: /* *Width of right marginal area for display of a buffer. | 5639 doc: /* *Width of right marginal area for display of a buffer. |
| 5522 A value of nil means no marginal area. */); | 5640 A value of nil means no marginal area. */); |
| 5641 | |
| 5642 DEFVAR_PER_BUFFER ("left-fringe-width", ¤t_buffer->left_fringe_width, | |
| 5643 Qnil, | |
| 5644 doc: /* *Width of this buffer's left fringe (in pixels). | |
| 5645 A value of 0 means no left fringe is shown in this buffer's window. | |
| 5646 A value of nil means to use the left fringe width from the window's frame. */); | |
| 5647 | |
| 5648 DEFVAR_PER_BUFFER ("right-fringe-width", ¤t_buffer->right_fringe_width, | |
| 5649 Qnil, | |
| 5650 doc: /* *Width of this buffer's right fringe (in pixels). | |
| 5651 A value of 0 means no right fringe is shown in this buffer's window. | |
| 5652 A value of nil means to use the right fringe width from the window's frame. */); | |
| 5653 | |
| 5654 DEFVAR_PER_BUFFER ("fringes-outside-margins", ¤t_buffer->fringes_outside_margins, | |
| 5655 Qnil, | |
| 5656 doc: /* *Non-nil means to display fringes outside display margins. | |
| 5657 A value of nil means to display fringes between margins and buffer text. */); | |
| 5658 | |
| 5659 DEFVAR_PER_BUFFER ("scroll-bar-width", ¤t_buffer->scroll_bar_width, | |
| 5660 Qnil, | |
| 5661 doc: /* *Width of this buffer's scroll bars in pixels. | |
| 5662 A value of nil means to use the scroll bar width from the window's frame. */); | |
| 5663 | |
| 5664 DEFVAR_PER_BUFFER ("vertical-scroll-bar", ¤t_buffer->vertical_scroll_bar_type, | |
| 5665 Qnil, | |
| 5666 doc: /* *Position of this buffer's vertical scroll bar. | |
| 5667 The value takes effect whenever you tell a window to display this buffer; | |
| 5668 for instance, with `set-window-buffer' or when `display-buffer' displays it. | |
| 5669 | |
| 5670 A value of `left' or `right' means put the vertical scroll bar at that side | |
| 5671 of the window; a value of nil means don't show any vertical scroll bars. | |
| 5672 A value of t (the default) means do whatever the window's frame specifies. */); | |
| 5523 | 5673 |
| 5524 DEFVAR_PER_BUFFER ("indicate-empty-lines", | 5674 DEFVAR_PER_BUFFER ("indicate-empty-lines", |
| 5525 ¤t_buffer->indicate_empty_lines, Qnil, | 5675 ¤t_buffer->indicate_empty_lines, Qnil, |
| 5526 doc: /* *Visually indicate empty lines after the buffer end. | 5676 doc: /* *Visually indicate empty lines after the buffer end. |
| 5527 If non-nil, a bitmap is displayed in the left fringe of a window on | 5677 If non-nil, a bitmap is displayed in the left fringe of a window on |
| 5528 window-systems. */); | 5678 window-systems. */); |
| 5679 | |
| 5680 DEFVAR_PER_BUFFER ("indicate-buffer-boundaries", | |
| 5681 ¤t_buffer->indicate_buffer_boundaries, Qnil, | |
| 5682 doc: /* *Visually indicate buffer boundaries and scrolling. | |
| 5683 If non-nil, the first and last line of the buffer are marked in the fringe | |
| 5684 of a window on window-systems with angle bitmaps, or if the window can be | |
| 5685 scrolled, the top and bottom line of the window are marked with up and down | |
| 5686 arrow bitmaps. | |
| 5687 | |
| 5688 If value is a symbol `left' or `right', both angle and arrow bitmaps | |
| 5689 are displayed in the left or right fringe, resp. Any other value | |
| 5690 that doesn't look like an alist means display the angle bitmaps in | |
| 5691 the left fringe but no arrows. | |
| 5692 | |
| 5693 You can exercise more precise control by using an alist as the | |
| 5694 value. Each alist element (INDICATOR . POSITION) specifies | |
| 5695 where to show one of the indicators. INDICATOR is one of `top', | |
| 5696 `bottom', `up', `down', or t, which specifies the default position, | |
| 5697 and POSITION is one of `left', `right', or nil, meaning do not show | |
| 5698 this indicator. | |
| 5699 | |
| 5700 For example, ((top . left) (t . right)) places the top angle bitmap in | |
| 5701 left fringe, the bottom angle bitmap in right fringe, and both arrow | |
| 5702 bitmaps in right fringe. To show just the angle bitmaps in the left | |
| 5703 fringe, but no arrow bitmaps, use ((top . left) (bottom . left)). */); | |
| 5529 | 5704 |
| 5530 DEFVAR_PER_BUFFER ("scroll-up-aggressively", | 5705 DEFVAR_PER_BUFFER ("scroll-up-aggressively", |
| 5531 ¤t_buffer->scroll_up_aggressively, Qnil, | 5706 ¤t_buffer->scroll_up_aggressively, Qnil, |
| 5532 doc: /* How far to scroll windows upward. | 5707 doc: /* How far to scroll windows upward. |
| 5533 If you move point off the bottom, the window scrolls automatically. | 5708 If you move point off the bottom, the window scrolls automatically. |
| 5535 means scroll to center point. A fraction means scroll to put point | 5710 means scroll to center point. A fraction means scroll to put point |
| 5536 that fraction of the window's height from the bottom of the window. | 5711 that fraction of the window's height from the bottom of the window. |
| 5537 When the value is 0.0, point goes at the bottom line, which in the simple | 5712 When the value is 0.0, point goes at the bottom line, which in the simple |
| 5538 case that you moved off with C-f means scrolling just one line. 1.0 means | 5713 case that you moved off with C-f means scrolling just one line. 1.0 means |
| 5539 point goes at the top, so that in that simple case, the window | 5714 point goes at the top, so that in that simple case, the window |
| 5540 window scrolls by a full window height. Meaningful values are | 5715 scrolls by a full window height. Meaningful values are |
| 5541 between 0.0 and 1.0, inclusive. */); | 5716 between 0.0 and 1.0, inclusive. */); |
| 5542 | 5717 |
| 5543 DEFVAR_PER_BUFFER ("scroll-down-aggressively", | 5718 DEFVAR_PER_BUFFER ("scroll-down-aggressively", |
| 5544 ¤t_buffer->scroll_down_aggressively, Qnil, | 5719 ¤t_buffer->scroll_down_aggressively, Qnil, |
| 5545 doc: /* How far to scroll windows downward. | 5720 doc: /* How far to scroll windows downward. |
| 5548 means scroll to center point. A fraction means scroll to put point | 5723 means scroll to center point. A fraction means scroll to put point |
| 5549 that fraction of the window's height from the top of the window. | 5724 that fraction of the window's height from the top of the window. |
| 5550 When the value is 0.0, point goes at the top line, which in the simple | 5725 When the value is 0.0, point goes at the top line, which in the simple |
| 5551 case that you moved off with C-b means scrolling just one line. 1.0 means | 5726 case that you moved off with C-b means scrolling just one line. 1.0 means |
| 5552 point goes at the bottom, so that in that simple case, the window | 5727 point goes at the bottom, so that in that simple case, the window |
| 5553 window scrolls by a full window height. Meaningful values are | 5728 scrolls by a full window height. Meaningful values are |
| 5554 between 0.0 and 1.0, inclusive. */); | 5729 between 0.0 and 1.0, inclusive. */); |
| 5555 | 5730 |
| 5556 /*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol, | 5731 /*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol, |
| 5557 "Don't ask."); | 5732 "Don't ask."); |
| 5558 */ | 5733 */ |
| 5621 | 5796 |
| 5622 An entry (nil PROPERTY VALUE BEG . END) indicates that a text property | 5797 An entry (nil PROPERTY VALUE BEG . END) indicates that a text property |
| 5623 was modified between BEG and END. PROPERTY is the property name, | 5798 was modified between BEG and END. PROPERTY is the property name, |
| 5624 and VALUE is the old value. | 5799 and VALUE is the old value. |
| 5625 | 5800 |
| 5801 An entry (apply FUN-NAME . ARGS) means undo the change with | |
| 5802 \(apply FUN-NAME ARGS). | |
| 5803 | |
| 5804 An entry (apply DELTA BEG END FUN-NAME . ARGS) supports selective undo | |
| 5805 in the active region. BEG and END is the range affected by this entry | |
| 5806 and DELTA is the number of bytes added or deleted in that range by | |
| 5807 this change. | |
| 5808 | |
| 5626 An entry (MARKER . DISTANCE) indicates that the marker MARKER | 5809 An entry (MARKER . DISTANCE) indicates that the marker MARKER |
| 5627 was adjusted in position by the offset DISTANCE (an integer). | 5810 was adjusted in position by the offset DISTANCE (an integer). |
| 5628 | 5811 |
| 5629 An entry of the form POSITION indicates that point was at the buffer | 5812 An entry of the form POSITION indicates that point was at the buffer |
| 5630 location given by the integer. Undoing an entry of this form places | 5813 location given by the integer. Undoing an entry of this form places |
| 5640 | 5823 |
| 5641 DEFVAR_PER_BUFFER ("cache-long-line-scans", ¤t_buffer->cache_long_line_scans, Qnil, | 5824 DEFVAR_PER_BUFFER ("cache-long-line-scans", ¤t_buffer->cache_long_line_scans, Qnil, |
| 5642 doc: /* Non-nil means that Emacs should use caches to handle long lines more quickly. | 5825 doc: /* Non-nil means that Emacs should use caches to handle long lines more quickly. |
| 5643 | 5826 |
| 5644 Normally, the line-motion functions work by scanning the buffer for | 5827 Normally, the line-motion functions work by scanning the buffer for |
| 5645 newlines. Columnar operations (like move-to-column and | 5828 newlines. Columnar operations (like `move-to-column' and |
| 5646 compute-motion) also work by scanning the buffer, summing character | 5829 `compute-motion') also work by scanning the buffer, summing character |
| 5647 widths as they go. This works well for ordinary text, but if the | 5830 widths as they go. This works well for ordinary text, but if the |
| 5648 buffer's lines are very long (say, more than 500 characters), these | 5831 buffer's lines are very long (say, more than 500 characters), these |
| 5649 motion functions will take longer to execute. Emacs may also take | 5832 motion functions will take longer to execute. Emacs may also take |
| 5650 longer to update the display. | 5833 longer to update the display. |
| 5651 | 5834 |
| 5652 If cache-long-line-scans is non-nil, these motion functions cache the | 5835 If `cache-long-line-scans' is non-nil, these motion functions cache the |
| 5653 results of their scans, and consult the cache to avoid rescanning | 5836 results of their scans, and consult the cache to avoid rescanning |
| 5654 regions of the buffer until the text is modified. The caches are most | 5837 regions of the buffer until the text is modified. The caches are most |
| 5655 beneficial when they prevent the most searching---that is, when the | 5838 beneficial when they prevent the most searching---that is, when the |
| 5656 buffer contains long lines and large regions of characters with the | 5839 buffer contains long lines and large regions of characters with the |
| 5657 same, fixed screen width. | 5840 same, fixed screen width. |
| 5658 | 5841 |
| 5659 When cache-long-line-scans is non-nil, processing short lines will | 5842 When `cache-long-line-scans' is non-nil, processing short lines will |
| 5660 become slightly slower (because of the overhead of consulting the | 5843 become slightly slower (because of the overhead of consulting the |
| 5661 cache), and the caches will use memory roughly proportional to the | 5844 cache), and the caches will use memory roughly proportional to the |
| 5662 number of newlines and characters whose screen width varies. | 5845 number of newlines and characters whose screen width varies. |
| 5663 | 5846 |
| 5664 The caches require no explicit maintenance; their accuracy is | 5847 The caches require no explicit maintenance; their accuracy is |
| 5670 doc: /* Value of point before the last series of scroll operations, or nil. */); | 5853 doc: /* Value of point before the last series of scroll operations, or nil. */); |
| 5671 | 5854 |
| 5672 DEFVAR_PER_BUFFER ("buffer-file-format", ¤t_buffer->file_format, Qnil, | 5855 DEFVAR_PER_BUFFER ("buffer-file-format", ¤t_buffer->file_format, Qnil, |
| 5673 doc: /* List of formats to use when saving this buffer. | 5856 doc: /* List of formats to use when saving this buffer. |
| 5674 Formats are defined by `format-alist'. This variable is | 5857 Formats are defined by `format-alist'. This variable is |
| 5675 set when a file is visited. Automatically local in all buffers. */); | 5858 set when a file is visited. */); |
| 5859 | |
| 5860 DEFVAR_PER_BUFFER ("buffer-auto-save-file-format", | |
| 5861 ¤t_buffer->auto_save_file_format, Qnil, | |
| 5862 doc: /* *Format in which to write auto-save files. | |
| 5863 Should be a list of symbols naming formats that are defined in `format-alist'. | |
| 5864 If it is t, which is the default, auto-save files are written in the | |
| 5865 same format as a regular save would use. */); | |
| 5676 | 5866 |
| 5677 DEFVAR_PER_BUFFER ("buffer-invisibility-spec", | 5867 DEFVAR_PER_BUFFER ("buffer-invisibility-spec", |
| 5678 ¤t_buffer->invisibility_spec, Qnil, | 5868 ¤t_buffer->invisibility_spec, Qnil, |
| 5679 doc: /* Invisibility spec of this buffer. | 5869 doc: /* Invisibility spec of this buffer. |
| 5680 The default is t, which means that text is invisible | 5870 The default is t, which means that text is invisible |
| 5699 | 5889 |
| 5700 DEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode, | 5890 DEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode, |
| 5701 doc: /* *Non-nil means deactivate the mark when the buffer contents change. | 5891 doc: /* *Non-nil means deactivate the mark when the buffer contents change. |
| 5702 Non-nil also enables highlighting of the region whenever the mark is active. | 5892 Non-nil also enables highlighting of the region whenever the mark is active. |
| 5703 The variable `highlight-nonselected-windows' controls whether to highlight | 5893 The variable `highlight-nonselected-windows' controls whether to highlight |
| 5704 all windows or just the selected window. */); | 5894 all windows or just the selected window. |
| 5895 | |
| 5896 If the value is `lambda', that enables Transient Mark mode temporarily | |
| 5897 until the next buffer modification. If a command sets the value to `only', | |
| 5898 that enables Transient Mark mode for the following command only. | |
| 5899 During that following command, the value of `transient-mark-mode' | |
| 5900 is `identity'. If it is still `identity' at the end of that command, | |
| 5901 it changes to nil. */); | |
| 5705 Vtransient_mark_mode = Qnil; | 5902 Vtransient_mark_mode = Qnil; |
| 5706 | 5903 |
| 5707 DEFVAR_LISP ("inhibit-read-only", &Vinhibit_read_only, | 5904 DEFVAR_LISP ("inhibit-read-only", &Vinhibit_read_only, |
| 5708 doc: /* *Non-nil means disregard read-only status of buffers or characters. | 5905 doc: /* *Non-nil means disregard read-only status of buffers or characters. |
| 5709 If the value is t, disregard `buffer-read-only' and all `read-only' | 5906 If the value is t, disregard `buffer-read-only' and all `read-only' |
| 5714 | 5911 |
| 5715 DEFVAR_PER_BUFFER ("cursor-type", ¤t_buffer->cursor_type, Qnil, | 5912 DEFVAR_PER_BUFFER ("cursor-type", ¤t_buffer->cursor_type, Qnil, |
| 5716 doc: /* Cursor to use when this buffer is in the selected window. | 5913 doc: /* Cursor to use when this buffer is in the selected window. |
| 5717 Values are interpreted as follows: | 5914 Values are interpreted as follows: |
| 5718 | 5915 |
| 5719 t use the cursor specified for the frame | 5916 t use the cursor specified for the frame |
| 5720 nil don't display a cursor | 5917 nil don't display a cursor |
| 5721 bar display a bar cursor with default width | 5918 box display a filled box cursor |
| 5722 (bar . WIDTH) display a bar cursor with width WIDTH | 5919 hollow display a hollow box cursor |
| 5723 ANYTHING ELSE display a box cursor. | 5920 bar display a vertical bar cursor with default width |
| 5921 (bar . WIDTH) display a vertical bar cursor with width WIDTH | |
| 5922 hbar display a horizontal bar cursor with default height | |
| 5923 (hbar . HEIGHT) display a horizontal bar cursor with height HEIGHT | |
| 5924 ANYTHING ELSE display a hollow box cursor | |
| 5724 | 5925 |
| 5725 When the buffer is displayed in a nonselected window, | 5926 When the buffer is displayed in a nonselected window, |
| 5726 this variable has no effect; the cursor appears as a hollow box. */); | 5927 this variable has no effect; the cursor appears as a hollow box. */); |
| 5727 | 5928 |
| 5728 DEFVAR_PER_BUFFER ("line-spacing", | 5929 DEFVAR_PER_BUFFER ("line-spacing", |
| 5729 ¤t_buffer->extra_line_spacing, Qnil, | 5930 ¤t_buffer->extra_line_spacing, Qnil, |
| 5730 doc: /* Additional space to put between lines when displaying a buffer. | 5931 doc: /* Additional space to put between lines when displaying a buffer. |
| 5731 The space is measured in pixels, and put below lines on window systems. */); | 5932 The space is measured in pixels, and put below lines on window systems. |
| 5933 If value is a floating point number, it specifies the spacing relative | |
| 5934 to the default frame line height. */); | |
| 5935 | |
| 5936 DEFVAR_PER_BUFFER ("cursor-in-non-selected-windows", | |
| 5937 ¤t_buffer->cursor_in_non_selected_windows, Qnil, | |
| 5938 doc: /* *Cursor type to display in non-selected windows. | |
| 5939 t means to use hollow box cursor. See `cursor-type' for other values. */); | |
| 5732 | 5940 |
| 5733 DEFVAR_LISP ("kill-buffer-query-functions", &Vkill_buffer_query_functions, | 5941 DEFVAR_LISP ("kill-buffer-query-functions", &Vkill_buffer_query_functions, |
| 5734 doc: /* List of functions called with no args to query before killing a buffer. */); | 5942 doc: /* List of functions called with no args to query before killing a buffer. */); |
| 5735 Vkill_buffer_query_functions = Qnil; | 5943 Vkill_buffer_query_functions = Qnil; |
| 5736 | 5944 |
| 5750 defsubr (&Sbuffer_modified_p); | 5958 defsubr (&Sbuffer_modified_p); |
| 5751 defsubr (&Sset_buffer_modified_p); | 5959 defsubr (&Sset_buffer_modified_p); |
| 5752 defsubr (&Sbuffer_modified_tick); | 5960 defsubr (&Sbuffer_modified_tick); |
| 5753 defsubr (&Srename_buffer); | 5961 defsubr (&Srename_buffer); |
| 5754 defsubr (&Sother_buffer); | 5962 defsubr (&Sother_buffer); |
| 5755 defsubr (&Sbuffer_disable_undo); | |
| 5756 defsubr (&Sbuffer_enable_undo); | 5963 defsubr (&Sbuffer_enable_undo); |
| 5757 defsubr (&Skill_buffer); | 5964 defsubr (&Skill_buffer); |
| 5758 defsubr (&Sset_buffer_major_mode); | 5965 defsubr (&Sset_buffer_major_mode); |
| 5759 defsubr (&Sswitch_to_buffer); | 5966 defsubr (&Sswitch_to_buffer); |
| 5760 defsubr (&Spop_to_buffer); | 5967 defsubr (&Spop_to_buffer); |
| 5793 | 6000 |
| 5794 /* This must not be in syms_of_buffer, because Qdisabled is not | 6001 /* This must not be in syms_of_buffer, because Qdisabled is not |
| 5795 initialized when that function gets called. */ | 6002 initialized when that function gets called. */ |
| 5796 Fput (intern ("erase-buffer"), Qdisabled, Qt); | 6003 Fput (intern ("erase-buffer"), Qdisabled, Qt); |
| 5797 } | 6004 } |
| 6005 | |
| 6006 /* arch-tag: e48569bf-69a9-4b65-a23b-8e68769436e1 | |
| 6007 (do not change this comment) */ |
