mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 9.0.0995: padding before virtual text is highlighted
Problem: Padding before virtual text below is highlighted when 'number' and 'nowrap' are set. Solution: Save and restore n_attr_skip. (closes #11643)
This commit is contained in:
parent
267db7c3e3
commit
37f088eead
@ -141,6 +141,7 @@ typedef struct {
|
|||||||
char_u *p_extra_free; // p_extra buffer that needs to be freed
|
char_u *p_extra_free; // p_extra buffer that needs to be freed
|
||||||
int extra_attr; // attributes for p_extra, should be combined
|
int extra_attr; // attributes for p_extra, should be combined
|
||||||
// with win_attr if needed
|
// with win_attr if needed
|
||||||
|
int n_attr_skip; // chars to skip before using extra_attr
|
||||||
int c_extra; // extra chars, all the same
|
int c_extra; // extra chars, all the same
|
||||||
int c_final; // final char, mandatory if set
|
int c_final; // final char, mandatory if set
|
||||||
int extra_for_textprop; // wlv.n_extra set for textprop
|
int extra_for_textprop; // wlv.n_extra set for textprop
|
||||||
@ -149,6 +150,7 @@ typedef struct {
|
|||||||
int saved_n_extra;
|
int saved_n_extra;
|
||||||
char_u *saved_p_extra;
|
char_u *saved_p_extra;
|
||||||
int saved_extra_attr;
|
int saved_extra_attr;
|
||||||
|
int saved_n_attr_skip;
|
||||||
int saved_extra_for_textprop;
|
int saved_extra_for_textprop;
|
||||||
int saved_c_extra;
|
int saved_c_extra;
|
||||||
int saved_c_final;
|
int saved_c_final;
|
||||||
@ -652,13 +654,10 @@ text_prop_position(
|
|||||||
int strsize = vim_strsize(*p_extra);
|
int strsize = vim_strsize(*p_extra);
|
||||||
int cells = wrap ? strsize : textprop_size_after_trunc(wp,
|
int cells = wrap ? strsize : textprop_size_after_trunc(wp,
|
||||||
tp->tp_flags, before, padding, *p_extra, &n_used);
|
tp->tp_flags, before, padding, *p_extra, &n_used);
|
||||||
int cont_on_next_line = below && col_with_padding > win_col_off(wp)
|
|
||||||
&& !wp->w_p_wrap;
|
|
||||||
|
|
||||||
if (wrap || right || above || below || padding > 0 || n_used < *n_extra)
|
if (wrap || right || above || below || padding > 0 || n_used < *n_extra)
|
||||||
{
|
{
|
||||||
int col_off = win_col_off(wp) - win_col_off2(wp);
|
int col_off = win_col_off(wp) - win_col_off2(wp);
|
||||||
int skip_add = 0;
|
|
||||||
|
|
||||||
if (above)
|
if (above)
|
||||||
{
|
{
|
||||||
@ -690,14 +689,10 @@ text_prop_position(
|
|||||||
before = 0;
|
before = 0;
|
||||||
else
|
else
|
||||||
n_used = *n_extra;
|
n_used = *n_extra;
|
||||||
skip_add = col_off;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
before = 0;
|
before = 0;
|
||||||
}
|
}
|
||||||
else if (below && before > 0)
|
|
||||||
// include 'number' column et al.
|
|
||||||
skip_add = col_off;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// With 'nowrap' add one to show the "extends" character if needed (it
|
// With 'nowrap' add one to show the "extends" character if needed (it
|
||||||
@ -707,8 +702,6 @@ text_prop_position(
|
|||||||
&& wp->w_lcs_chars.ext != NUL
|
&& wp->w_lcs_chars.ext != NUL
|
||||||
&& wp->w_p_list)
|
&& wp->w_p_list)
|
||||||
++n_used;
|
++n_used;
|
||||||
if (!wp->w_p_wrap && below && padding > 0)
|
|
||||||
skip_add = col_off;
|
|
||||||
|
|
||||||
// add 1 for NUL, 2 for when '…' is used
|
// add 1 for NUL, 2 for when '…' is used
|
||||||
if (n_attr != NULL)
|
if (n_attr != NULL)
|
||||||
@ -763,10 +756,9 @@ text_prop_position(
|
|||||||
if (above)
|
if (above)
|
||||||
*n_attr -= padding + after;
|
*n_attr -= padding + after;
|
||||||
|
|
||||||
// Add "skip_add" when starting a new line or wrapping,
|
// n_attr_skip will not be decremented before draw_state is
|
||||||
// n_attr_skip will then be decremented in the number column.
|
// WL_LINE
|
||||||
*n_attr_skip = before + padding
|
*n_attr_skip = before + padding;
|
||||||
+ (cont_on_next_line || before > 0 ? skip_add : 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -946,6 +938,7 @@ win_line_start(win_T *wp UNUSED, winlinevars_T *wlv, int save_extra)
|
|||||||
wlv->saved_n_extra = wlv->n_extra;
|
wlv->saved_n_extra = wlv->n_extra;
|
||||||
wlv->saved_p_extra = wlv->p_extra;
|
wlv->saved_p_extra = wlv->p_extra;
|
||||||
wlv->saved_extra_attr = wlv->extra_attr;
|
wlv->saved_extra_attr = wlv->extra_attr;
|
||||||
|
wlv->saved_n_attr_skip = wlv->n_attr_skip;
|
||||||
wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
|
wlv->saved_extra_for_textprop = wlv->extra_for_textprop;
|
||||||
wlv->saved_c_extra = wlv->c_extra;
|
wlv->saved_c_extra = wlv->c_extra;
|
||||||
wlv->saved_c_final = wlv->c_final;
|
wlv->saved_c_final = wlv->c_final;
|
||||||
@ -959,7 +952,10 @@ win_line_start(win_T *wp UNUSED, winlinevars_T *wlv, int save_extra)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
wlv->saved_char_attr = 0;
|
wlv->saved_char_attr = 0;
|
||||||
|
|
||||||
|
// these are not used until restored in win_line_continue()
|
||||||
wlv->n_extra = 0;
|
wlv->n_extra = 0;
|
||||||
|
wlv->n_attr_skip = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -978,6 +974,7 @@ win_line_continue(winlinevars_T *wlv)
|
|||||||
wlv->c_final = wlv->saved_c_final;
|
wlv->c_final = wlv->saved_c_final;
|
||||||
wlv->p_extra = wlv->saved_p_extra;
|
wlv->p_extra = wlv->saved_p_extra;
|
||||||
wlv->extra_attr = wlv->saved_extra_attr;
|
wlv->extra_attr = wlv->saved_extra_attr;
|
||||||
|
wlv->n_attr_skip = wlv->saved_n_attr_skip;
|
||||||
wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
|
wlv->extra_for_textprop = wlv->saved_extra_for_textprop;
|
||||||
wlv->char_attr = wlv->saved_char_attr;
|
wlv->char_attr = wlv->saved_char_attr;
|
||||||
}
|
}
|
||||||
@ -1021,7 +1018,6 @@ win_line(
|
|||||||
// prec until it's been used
|
// prec until it's been used
|
||||||
|
|
||||||
int n_attr = 0; // chars with special attr
|
int n_attr = 0; // chars with special attr
|
||||||
int n_attr_skip = 0; // chars to skip bef. using wlv.extra_attr
|
|
||||||
int saved_attr2 = 0; // char_attr saved for n_attr
|
int saved_attr2 = 0; // char_attr saved for n_attr
|
||||||
int n_attr3 = 0; // chars with overruling special attr
|
int n_attr3 = 0; // chars with overruling special attr
|
||||||
int saved_attr3 = 0; // char_attr saved for n_attr3
|
int saved_attr3 = 0; // char_attr saved for n_attr3
|
||||||
@ -2063,7 +2059,7 @@ win_line(
|
|||||||
wlv.vcol,
|
wlv.vcol,
|
||||||
wlv.col,
|
wlv.col,
|
||||||
&wlv.n_extra, &wlv.p_extra,
|
&wlv.n_extra, &wlv.p_extra,
|
||||||
&n_attr, &n_attr_skip);
|
&n_attr, &wlv.n_attr_skip);
|
||||||
if (wlv.p_extra != prev_p_extra)
|
if (wlv.p_extra != prev_p_extra)
|
||||||
{
|
{
|
||||||
// wlv.p_extra was allocated
|
// wlv.p_extra was allocated
|
||||||
@ -2105,9 +2101,9 @@ win_line(
|
|||||||
{
|
{
|
||||||
wlv.n_extra -= skip_cells;
|
wlv.n_extra -= skip_cells;
|
||||||
wlv.p_extra += skip_cells;
|
wlv.p_extra += skip_cells;
|
||||||
n_attr_skip -= skip_cells;
|
wlv.n_attr_skip -= skip_cells;
|
||||||
if (n_attr_skip < 0)
|
if (wlv.n_attr_skip < 0)
|
||||||
n_attr_skip = 0;
|
wlv.n_attr_skip = 0;
|
||||||
skip_cells = 0;
|
skip_cells = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2116,7 +2112,7 @@ win_line(
|
|||||||
// it and advance to the next one
|
// it and advance to the next one
|
||||||
skip_cells -= wlv.n_extra;
|
skip_cells -= wlv.n_extra;
|
||||||
wlv.n_extra = 0;
|
wlv.n_extra = 0;
|
||||||
n_attr_skip = 0;
|
wlv.n_attr_skip = 0;
|
||||||
bail_out = TRUE;
|
bail_out = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3337,8 +3333,8 @@ win_line(
|
|||||||
|
|
||||||
// Use "wlv.extra_attr", but don't override visual selection
|
// Use "wlv.extra_attr", but don't override visual selection
|
||||||
// highlighting, unless text property overrides.
|
// highlighting, unless text property overrides.
|
||||||
// Don't use "wlv.extra_attr" until n_attr_skip is zero.
|
// Don't use "wlv.extra_attr" until wlv.n_attr_skip is zero.
|
||||||
if (n_attr_skip == 0 && n_attr > 0
|
if (wlv.n_attr_skip == 0 && n_attr > 0
|
||||||
&& wlv.draw_state == WL_LINE
|
&& wlv.draw_state == WL_LINE
|
||||||
&& (!attr_pri
|
&& (!attr_pri
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
@ -3828,10 +3824,10 @@ win_line(
|
|||||||
|
|
||||||
// restore attributes after last 'listchars' or 'number' char
|
// restore attributes after last 'listchars' or 'number' char
|
||||||
if (n_attr > 0 && wlv.draw_state == WL_LINE
|
if (n_attr > 0 && wlv.draw_state == WL_LINE
|
||||||
&& n_attr_skip == 0 && --n_attr == 0)
|
&& wlv.n_attr_skip == 0 && --n_attr == 0)
|
||||||
wlv.char_attr = saved_attr2;
|
wlv.char_attr = saved_attr2;
|
||||||
if (n_attr_skip > 0)
|
if (wlv.n_attr_skip > 0)
|
||||||
--n_attr_skip;
|
--wlv.n_attr_skip;
|
||||||
|
|
||||||
// At end of screen line and there is more to come: Display the line
|
// At end of screen line and there is more to come: Display the line
|
||||||
// so far. If there is no more to display it is caught above.
|
// so far. If there is no more to display it is caught above.
|
||||||
|
8
src/testdir/dumps/Test_prop_below_after_empty_3.dump
Normal file
8
src/testdir/dumps/Test_prop_below_after_empty_3.dump
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
| +0#af5f00255#ffffff0@1|1| >v+0#0000000&|i|m|9|s|c|r|i|p|t| @45
|
||||||
|
| +0#af5f00255&@1|2| | +0#0000000&@55
|
||||||
|
| +0#af5f00255&@3| +0#0000000&|T+0#ffffff16#e000002|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|v|e|r| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@11
|
||||||
|
| +0#af5f00255&@1|3| |t+0#0000000&|h|r|e@1| @50
|
||||||
|
| +0#af5f00255&@1|4| | +0#0000000&@55
|
||||||
|
| +0#af5f00255&@3|T+0#0000000#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@19
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|1|,|1| @10|A|l@1|
|
@ -2747,6 +2747,9 @@ func Test_prop_with_text_below_after_empty()
|
|||||||
call term_sendkeys(buf, ":set number\<CR>")
|
call term_sendkeys(buf, ":set number\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_prop_below_after_empty_2', {})
|
call VerifyScreenDump(buf, 'Test_prop_below_after_empty_2', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, ":set nowrap\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_below_after_empty_3', {})
|
||||||
|
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@ -695,6 +695,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 */
|
||||||
|
/**/
|
||||||
|
995,
|
||||||
/**/
|
/**/
|
||||||
994,
|
994,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user