diff options
| author | Stefan Monnier | 2022-11-03 22:44:55 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2022-11-03 22:44:55 -0400 |
| commit | ff679e16f8bf8a9876fc1a980c372d4e55f3745d (patch) | |
| tree | 187712c5c9957fde923430d14ec6fd59f5441be4 /src/buffer.c | |
| parent | 7d47651d0168c863ad9e9b07921a42dc18029276 (diff) | |
| download | emacs-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.c | 8 |
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 | ||
| 3456 | void | 3456 | void |
| 3457 | adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length) | 3457 | adjust_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 | ||