From 128091a256d64db2f983d70a888b379d7e63f131 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 24 Aug 2023 07:27:18 +0800 Subject: fix(ui): wrong cursor position with left gravity inline virt text at eol --- src/nvim/move.c | 9 --------- src/nvim/plines.c | 8 ++++++-- 2 files changed, 6 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/nvim/move.c b/src/nvim/move.c index 0077dc3102..3978539df6 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -862,15 +862,6 @@ void curs_columns(win_T *wp, int may_scroll) n = (wp->w_wcol - wp->w_width_inner) / width2 + 1; wp->w_wcol -= n * width2; wp->w_wrow += n; - - // When cursor wraps to first char of next line in Insert - // mode, the 'showbreak' string isn't shown, backup to first - // column - char *const sbr = get_showbreak_value(wp); - if (*sbr && *get_cursor_pos_ptr() == NUL - && wp->w_wcol == (wp->w_width_inner - width2) + vim_strsize(sbr)) { - wp->w_wcol = 0; - } } } else if (may_scroll && !wp->w_cline_folded) { diff --git a/src/nvim/plines.c b/src/nvim/plines.c index c95f362518..b95adc1415 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -359,7 +359,7 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp) if (width <= 0) { width = 1; } - // divide "size - prev_width" by "width", rounding up + // Divide "size - prev_rem" by "width", rounding up. int cnt = (size - prev_rem + width - 1) / width; added += cnt * head_mid; @@ -371,7 +371,11 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp) } else if (max_head_vcol < 0) { int off = virt_text_cursor_off(cts, c == NUL); if (off >= prev_rem) { - head += (1 + (off - prev_rem) / width) * head_mid; + if (size > off) { + head += (1 + (off - prev_rem) / width) * head_mid; + } else { + head += (off - prev_rem + width - 1) / width * head_mid; + } } } } -- cgit From c70aa84b2a79e8ac83a930dd5bf473940274cf1c Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 28 Aug 2023 05:51:19 +0800 Subject: vim-patch:9.0.1800: Cursor position still wrong with 'showbreak' and virtual text Problem: Cursor position still wrong with 'showbreak' and virtual text after last character or 'listchars' "eol". Solution: Remove unnecessary w_wcol adjustment in curs_columns(). Also fix first char of virtual text not shown at the start of a screen line. closes: vim/vim#12478 closes: vim/vim#12532 closes: vim/vim#12904 https://github.com/vim/vim/commit/6a3897232aecd3e8b9e8b23955e55c1993e5baec --- src/nvim/drawline.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 31ca9b16ce..7e92128b65 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -868,8 +868,8 @@ static void apply_cursorline_highlight(win_T *wp, winlinevars_T *wlv) } } -// Checks if there is more inline virtual text that need to be drawn -// and sets has_more_virt_inline_chunks to reflect that. +/// Checks if there is more inline virtual text that need to be drawn +/// and sets has_more_virt_inline_chunks to reflect that. static bool has_more_inline_virt(winlinevars_T *wlv, ptrdiff_t v) { DecorState *state = &decor_state; @@ -3096,8 +3096,8 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool number_onl || wlv.filler_todo > 0 || (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL && wlv.p_extra != at_end_str) - || (wlv.n_extra != 0 - && (wlv.c_extra != NUL || *wlv.p_extra != NUL)) || wlv.more_virt_inline_chunks)) { + || (wlv.n_extra != 0 && (wlv.c_extra != NUL || *wlv.p_extra != NUL)) + || wlv.more_virt_inline_chunks)) { bool wrap = wp->w_p_wrap // Wrapping enabled. && wlv.filler_todo <= 0 // Not drawing diff filler lines. && lcs_eol_one != -1 // Haven't printed the lcs_eol character. -- cgit