diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 012cce7b22..ed22f71239 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -1796,8 +1796,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange, if (has_decor && v >= 0) { bool selected = (area_active || (area_highlighting && noinvcur && wlv.vcol == wp->w_virtcol)); - extmark_attr = decor_redraw_col(wp, (colnr_T)v, wlv.off, - selected, &decor_state); + extmark_attr = decor_redraw_col(wp, (colnr_T)v, wlv.off, selected, &decor_state); // we could already be inside an existing virt_line with multiple chunks if (!(virt_inline_i < kv_size(virt_inline))) { diff --git a/src/nvim/plines.c b/src/nvim/plines.c index 738057b696..dd4955c352 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -396,12 +396,13 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp) mtkey_t mark = marktree_itr_current(cts->cts_iter); if (mark.pos.row != cts->cts_row || mark.pos.col > col) { break; - } else if (mark.pos.col == col) { // TODO: or maybe unconditionally, what if byte-misaligned? + } else if (mark.pos.col + == col) { // TODO(bfredl): or maybe unconditionally, what if byte-misaligned? if (!mt_end(mark)) { Decoration decor = get_decor(mark); if (decor.virt_text_pos == kVTInline) { - cts->cts_cur_text_width = decor.virt_text_width; - size += cts->cts_cur_text_width; + cts->cts_cur_text_width += decor.virt_text_width; + size += decor.virt_text_width; } } } diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua index 80dfebd33e..d029a66301 100644 --- a/test/functional/ui/decorations_spec.lua +++ b/test/functional/ui/decorations_spec.lua @@ -1245,6 +1245,33 @@ end]] | ]]} end) + + it('cursor positions are correct with multiple inline virtual text', function() + insert('12345678') + meths.buf_set_extmark(0, ns, 0, 4, + { virt_text = { { ' virtual text ', 'Special' } }, virt_text_pos = 'inline' }) + meths.buf_set_extmark(0, ns, 0, 4, + { virt_text = { { ' virtual text ', 'Special' } }, virt_text_pos = 'inline' }) + feed '^' + feed '4l' + screen:expect { grid = [[ + 1234{28: virtual text virtual text }^5678 | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]} + end) end) describe('decorations: virtual lines', function()