comparison src/buffer.c @ 28625:5d68443d3df1

(clone_per_buffer_values): New function. (Fmake_indirect_buffer): Add optional argument CLONE. Call clone_per_buffer_values if CLONE is not nil.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 17 Apr 2000 15:26:29 +0000
parents 5da961b04d97
children 19c81f320db5
comparison
equal deleted inserted replaced
28624:aef61acb21de 28625:5d68443d3df1
406 BUF_MARKERS (b) = Qnil; 406 BUF_MARKERS (b) = Qnil;
407 b->name = name; 407 b->name = name;
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.
418 { 460 CLONE nil means the indirect buffer's state is reset to default values.")
419 register Lisp_Object buf; 461 (base_buffer, name, clone)
420 register struct buffer *b; 462 Lisp_Object base_buffer, name, clone;
463 {
464 Lisp_Object buf;
465 struct buffer *b;
421 466
422 buf = Fget_buffer (name); 467 buf = Fget_buffer (name);
423 if (!NILP (buf)) 468 if (!NILP (buf))
424 error ("Buffer name `%s' is in use", XSTRING (name)->data); 469 error ("Buffer name `%s' is in use", XSTRING (name)->data);
425 470
496 BUF_ZV (b->base_buffer), 541 BUF_ZV (b->base_buffer),
497 BUF_ZV_BYTE (b->base_buffer)); 542 BUF_ZV_BYTE (b->base_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 }
512 562
513 /* Reinitialize everything about a buffer except its name and contents 563 /* Reinitialize everything about a buffer except its name and contents