commit 362df0f7938a0e6147ecf886655a0689430d426d
parent 1bdcb9aaf11e914d4c7af14e8e5be4ed3c5798ae
Author: Ibby <33922797+SleepySwords@users.noreply.github.com>
Date: Sat, 26 Aug 2023 21:39:05 +1000
fix(extmarks): wrong display when changing text with virt_lines (#24879)
Diffstat:
2 files changed, 63 insertions(+), 1 deletion(-)
diff --git 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
@@ -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()