aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorGerd Moellmann2000-04-17 15:26:29 +0000
committerGerd Moellmann2000-04-17 15:26:29 +0000
commit7e9d5818600391fe74508323c0d5d038732216ec (patch)
tree34ced2af98491011e4da6c506e25b455c66c581d /src/buffer.c
parentfa65f20bcbcf7a3065ce995a22ddf36d70dab2b1 (diff)
downloademacs-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/buffer.c')
-rw-r--r--src/buffer.c78
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
411DEFUN ("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
419static void
420clone_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
452DEFUN ("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\
414BASE-BUFFER should be an existing buffer (or buffer name).\n\ 456BASE-BUFFER should be an existing buffer (or buffer name).\n\
415NAME should be a string which is not the name of an existing buffer.") 457NAME should be a string which is not the name of an existing buffer.\n\
416 (base_buffer, name) 458Optional argument CLONE non-nil means preserve BASE-BUFFER's state,\n\
417 register Lisp_Object base_buffer, name; 459such as major and minor modes, in the indirect buffer.
460CLONE 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}