Mercurial > emacs
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 |
