Mercurial > vim
changeset 33045:0561bf3ba10c v9.0.1813
patch 9.0.1813: linebreak incorrect drawn with breakindent
Commit: https://github.com/vim/vim/commit/1d3e0e8f3110a7807431eae056914ccea57b057b
Author: zeertzjq <zeertzjq@outlook.com>
Date: Mon Aug 28 21:20:16 2023 +0200
patch 9.0.1813: linebreak incorrect drawn with breakindent
Problem: 'linebreak' is incorrectly drawn after 'breakindent'.
Solution: Don't include 'breakindent' size when already after it.
closes: #12937
closes: #12940
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 28 Aug 2023 21:30:08 +0200 |
parents | 52436021677f |
children | 29b9f832b7d3 |
files | src/charset.c src/drawline.c src/testdir/test_display.vim src/version.c |
diffstat | 4 files changed, 22 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/src/charset.c +++ b/src/charset.c @@ -1319,6 +1319,9 @@ win_lbr_chartabsize( vcol -= wp->w_virtcol_first_char; #endif colnr_T wcol = vcol + col_off_prev; + colnr_T max_head_vcol = cts->cts_max_head_vcol; + int added = 0; + // cells taken by 'showbreak'/'breakindent' before current char int head_prev = 0; if (wcol >= wp->w_width) @@ -1332,23 +1335,18 @@ win_lbr_chartabsize( if (wp->w_p_bri) head_prev += get_breakindent_win(wp, line); if (wcol < head_prev) - wcol = head_prev; - wcol += col_off_prev; - } - - if ((vcol > 0 && wcol == col_off_prev + head_prev) - || wcol + size > wp->w_width) - { - int added = 0; - colnr_T max_head_vcol = cts->cts_max_head_vcol; - - if (vcol > 0 && wcol == col_off_prev + head_prev) { + head_prev -= wcol; + wcol += head_prev; added += head_prev; if (max_head_vcol <= 0 || vcol < max_head_vcol) head += head_prev; } + wcol += col_off_prev; + } + if (wcol + size > wp->w_width) + { // cells taken by 'showbreak'/'breakindent' halfway current char int head_mid = 0; if (*sbr != NUL) @@ -1384,9 +1382,9 @@ win_lbr_chartabsize( } #endif } + } - size += added; - } + size += added; } if (headp != NULL) *headp = head;
--- a/src/drawline.c +++ b/src/drawline.c @@ -2887,14 +2887,6 @@ win_line( wlv.n_extra = win_lbr_chartabsize(&cts, NULL) - 1; clear_chartabsize_arg(&cts); - // We have just drawn the showbreak value, no need to add - // space for it again. - if (wlv.vcol == wlv.vcol_sbr) - { - wlv.n_extra -= MB_CHARLEN(get_showbreak_value(wp)); - if (wlv.n_extra < 0) - wlv.n_extra = 0; - } if (on_last_col && c != TAB) // Do not continue search/match highlighting over the // line break, but for TABs the highlighting should
--- a/src/testdir/test_display.vim +++ b/src/testdir/test_display.vim @@ -410,12 +410,19 @@ func Test_display_linebreak_breakat() new vert resize 25 let _breakat = &breakat - setl signcolumn=yes linebreak breakat=) showbreak=+\ + setl signcolumn=yes linebreak breakat=) showbreak=++ call setline(1, repeat('x', winwidth(0) - 2) .. ')abc') let lines = ScreenLines([1, 2], 25) let expected = [ \ ' xxxxxxxxxxxxxxxxxxxxxxx', - \ ' + )abc ' + \ ' ++)abc ', + \ ] + call assert_equal(expected, lines) + setl breakindent breakindentopt=shift:2 + let lines = ScreenLines([1, 2], 25) + let expected = [ + \ ' xxxxxxxxxxxxxxxxxxxxxxx', + \ ' ++)abc ', \ ] call assert_equal(expected, lines) %bw!