Mercurial > emacs
comparison src/buffer.c @ 10314:b5260fe3dfdd
(Fmake_indirect_buffer): New function.
(Fbuffer_base_buffer): New function.
(syms_of_buffer): defsubr them.
(reset_buffer): Don't alter intervals here.
(Fget_buffer_create): Use BUF_MARKERS. Init BUF_INTERVALS here.
(Fkill_buffer): Use BUF_MARKERS; but don't touch it in indir buf.
Likewise BUF_INTERVALS.
(init_buffer_once): Set up .text and BUF_INTERVALS
in buffer_local_symbols and buffer_defaults.
(Fkill_buffer): Don't free the text in indirect buffer.
When killing a base buffer, kill its indirect buffers first.
(set_buffer_temp): New function.
(reset_buffer_local_variables): Initialize buffer_file_type field.
(Fget_buffer_create): Initialize pt_marker, begv/zv_marker.
(set_buffer_internal): Use and update these markers.
Copy undo_list in and out of the base buffer.
(Fget_buffer_create): Init save_modiff field here.
(reset_buffer): Not here.
(Fbuffer_modified_p): Use BUF_SAVE_MODIFF.
(Fset_buffer_modified_p): Use SAVE_MODIFF.
(Fkill_buffer, list_buffers_1): Use BUF_SAVE_MODIFF.
(Fget_buffer_create): Initialize the size and text fields.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 02 Jan 1995 21:50:28 +0000 |
| parents | 4aa245b5eb83 |
| children | 3a50d7d3ae47 |
comparison
equal
deleted
inserted
replaced
| 10313:55ce83f36b30 | 10314:b5260fe3dfdd |
|---|---|
| 253 if (XSTRING (name)->size == 0) | 253 if (XSTRING (name)->size == 0) |
| 254 error ("Empty string for buffer name is not allowed"); | 254 error ("Empty string for buffer name is not allowed"); |
| 255 | 255 |
| 256 b = (struct buffer *) xmalloc (sizeof (struct buffer)); | 256 b = (struct buffer *) xmalloc (sizeof (struct buffer)); |
| 257 | 257 |
| 258 b->size = sizeof (struct buffer) / sizeof (EMACS_INT); | |
| 259 | |
| 260 /* An ordinary buffer uses its own struct buffer_text. */ | |
| 261 b->text = &b->own_text; | |
| 262 b->base_buffer = 0; | |
| 263 | |
| 258 BUF_GAP_SIZE (b) = 20; | 264 BUF_GAP_SIZE (b) = 20; |
| 259 BLOCK_INPUT; | 265 BLOCK_INPUT; |
| 260 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b)); | 266 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b)); |
| 261 UNBLOCK_INPUT; | 267 UNBLOCK_INPUT; |
| 262 if (! BUF_BEG_ADDR (b)) | 268 if (! BUF_BEG_ADDR (b)) |
| 266 BUF_GPT (b) = 1; | 272 BUF_GPT (b) = 1; |
| 267 BUF_BEGV (b) = 1; | 273 BUF_BEGV (b) = 1; |
| 268 BUF_ZV (b) = 1; | 274 BUF_ZV (b) = 1; |
| 269 BUF_Z (b) = 1; | 275 BUF_Z (b) = 1; |
| 270 BUF_MODIFF (b) = 1; | 276 BUF_MODIFF (b) = 1; |
| 277 BUF_SAVE_MODIFF (b) = 1; | |
| 278 BUF_INTERVALS (b) = 0; | |
| 271 | 279 |
| 272 b->newline_cache = 0; | 280 b->newline_cache = 0; |
| 273 b->width_run_cache = 0; | 281 b->width_run_cache = 0; |
| 274 b->width_table = Qnil; | 282 b->width_table = Qnil; |
| 275 | 283 |
| 276 /* Put this on the chain of all buffers including killed ones. */ | 284 /* Put this on the chain of all buffers including killed ones. */ |
| 277 b->next = all_buffers; | 285 b->next = all_buffers; |
| 278 all_buffers = b; | 286 all_buffers = b; |
| 279 | 287 |
| 280 b->mark = Fmake_marker (); | 288 /* An ordinary buffer normally doesn't need markers |
| 281 /*b->number = make_number (++buffer_count);*/ | 289 to handle BEGV and ZV. */ |
| 290 b->pt_marker = Qnil; | |
| 291 b->begv_marker = Qnil; | |
| 292 b->zv_marker = Qnil; | |
| 282 | 293 |
| 283 name = Fcopy_sequence (name); | 294 name = Fcopy_sequence (name); |
| 284 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL); | 295 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL); |
| 285 b->name = name; | 296 b->name = name; |
| 286 | 297 |
| 295 /* Put this in the alist of all live buffers. */ | 306 /* Put this in the alist of all live buffers. */ |
| 296 XSETBUFFER (buf, b); | 307 XSETBUFFER (buf, b); |
| 297 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); | 308 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); |
| 298 | 309 |
| 299 b->mark = Fmake_marker (); | 310 b->mark = Fmake_marker (); |
| 300 b->markers = Qnil; | 311 BUF_MARKERS (b) = Qnil; |
| 301 b->name = name; | 312 b->name = name; |
| 313 return buf; | |
| 314 } | |
| 315 | |
| 316 DEFUN ("make-indirect-buffer", | |
| 317 Fmake_indirect_buffer, Smake_indirect_buffer, 2, 2, | |
| 318 "BMake indirect buffer: \nbIndirect to base buffer: ", | |
| 319 "Create and return an indirect buffer named NAME, with base buffer BASE.\n\ | |
| 320 BASE should be an existing buffer (or buffer name).") | |
| 321 (name, base_buffer) | |
| 322 register Lisp_Object name, base_buffer; | |
| 323 { | |
| 324 register Lisp_Object buf; | |
| 325 register struct buffer *b; | |
| 326 | |
| 327 buf = Fget_buffer (name); | |
| 328 if (!NILP (buf)) | |
| 329 error ("Buffer name `%s' is in use", XSTRING (name)->data); | |
| 330 | |
| 331 base_buffer = Fget_buffer (base_buffer); | |
| 332 if (NILP (base_buffer)) | |
| 333 error ("No such buffer: `%s'", | |
| 334 XSTRING (XBUFFER (base_buffer)->name)->data); | |
| 335 | |
| 336 if (XSTRING (name)->size == 0) | |
| 337 error ("Empty string for buffer name is not allowed"); | |
| 338 | |
| 339 b = (struct buffer *) xmalloc (sizeof (struct buffer)); | |
| 340 | |
| 341 b->size = sizeof (struct buffer) / sizeof (EMACS_INT); | |
| 342 | |
| 343 if (XBUFFER (base_buffer)->base_buffer) | |
| 344 b->base_buffer = XBUFFER (base_buffer)->base_buffer; | |
| 345 else | |
| 346 b->base_buffer = XBUFFER (base_buffer); | |
| 347 | |
| 348 /* Use the base buffer's text object. */ | |
| 349 b->text = b->base_buffer->text; | |
| 350 | |
| 351 BUF_BEGV (b) = BUF_BEGV (b->base_buffer); | |
| 352 BUF_ZV (b) = BUF_ZV (b->base_buffer); | |
| 353 BUF_PT (b) = BUF_PT (b->base_buffer); | |
| 354 | |
| 355 b->newline_cache = 0; | |
| 356 b->width_run_cache = 0; | |
| 357 b->width_table = Qnil; | |
| 358 | |
| 359 /* Put this on the chain of all buffers including killed ones. */ | |
| 360 b->next = all_buffers; | |
| 361 all_buffers = b; | |
| 362 | |
| 363 name = Fcopy_sequence (name); | |
| 364 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL); | |
| 365 b->name = name; | |
| 366 | |
| 367 reset_buffer (b); | |
| 368 reset_buffer_local_variables (b); | |
| 369 | |
| 370 /* Put this in the alist of all live buffers. */ | |
| 371 XSETBUFFER (buf, b); | |
| 372 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); | |
| 373 | |
| 374 b->mark = Fmake_marker (); | |
| 375 b->name = name; | |
| 376 | |
| 377 /* Make sure the base buffer has markers for its narrowing. */ | |
| 378 if (NILP (b->base_buffer->pt_marker)) | |
| 379 { | |
| 380 b->base_buffer->pt_marker = Fmake_marker (); | |
| 381 Fset_marker (b->base_buffer->pt_marker, | |
| 382 make_number (BUF_PT (b->base_buffer)), base_buffer); | |
| 383 } | |
| 384 if (NILP (b->base_buffer->begv_marker)) | |
| 385 { | |
| 386 b->base_buffer->begv_marker = Fmake_marker (); | |
| 387 Fset_marker (b->base_buffer->begv_marker, | |
| 388 make_number (BUF_BEGV (b->base_buffer)), base_buffer); | |
| 389 } | |
| 390 if (NILP (b->base_buffer->zv_marker)) | |
| 391 { | |
| 392 b->base_buffer->zv_marker = Fmake_marker (); | |
| 393 Fset_marker (b->base_buffer->zv_marker, | |
| 394 make_number (BUF_ZV (b->base_buffer)), base_buffer); | |
| 395 } | |
| 396 | |
| 397 /* Give the indirect buffer markers for its narrowing. */ | |
| 398 b->pt_marker = Fpoint_marker (); | |
| 399 b->begv_marker = Fpoint_min_marker (); | |
| 400 b->zv_marker = Fpoint_max_marker (); | |
| 401 | |
| 302 return buf; | 402 return buf; |
| 303 } | 403 } |
| 304 | 404 |
| 305 /* Reinitialize everything about a buffer except its name and contents | 405 /* Reinitialize everything about a buffer except its name and contents |
| 306 and local variables. */ | 406 and local variables. */ |
| 310 register struct buffer *b; | 410 register struct buffer *b; |
| 311 { | 411 { |
| 312 b->filename = Qnil; | 412 b->filename = Qnil; |
| 313 b->directory = (current_buffer) ? current_buffer->directory : Qnil; | 413 b->directory = (current_buffer) ? current_buffer->directory : Qnil; |
| 314 b->modtime = 0; | 414 b->modtime = 0; |
| 315 b->save_modified = 1; | |
| 316 XSETFASTINT (b->save_length, 0); | 415 XSETFASTINT (b->save_length, 0); |
| 317 b->last_window_start = 1; | 416 b->last_window_start = 1; |
| 318 b->backed_up = Qnil; | 417 b->backed_up = Qnil; |
| 319 b->auto_save_modified = 0; | 418 b->auto_save_modified = 0; |
| 320 b->auto_save_failure_time = -1; | 419 b->auto_save_failure_time = -1; |
| 322 b->read_only = Qnil; | 421 b->read_only = Qnil; |
| 323 b->overlays_before = Qnil; | 422 b->overlays_before = Qnil; |
| 324 b->overlays_after = Qnil; | 423 b->overlays_after = Qnil; |
| 325 XSETFASTINT (b->overlay_center, 1); | 424 XSETFASTINT (b->overlay_center, 1); |
| 326 b->mark_active = Qnil; | 425 b->mark_active = Qnil; |
| 327 | |
| 328 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */ | |
| 329 INITIALIZE_INTERVAL (b, NULL_INTERVAL); | |
| 330 } | 426 } |
| 331 | 427 |
| 332 /* Reset buffer B's local variables info. | 428 /* Reset buffer B's local variables info. |
| 333 Don't use this on a buffer that has already been in use; | 429 Don't use this on a buffer that has already been in use; |
| 334 it does not treat permanent locals consistently. | 430 it does not treat permanent locals consistently. |
| 350 b->minor_modes = Qnil; | 446 b->minor_modes = Qnil; |
| 351 b->downcase_table = Vascii_downcase_table; | 447 b->downcase_table = Vascii_downcase_table; |
| 352 b->upcase_table = Vascii_upcase_table; | 448 b->upcase_table = Vascii_upcase_table; |
| 353 b->case_canon_table = Vascii_canon_table; | 449 b->case_canon_table = Vascii_canon_table; |
| 354 b->case_eqv_table = Vascii_eqv_table; | 450 b->case_eqv_table = Vascii_eqv_table; |
| 451 b->buffer_file_type = Qnil; | |
| 355 #if 0 | 452 #if 0 |
| 356 b->sort_table = XSTRING (Vascii_sort_table); | 453 b->sort_table = XSTRING (Vascii_sort_table); |
| 357 b->folding_sort_table = XSTRING (Vascii_folding_sort_table); | 454 b->folding_sort_table = XSTRING (Vascii_folding_sort_table); |
| 358 #endif /* 0 */ | 455 #endif /* 0 */ |
| 359 | 456 |
| 436 { | 533 { |
| 437 if (NILP (buffer)) | 534 if (NILP (buffer)) |
| 438 return current_buffer->filename; | 535 return current_buffer->filename; |
| 439 CHECK_BUFFER (buffer, 0); | 536 CHECK_BUFFER (buffer, 0); |
| 440 return XBUFFER (buffer)->filename; | 537 return XBUFFER (buffer)->filename; |
| 538 } | |
| 539 | |
| 540 DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer, | |
| 541 0, 1, 0, | |
| 542 "Return the base buffer of indirect buffer BUFFER.\n\ | |
| 543 If BUFFER is not indirect, return nil.") | |
| 544 (buffer) | |
| 545 register Lisp_Object buffer; | |
| 546 { | |
| 547 struct buffer *base; | |
| 548 Lisp_Object base_buffer; | |
| 549 | |
| 550 if (NILP (buffer)) | |
| 551 base = current_buffer->base_buffer; | |
| 552 else | |
| 553 { | |
| 554 CHECK_BUFFER (buffer, 0); | |
| 555 base = XBUFFER (buffer)->base_buffer; | |
| 556 } | |
| 557 | |
| 558 if (! base) | |
| 559 return Qnil; | |
| 560 XSETBUFFER (base_buffer, base); | |
| 561 return base_buffer; | |
| 441 } | 562 } |
| 442 | 563 |
| 443 DEFUN ("buffer-local-variables", Fbuffer_local_variables, | 564 DEFUN ("buffer-local-variables", Fbuffer_local_variables, |
| 444 Sbuffer_local_variables, 0, 1, 0, | 565 Sbuffer_local_variables, 0, 1, 0, |
| 445 "Return an alist of variables that are buffer-local in BUFFER.\n\ | 566 "Return an alist of variables that are buffer-local in BUFFER.\n\ |
| 527 { | 648 { |
| 528 CHECK_BUFFER (buffer, 0); | 649 CHECK_BUFFER (buffer, 0); |
| 529 buf = XBUFFER (buffer); | 650 buf = XBUFFER (buffer); |
| 530 } | 651 } |
| 531 | 652 |
| 532 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil; | 653 return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil; |
| 533 } | 654 } |
| 534 | 655 |
| 535 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p, | 656 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p, |
| 536 1, 1, 0, | 657 1, 1, 0, |
| 537 "Mark current buffer as modified or unmodified according to FLAG.\n\ | 658 "Mark current buffer as modified or unmodified according to FLAG.\n\ |
| 547 If buffer becoming unmodified, unlock the file. */ | 668 If buffer becoming unmodified, unlock the file. */ |
| 548 | 669 |
| 549 fn = current_buffer->filename; | 670 fn = current_buffer->filename; |
| 550 if (!NILP (fn)) | 671 if (!NILP (fn)) |
| 551 { | 672 { |
| 552 already = current_buffer->save_modified < MODIFF; | 673 already = SAVE_MODIFF < MODIFF; |
| 553 if (!already && !NILP (flag)) | 674 if (!already && !NILP (flag)) |
| 554 lock_file (fn); | 675 lock_file (fn); |
| 555 else if (already && NILP (flag)) | 676 else if (already && NILP (flag)) |
| 556 unlock_file (fn); | 677 unlock_file (fn); |
| 557 } | 678 } |
| 558 #endif /* CLASH_DETECTION */ | 679 #endif /* CLASH_DETECTION */ |
| 559 | 680 |
| 560 current_buffer->save_modified = NILP (flag) ? MODIFF : 0; | 681 SAVE_MODIFF = NILP (flag) ? MODIFF : 0; |
| 561 update_mode_lines++; | 682 update_mode_lines++; |
| 562 return flag; | 683 return flag; |
| 563 } | 684 } |
| 564 | 685 |
| 565 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick, | 686 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick, |
| 760 | 881 |
| 761 b = XBUFFER (buf); | 882 b = XBUFFER (buf); |
| 762 | 883 |
| 763 /* Query if the buffer is still modified. */ | 884 /* Query if the buffer is still modified. */ |
| 764 if (INTERACTIVE && !NILP (b->filename) | 885 if (INTERACTIVE && !NILP (b->filename) |
| 765 && BUF_MODIFF (b) > b->save_modified) | 886 && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b)) |
| 766 { | 887 { |
| 767 GCPRO2 (buf, bufname); | 888 GCPRO2 (buf, bufname); |
| 768 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ", | 889 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ", |
| 769 XSTRING (b->name)->data)); | 890 XSTRING (b->name)->data)); |
| 770 UNGCPRO; | 891 UNGCPRO; |
| 805 return Qnil; | 926 return Qnil; |
| 806 | 927 |
| 807 if (NILP (b->name)) | 928 if (NILP (b->name)) |
| 808 return Qnil; | 929 return Qnil; |
| 809 | 930 |
| 931 /* When we kill a base buffer, kill all its indirect buffers. | |
| 932 We do it at this stage so nothing terrible happens if they | |
| 933 ask questions or their hooks get errors. */ | |
| 934 if (! b->base_buffer) | |
| 935 { | |
| 936 struct buffer *other; | |
| 937 | |
| 938 GCPRO1 (buf); | |
| 939 | |
| 940 for (other = all_buffers; other; other = other->next) | |
| 941 if (other->base_buffer == b) | |
| 942 { | |
| 943 Lisp_Object buf; | |
| 944 XSETBUFFER (buf, other); | |
| 945 Fkill_buffer (buf); | |
| 946 } | |
| 947 | |
| 948 UNGCPRO; | |
| 949 } | |
| 950 | |
| 810 /* Make this buffer not be current. | 951 /* Make this buffer not be current. |
| 811 In the process, notice if this is the sole visible buffer | 952 In the process, notice if this is the sole visible buffer |
| 812 and give up if so. */ | 953 and give up if so. */ |
| 813 if (b == current_buffer) | 954 if (b == current_buffer) |
| 814 { | 955 { |
| 841 tem = Fsymbol_value (intern ("delete-auto-save-files")); | 982 tem = Fsymbol_value (intern ("delete-auto-save-files")); |
| 842 if (! NILP (tem)) | 983 if (! NILP (tem)) |
| 843 internal_delete_file (b->auto_save_file_name); | 984 internal_delete_file (b->auto_save_file_name); |
| 844 } | 985 } |
| 845 | 986 |
| 846 /* Unchain all markers of this buffer | 987 if (! b->base_buffer) |
| 847 and leave them pointing nowhere. */ | 988 { |
| 848 for (tem = b->markers; !EQ (tem, Qnil); ) | 989 /* Unchain all markers of this buffer |
| 849 { | 990 and leave them pointing nowhere. */ |
| 850 m = XMARKER (tem); | 991 for (tem = BUF_MARKERS (b); !EQ (tem, Qnil); ) |
| 851 m->buffer = 0; | 992 { |
| 852 tem = m->chain; | 993 m = XMARKER (tem); |
| 853 m->chain = Qnil; | 994 m->buffer = 0; |
| 854 } | 995 tem = m->chain; |
| 855 b->markers = Qnil; | 996 m->chain = Qnil; |
| 856 | 997 } |
| 857 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */ | 998 BUF_MARKERS (b) = Qnil; |
| 858 INITIALIZE_INTERVAL (b, NULL_INTERVAL); | 999 |
| 859 /* Perhaps we should explicitly free the interval tree here... */ | 1000 #ifdef USE_TEXT_PROPERTIES |
| 1001 BUF_INTERVALS (b) = NULL_INTERVAL; | |
| 1002 #endif | |
| 1003 | |
| 1004 /* Perhaps we should explicitly free the interval tree here... */ | |
| 1005 } | |
| 860 | 1006 |
| 861 b->name = Qnil; | 1007 b->name = Qnil; |
| 1008 | |
| 862 BLOCK_INPUT; | 1009 BLOCK_INPUT; |
| 863 BUFFER_FREE (BUF_BEG_ADDR (b)); | 1010 if (! b->base_buffer) |
| 1011 BUFFER_FREE (BUF_BEG_ADDR (b)); | |
| 1012 | |
| 864 if (b->newline_cache) | 1013 if (b->newline_cache) |
| 865 { | 1014 { |
| 866 free_region_cache (b->newline_cache); | 1015 free_region_cache (b->newline_cache); |
| 867 b->newline_cache = 0; | 1016 b->newline_cache = 0; |
| 868 } | 1017 } |
| 1026 | 1175 |
| 1027 windows_or_buffers_changed = 1; | 1176 windows_or_buffers_changed = 1; |
| 1028 old_buf = current_buffer; | 1177 old_buf = current_buffer; |
| 1029 current_buffer = b; | 1178 current_buffer = b; |
| 1030 last_known_column_point = -1; /* invalidate indentation cache */ | 1179 last_known_column_point = -1; /* invalidate indentation cache */ |
| 1180 | |
| 1181 if (old_buf) | |
| 1182 { | |
| 1183 /* Put the undo list back in the base buffer, so that it appears | |
| 1184 that an indirect buffer shares the undo list of its base. */ | |
| 1185 if (old_buf->base_buffer) | |
| 1186 old_buf->base_buffer->undo_list = old_buf->undo_list; | |
| 1187 | |
| 1188 /* If the old current buffer has markers to record PT, BEGV and ZV | |
| 1189 when it is not current, update them now. */ | |
| 1190 if (! NILP (old_buf->pt_marker)) | |
| 1191 { | |
| 1192 Lisp_Object obuf; | |
| 1193 XSETBUFFER (obuf, old_buf); | |
| 1194 Fset_marker (old_buf->pt_marker, BUF_PT (old_buf), obuf); | |
| 1195 } | |
| 1196 if (! NILP (old_buf->begv_marker)) | |
| 1197 { | |
| 1198 Lisp_Object obuf; | |
| 1199 XSETBUFFER (obuf, old_buf); | |
| 1200 Fset_marker (old_buf->begv_marker, BUF_BEGV (old_buf), obuf); | |
| 1201 } | |
| 1202 if (! NILP (old_buf->zv_marker)) | |
| 1203 { | |
| 1204 Lisp_Object obuf; | |
| 1205 XSETBUFFER (obuf, old_buf); | |
| 1206 Fset_marker (old_buf->zv_marker, BUF_ZV (old_buf), obuf); | |
| 1207 } | |
| 1208 } | |
| 1209 | |
| 1210 /* Get the undo list from the base buffer, so that it appears | |
| 1211 that an indirect buffer shares the undo list of its base. */ | |
| 1212 if (b->base_buffer) | |
| 1213 b->undo_list = b->base_buffer->undo_list; | |
| 1214 | |
| 1215 /* If the new current buffer has markers to record PT, BEGV and ZV | |
| 1216 when it is not current, fetch them now. */ | |
| 1217 if (! NILP (b->pt_marker)) | |
| 1218 BUF_PT (b) = marker_position (b->pt_marker); | |
| 1219 if (! NILP (b->begv_marker)) | |
| 1220 BUF_BEGV (b) = marker_position (b->begv_marker); | |
| 1221 if (! NILP (b->zv_marker)) | |
| 1222 BUF_ZV (b) = marker_position (b->zv_marker); | |
| 1031 | 1223 |
| 1032 /* Look down buffer's list of local Lisp variables | 1224 /* Look down buffer's list of local Lisp variables |
| 1033 to find and update any that forward into C variables. */ | 1225 to find and update any that forward into C variables. */ |
| 1034 | 1226 |
| 1035 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr) | 1227 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr) |
| 1056 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem)))) | 1248 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem)))) |
| 1057 /* Just reference the variable | 1249 /* Just reference the variable |
| 1058 to cause it to become set for this buffer. */ | 1250 to cause it to become set for this buffer. */ |
| 1059 Fsymbol_value (XCONS (XCONS (tail)->car)->car); | 1251 Fsymbol_value (XCONS (XCONS (tail)->car)->car); |
| 1060 } | 1252 } |
| 1253 } | |
| 1254 | |
| 1255 /* Switch to buffer B temporarily for redisplay purposes. | |
| 1256 This avoids certain things thatdon't need to be done within redisplay. */ | |
| 1257 | |
| 1258 void | |
| 1259 set_buffer_temp (b) | |
| 1260 struct buffer *b; | |
| 1261 { | |
| 1262 register struct buffer *old_buf; | |
| 1263 | |
| 1264 if (current_buffer == b) | |
| 1265 return; | |
| 1266 | |
| 1267 old_buf = current_buffer; | |
| 1268 current_buffer = b; | |
| 1269 | |
| 1270 if (old_buf) | |
| 1271 { | |
| 1272 /* If the old current buffer has markers to record PT, BEGV and ZV | |
| 1273 when it is not current, update them now. */ | |
| 1274 if (! NILP (old_buf->pt_marker)) | |
| 1275 { | |
| 1276 Lisp_Object obuf; | |
| 1277 XSETBUFFER (obuf, old_buf); | |
| 1278 Fset_marker (old_buf->pt_marker, BUF_PT (old_buf), obuf); | |
| 1279 } | |
| 1280 if (! NILP (old_buf->begv_marker)) | |
| 1281 { | |
| 1282 Lisp_Object obuf; | |
| 1283 XSETBUFFER (obuf, old_buf); | |
| 1284 Fset_marker (old_buf->begv_marker, BUF_BEGV (old_buf), obuf); | |
| 1285 } | |
| 1286 if (! NILP (old_buf->zv_marker)) | |
| 1287 { | |
| 1288 Lisp_Object obuf; | |
| 1289 XSETBUFFER (obuf, old_buf); | |
| 1290 Fset_marker (old_buf->zv_marker, BUF_ZV (old_buf), obuf); | |
| 1291 } | |
| 1292 } | |
| 1293 | |
| 1294 /* If the new current buffer has markers to record PT, BEGV and ZV | |
| 1295 when it is not current, fetch them now. */ | |
| 1296 if (! NILP (b->pt_marker)) | |
| 1297 BUF_PT (b) = marker_position (b->pt_marker); | |
| 1298 if (! NILP (b->begv_marker)) | |
| 1299 BUF_BEGV (b) = marker_position (b->begv_marker); | |
| 1300 if (! NILP (b->zv_marker)) | |
| 1301 BUF_ZV (b) = marker_position (b->zv_marker); | |
| 1061 } | 1302 } |
| 1062 | 1303 |
| 1063 DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, | 1304 DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, |
| 1064 "Make the buffer BUFFER current for editing operations.\n\ | 1305 "Make the buffer BUFFER current for editing operations.\n\ |
| 1065 BUFFER may be a buffer or the name of an existing buffer.\n\ | 1306 BUFFER may be a buffer or the name of an existing buffer.\n\ |
| 1205 /* Identify the current buffer. */ | 1446 /* Identify the current buffer. */ |
| 1206 if (b == old) | 1447 if (b == old) |
| 1207 XSETFASTINT (desired_point, PT); | 1448 XSETFASTINT (desired_point, PT); |
| 1208 write_string (b == old ? "." : " ", -1); | 1449 write_string (b == old ? "." : " ", -1); |
| 1209 /* Identify modified buffers */ | 1450 /* Identify modified buffers */ |
| 1210 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1); | 1451 write_string (BUF_MODIFF (b) > BUF_SAVE_MODIFF (b) ? "*" : " ", -1); |
| 1211 /* The current buffer is special-cased to be marked read-only. | 1452 /* The current buffer is special-cased to be marked read-only. |
| 1212 It is actually made read-only by the call to | 1453 It is actually made read-only by the call to |
| 1213 Buffer-menu-mode, below. */ | 1454 Buffer-menu-mode, below. */ |
| 1214 write_string ((b != current_buffer && NILP (b->read_only)) | 1455 write_string ((b != current_buffer && NILP (b->read_only)) |
| 1215 ? " " : "% ", -1); | 1456 ? " " : "% ", -1); |
| 2538 are initialized reasonably, so mark_buffer won't choke. */ | 2779 are initialized reasonably, so mark_buffer won't choke. */ |
| 2539 reset_buffer (&buffer_defaults); | 2780 reset_buffer (&buffer_defaults); |
| 2540 reset_buffer_local_variables (&buffer_defaults); | 2781 reset_buffer_local_variables (&buffer_defaults); |
| 2541 reset_buffer (&buffer_local_symbols); | 2782 reset_buffer (&buffer_local_symbols); |
| 2542 reset_buffer_local_variables (&buffer_local_symbols); | 2783 reset_buffer_local_variables (&buffer_local_symbols); |
| 2784 /* Prevent GC from getting confused. */ | |
| 2785 buffer_defaults.text = &buffer_defaults.own_text; | |
| 2786 buffer_local_symbols.text = &buffer_local_symbols.own_text; | |
| 2787 #ifdef USE_TEXT_PROPERTIES | |
| 2788 BUF_INTERVALS (&buffer_defaults) = 0; | |
| 2789 BUF_INTERVALS (&buffer_local_symbols) = 0; | |
| 2790 #endif | |
| 2543 XSETBUFFER (Vbuffer_defaults, &buffer_defaults); | 2791 XSETBUFFER (Vbuffer_defaults, &buffer_defaults); |
| 2544 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols); | 2792 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols); |
| 2545 | 2793 |
| 2546 /* Set up the default values of various buffer slots. */ | 2794 /* Set up the default values of various buffer slots. */ |
| 2547 /* Must do these before making the first buffer! */ | 2795 /* Must do these before making the first buffer! */ |
| 3122 | 3370 |
| 3123 defsubr (&Sbuffer_list); | 3371 defsubr (&Sbuffer_list); |
| 3124 defsubr (&Sget_buffer); | 3372 defsubr (&Sget_buffer); |
| 3125 defsubr (&Sget_file_buffer); | 3373 defsubr (&Sget_file_buffer); |
| 3126 defsubr (&Sget_buffer_create); | 3374 defsubr (&Sget_buffer_create); |
| 3375 defsubr (&Smake_indirect_buffer); | |
| 3127 defsubr (&Sgenerate_new_buffer_name); | 3376 defsubr (&Sgenerate_new_buffer_name); |
| 3128 defsubr (&Sbuffer_name); | 3377 defsubr (&Sbuffer_name); |
| 3129 /*defsubr (&Sbuffer_number);*/ | 3378 /*defsubr (&Sbuffer_number);*/ |
| 3130 defsubr (&Sbuffer_file_name); | 3379 defsubr (&Sbuffer_file_name); |
| 3380 defsubr (&Sbuffer_base_buffer); | |
| 3131 defsubr (&Sbuffer_local_variables); | 3381 defsubr (&Sbuffer_local_variables); |
| 3132 defsubr (&Sbuffer_modified_p); | 3382 defsubr (&Sbuffer_modified_p); |
| 3133 defsubr (&Sset_buffer_modified_p); | 3383 defsubr (&Sset_buffer_modified_p); |
| 3134 defsubr (&Sbuffer_modified_tick); | 3384 defsubr (&Sbuffer_modified_tick); |
| 3135 defsubr (&Srename_buffer); | 3385 defsubr (&Srename_buffer); |
