diff options
| author | Gerd Moellmann | 2000-04-17 15:26:29 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2000-04-17 15:26:29 +0000 |
| commit | 7e9d5818600391fe74508323c0d5d038732216ec (patch) | |
| tree | 34ced2af98491011e4da6c506e25b455c66c581d /src | |
| parent | fa65f20bcbcf7a3065ce995a22ddf36d70dab2b1 (diff) | |
| download | emacs-7e9d5818600391fe74508323c0d5d038732216ec.tar.gz emacs-7e9d5818600391fe74508323c0d5d038732216ec.zip | |
(clone_per_buffer_values): New function.
(Fmake_indirect_buffer): Add optional argument CLONE. Call
clone_per_buffer_values if CLONE is not nil.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer.c | 78 |
1 files changed, 64 insertions, 14 deletions
diff --git a/src/buffer.c b/src/buffer.c index 37e0894af94..5eb57129def 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -408,16 +408,61 @@ The value is never nil.") | |||
| 408 | return buf; | 408 | return buf; |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, 2, 2, | 411 | |
| 412 | /* Clone per-buffer values of buffer FROM. | ||
| 413 | |||
| 414 | Buffer TO gets the same per-buffer values as FROM, with the | ||
| 415 | following exceptions: (1) TO's name is left untouched, (2) markers | ||
| 416 | are copied and made to refer to TO, and (3) overlay lists are | ||
| 417 | copied. */ | ||
| 418 | |||
| 419 | static void | ||
| 420 | clone_per_buffer_values (from, to) | ||
| 421 | struct buffer *from, *to; | ||
| 422 | { | ||
| 423 | Lisp_Object to_buffer; | ||
| 424 | int offset; | ||
| 425 | |||
| 426 | XSETBUFFER (to_buffer, to); | ||
| 427 | |||
| 428 | for (offset = PER_BUFFER_VAR_OFFSET (name) + sizeof (Lisp_Object); | ||
| 429 | offset < sizeof *to; | ||
| 430 | offset += sizeof (Lisp_Object)) | ||
| 431 | { | ||
| 432 | Lisp_Object obj; | ||
| 433 | |||
| 434 | obj = PER_BUFFER_VALUE (from, offset); | ||
| 435 | if (MARKERP (obj)) | ||
| 436 | { | ||
| 437 | struct Lisp_Marker *m = XMARKER (obj); | ||
| 438 | obj = Fmake_marker (); | ||
| 439 | XMARKER (obj)->insertion_type = m->insertion_type; | ||
| 440 | set_marker_both (obj, to_buffer, m->charpos, m->bytepos); | ||
| 441 | } | ||
| 442 | |||
| 443 | PER_BUFFER_VALUE (to, offset) = obj; | ||
| 444 | } | ||
| 445 | |||
| 446 | to->overlays_after = Fcopy_sequence (from->overlays_after); | ||
| 447 | to->overlays_before = Fcopy_sequence (to->overlays_before); | ||
| 448 | bcopy (from->local_flags, to->local_flags, sizeof to->local_flags); | ||
| 449 | } | ||
| 450 | |||
| 451 | |||
| 452 | DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, | ||
| 453 | 2, 3, | ||
| 412 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", | 454 | "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", |
| 413 | "Create and return an indirect buffer for buffer BASE-BUFFER, named NAME.\n\ | 455 | "Create and return an indirect buffer for buffer BASE-BUFFER, named NAME.\n\ |
| 414 | BASE-BUFFER should be an existing buffer (or buffer name).\n\ | 456 | BASE-BUFFER should be an existing buffer (or buffer name).\n\ |
| 415 | NAME should be a string which is not the name of an existing buffer.") | 457 | NAME should be a string which is not the name of an existing buffer.\n\ |
| 416 | (base_buffer, name) | 458 | Optional argument CLONE non-nil means preserve BASE-BUFFER's state,\n\ |
| 417 | register Lisp_Object base_buffer, name; | 459 | such as major and minor modes, in the indirect buffer. |
| 460 | CLONE nil means the indirect buffer's state is reset to default values.") | ||
| 461 | (base_buffer, name, clone) | ||
| 462 | Lisp_Object base_buffer, name, clone; | ||
| 418 | { | 463 | { |
| 419 | register Lisp_Object buf; | 464 | Lisp_Object buf; |
| 420 | register struct buffer *b; | 465 | struct buffer *b; |
| 421 | 466 | ||
| 422 | buf = Fget_buffer (name); | 467 | buf = Fget_buffer (name); |
| 423 | if (!NILP (buf)) | 468 | if (!NILP (buf)) |
| @@ -498,14 +543,19 @@ NAME should be a string which is not the name of an existing buffer.") | |||
| 498 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; | 543 | XMARKER (b->base_buffer->zv_marker)->insertion_type = 1; |
| 499 | } | 544 | } |
| 500 | 545 | ||
| 501 | /* Give the indirect buffer markers for its narrowing. */ | 546 | if (NILP (clone)) |
| 502 | b->pt_marker = Fmake_marker (); | 547 | { |
| 503 | set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b)); | 548 | /* Give the indirect buffer markers for its narrowing. */ |
| 504 | b->begv_marker = Fmake_marker (); | 549 | b->pt_marker = Fmake_marker (); |
| 505 | set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); | 550 | set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b)); |
| 506 | b->zv_marker = Fmake_marker (); | 551 | b->begv_marker = Fmake_marker (); |
| 507 | set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); | 552 | set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b)); |
| 508 | XMARKER (b->zv_marker)->insertion_type = 1; | 553 | b->zv_marker = Fmake_marker (); |
| 554 | set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b)); | ||
| 555 | XMARKER (b->zv_marker)->insertion_type = 1; | ||
| 556 | } | ||
| 557 | else | ||
| 558 | clone_per_buffer_values (b->base_buffer, b); | ||
| 509 | 559 | ||
| 510 | return buf; | 560 | return buf; |
| 511 | } | 561 | } |