From 362df0f7938a0e6147ecf886655a0689430d426d Mon Sep 17 00:00:00 2001 From: Ibby <33922797+SleepySwords@users.noreply.github.com> Date: Sat, 26 Aug 2023 21:39:05 +1000 Subject: [PATCH] fix(extmarks): wrong display when changing text with virt_lines (#24879) --- src/nvim/change.c | 7 ++- test/functional/ui/decorations_spec.lua | 57 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/nvim/change.c b/src/nvim/change.c index 067b48faee..084a8a1897 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -319,7 +319,12 @@ static void changed_common(buf_T *buf, linenr_T lnum, colnr_T col, linenr_T lnum if (wp->w_lines[i].wl_lnum >= lnum) { // Do not change wl_lnum at index zero, it is used to // compare with w_topline. Invalidate it instead. - if (wp->w_lines[i].wl_lnum < lnume || i == 0) { + // If the buffer has virt_lines, invalidate the line + // after the changed lines as the virt_lines for a + // changed line may become invalid. + if (i == 0 || wp->w_lines[i].wl_lnum < lnume + || (wp->w_lines[i].wl_lnum == lnume + && wp->w_buffer->b_virt_line_blocks > 0)) { // line included in change wp->w_lines[i].wl_valid = false; } else if (xtra != 0) { diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua index 0a3a2e4e29..36d6fea1de 100644 --- a/test/functional/ui/decorations_spec.lua +++ b/test/functional/ui/decorations_spec.lua @@ -3784,6 +3784,63 @@ if (h->n_buckets < new_n_buckets) { // expand ]]} end) + it('works when using dd or yyp #23915 #23916', function() + insert([[ + line1 + line2 + line3 + line4 + line5]]) + meths.buf_set_extmark(0, ns, 0, 0, {virt_lines={{{"foo"}}, {{"bar"}}, {{"baz"}}}}) + screen:expect{grid=[[ + line1 | + foo | + bar | + baz | + line2 | + line3 | + line4 | + line^5 | + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]} + + feed('gg') + feed('dd') + screen:expect{grid=[[ + ^line2 | + foo | + bar | + baz | + line3 | + line4 | + line5 | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]} + + feed('yyp') + screen:expect{grid=[[ + line2 | + foo | + bar | + baz | + ^line2 | + line3 | + line4 | + line5 | + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]} + end) + end) describe('decorations: signs', function()