aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorStefan Monnier2022-11-03 22:44:55 -0400
committerStefan Monnier2022-11-03 22:44:55 -0400
commitff679e16f8bf8a9876fc1a980c372d4e55f3745d (patch)
tree187712c5c9957fde923430d14ec6fd59f5441be4 /src/buffer.c
parent7d47651d0168c863ad9e9b07921a42dc18029276 (diff)
downloademacs-ff679e16f8bf8a9876fc1a980c372d4e55f3745d.tar.gz
emacs-ff679e16f8bf8a9876fc1a980c372d4e55f3745d.zip
itree: Reproduce markers's behavior more faithfully (bug#58928)
The most obvious problem was the lack of support for `insert-before-markers`, but the behavior was also different in a few other cases. * src/itree.h (itree_insert_gap): * src/itree.c (itree_insert_gap): Add `before_markers` arg. * src/lisp.h (adjust_overlays_for_insert): * src/buffer.c (adjust_overlays_for_insert): Add `before_markers` arg. * src/insdel.c (adjust_markers_for_replace, adjust_markers_for_insert) (adjust_markers_for_delete): Adjust overlays directly from here. (insert_1_both, insert_from_string_1, insert_from_gap) (insert_from_buffer_1, adjust_after_replace, replace_range) (replace_range_2, del_range_2): Don't adjust overlays explicitly here any more. * test/src/buffer-tests.el (test-overlay-insert-before-markers-empty) (test-overlay-insert-before-markers-non-empty): New tests.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 3b0e6f1f9a1..ee0b7e13508 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3454,20 +3454,20 @@ overlay_strings (ptrdiff_t pos, struct window *w, unsigned char **pstr)
3454 3454
3455 3455
3456void 3456void
3457adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length) 3457adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length, bool before_markers)
3458{ 3458{
3459 if (!current_buffer->indirections) 3459 if (!current_buffer->indirections)
3460 itree_insert_gap (current_buffer->overlays, pos, length); 3460 itree_insert_gap (current_buffer->overlays, pos, length, before_markers);
3461 else 3461 else
3462 { 3462 {
3463 struct buffer *base = current_buffer->base_buffer 3463 struct buffer *base = current_buffer->base_buffer
3464 ? current_buffer->base_buffer 3464 ? current_buffer->base_buffer
3465 : current_buffer; 3465 : current_buffer;
3466 Lisp_Object tail, other; 3466 Lisp_Object tail, other;
3467 itree_insert_gap (base->overlays, pos, length); 3467 itree_insert_gap (base->overlays, pos, length, before_markers);
3468 FOR_EACH_LIVE_BUFFER (tail, other) 3468 FOR_EACH_LIVE_BUFFER (tail, other)
3469 if (XBUFFER (other)->base_buffer == base) 3469 if (XBUFFER (other)->base_buffer == base)
3470 itree_insert_gap (XBUFFER (other)->overlays, pos, length); 3470 itree_insert_gap (XBUFFER (other)->overlays, pos, length, before_markers);
3471 } 3471 }
3472} 3472}
3473 3473