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>
This commit is contained in:
zeertzjq
2023-08-28 21:20:16 +02:00
committed by Christian Brabandt
parent 93ebb5e75e
commit 1d3e0e8f31
4 changed files with 22 additions and 23 deletions

View File

@ -1319,6 +1319,9 @@ win_lbr_chartabsize(
vcol -= wp->w_virtcol_first_char; vcol -= wp->w_virtcol_first_char;
#endif #endif
colnr_T wcol = vcol + col_off_prev; 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 // cells taken by 'showbreak'/'breakindent' before current char
int head_prev = 0; int head_prev = 0;
if (wcol >= wp->w_width) if (wcol >= wp->w_width)
@ -1332,23 +1335,18 @@ win_lbr_chartabsize(
if (wp->w_p_bri) if (wp->w_p_bri)
head_prev += get_breakindent_win(wp, line); head_prev += get_breakindent_win(wp, line);
if (wcol < head_prev) 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; added += head_prev;
if (max_head_vcol <= 0 || vcol < max_head_vcol) if (max_head_vcol <= 0 || vcol < max_head_vcol)
head += head_prev; head += head_prev;
} }
wcol += col_off_prev;
}
if (wcol + size > wp->w_width)
{
// cells taken by 'showbreak'/'breakindent' halfway current char // cells taken by 'showbreak'/'breakindent' halfway current char
int head_mid = 0; int head_mid = 0;
if (*sbr != NUL) if (*sbr != NUL)
@ -1384,9 +1382,9 @@ win_lbr_chartabsize(
} }
#endif #endif
} }
size += added;
} }
size += added;
} }
if (headp != NULL) if (headp != NULL)
*headp = head; *headp = head;

View File

@ -2887,14 +2887,6 @@ win_line(
wlv.n_extra = win_lbr_chartabsize(&cts, NULL) - 1; wlv.n_extra = win_lbr_chartabsize(&cts, NULL) - 1;
clear_chartabsize_arg(&cts); 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) if (on_last_col && c != TAB)
// Do not continue search/match highlighting over the // Do not continue search/match highlighting over the
// line break, but for TABs the highlighting should // line break, but for TABs the highlighting should

View File

@ -410,12 +410,19 @@ func Test_display_linebreak_breakat()
new new
vert resize 25 vert resize 25
let _breakat = &breakat let _breakat = &breakat
setl signcolumn=yes linebreak breakat=) showbreak=+\ setl signcolumn=yes linebreak breakat=) showbreak=++
call setline(1, repeat('x', winwidth(0) - 2) .. ')abc') call setline(1, repeat('x', winwidth(0) - 2) .. ')abc')
let lines = ScreenLines([1, 2], 25) let lines = ScreenLines([1, 2], 25)
let expected = [ let expected = [
\ ' xxxxxxxxxxxxxxxxxxxxxxx', \ ' 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) call assert_equal(expected, lines)
%bw! %bw!

View File

@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1813,
/**/ /**/
1812, 1812,
/**/ /**/