neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 592a8f1e90d5abaa695280bf6d41a547b3631d0d
parent a1bec02c1e105eb9f49d577e04bdbeadd5a05e38
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Fri,  1 Sep 2023 06:45:27 +0800

vim-patch:9.0.1828: cursor wrong with virt text before double-width char (#24967)

Problem:  Wrong cursor position with virtual text before double-width
          char at window edge.
Solution: Check for double-width char before adding virtual text size.

closes: vim/vim#12977

https://github.com/vim/vim/commit/ac2d8815ae7a93c54b07cba76475cfb3f26a3ac6
Diffstat:
Msrc/nvim/plines.c | 4++--
Mtest/functional/ui/decorations_spec.lua | 13+++++++++++++
2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/nvim/plines.c b/src/nvim/plines.c @@ -216,6 +216,7 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp) if (*s == NUL && !has_lcs_eol) { size = 0; // NUL is not displayed } + bool is_doublewidth = size == 2 && MB_BYTE2LEN((uint8_t)(*s)) > 1; if (cts->cts_has_virt_text) { int tab_size = size; @@ -247,8 +248,7 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp) } } - if (size == 2 && MB_BYTE2LEN((uint8_t)(*s)) > 1 - && wp->w_p_wrap && in_win_border(wp, vcol)) { + if (is_doublewidth && wp->w_p_wrap && in_win_border(wp, vcol + size - 2)) { // Count the ">" in the last column. size++; mb_added = 1; diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua @@ -3244,6 +3244,19 @@ describe('decorations: inline virtual text', function() | ]]} end) + + it('before double-width char that wraps', function() + exec([[ + call setline(1, repeat('a', 40) .. '口' .. '12345') + normal! $ + ]]) + meths.buf_set_extmark(0, ns, 0, 40, { virt_text = { { ('b'):rep(9) } }, virt_text_pos = 'inline' }) + screen:expect{grid=[[ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbb{1:>}| + 口1234^5 | + | + ]]} + end) end) describe('decorations: virtual lines', function()