diff options
author | Ibby <33922797+SleepySwords@users.noreply.github.com> | 2023-08-26 21:39:05 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-26 19:39:05 +0800 |
commit | 362df0f7938a0e6147ecf886655a0689430d426d (patch) | |
tree | d92481ed05770f42eb707a1626f161990c567b80 | |
parent | 1bdcb9aaf11e914d4c7af14e8e5be4ed3c5798ae (diff) | |
download | rneovim-362df0f7938a0e6147ecf886655a0689430d426d.tar.gz rneovim-362df0f7938a0e6147ecf886655a0689430d426d.tar.bz2 rneovim-362df0f7938a0e6147ecf886655a0689430d426d.zip |
fix(extmarks): wrong display when changing text with virt_lines (#24879)
-rw-r--r-- | src/nvim/change.c | 7 | ||||
-rw-r--r-- | test/functional/ui/decorations_spec.lua | 57 |
2 files changed, 63 insertions, 1 deletions
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() |