forked from aniani/vim
patch 9.0.0451: virtual text "above" does not work with 'nowrap'
Problem: Virtual text "above" does not work with 'nowrap'. Solution: Do wrap the line after. (closes #11084)
This commit is contained in:
parent
7b2d87220c
commit
c9dc03fff5
@ -666,6 +666,7 @@ win_line(
|
|||||||
// syntax_attr
|
// syntax_attr
|
||||||
int text_prop_id = 0; // active property ID
|
int text_prop_id = 0; // active property ID
|
||||||
int text_prop_flags = 0;
|
int text_prop_flags = 0;
|
||||||
|
int text_prop_above = FALSE; // first doing virtual text above
|
||||||
int text_prop_follows = FALSE; // another text prop to display
|
int text_prop_follows = FALSE; // another text prop to display
|
||||||
int saved_search_attr = 0; // search_attr to be used when n_extra
|
int saved_search_attr = 0; // search_attr to be used when n_extra
|
||||||
// goes to zero
|
// goes to zero
|
||||||
@ -1784,6 +1785,7 @@ win_line(
|
|||||||
|
|
||||||
// Sort the properties on priority and/or starting last.
|
// Sort the properties on priority and/or starting last.
|
||||||
// Then combine the attributes, highest priority last.
|
// Then combine the attributes, highest priority last.
|
||||||
|
text_prop_above = FALSE;
|
||||||
text_prop_follows = FALSE;
|
text_prop_follows = FALSE;
|
||||||
sort_text_props(wp->w_buffer, text_props,
|
sort_text_props(wp->w_buffer, text_props,
|
||||||
text_prop_idxs, text_props_active);
|
text_prop_idxs, text_props_active);
|
||||||
@ -1817,6 +1819,8 @@ win_line(
|
|||||||
char_u *p = ((char_u **)wp->w_buffer
|
char_u *p = ((char_u **)wp->w_buffer
|
||||||
->b_textprop_text.ga_data)[
|
->b_textprop_text.ga_data)[
|
||||||
-text_prop_id - 1];
|
-text_prop_id - 1];
|
||||||
|
int above = (tp->tp_flags
|
||||||
|
& TP_FLAG_ALIGN_ABOVE);
|
||||||
|
|
||||||
// reset the ID in the copy to avoid it being used
|
// reset the ID in the copy to avoid it being used
|
||||||
// again
|
// again
|
||||||
@ -1826,8 +1830,6 @@ win_line(
|
|||||||
{
|
{
|
||||||
int right = (tp->tp_flags
|
int right = (tp->tp_flags
|
||||||
& TP_FLAG_ALIGN_RIGHT);
|
& TP_FLAG_ALIGN_RIGHT);
|
||||||
int above = (tp->tp_flags
|
|
||||||
& TP_FLAG_ALIGN_ABOVE);
|
|
||||||
int below = (tp->tp_flags
|
int below = (tp->tp_flags
|
||||||
& TP_FLAG_ALIGN_BELOW);
|
& TP_FLAG_ALIGN_BELOW);
|
||||||
int wrap = (tp->tp_flags & TP_FLAG_WRAP);
|
int wrap = (tp->tp_flags & TP_FLAG_WRAP);
|
||||||
@ -1902,6 +1904,9 @@ win_line(
|
|||||||
|
|
||||||
// If another text prop follows the condition below at
|
// If another text prop follows the condition below at
|
||||||
// the last window column must know.
|
// the last window column must know.
|
||||||
|
// If this is an "above" text prop and 'nowrap' the we
|
||||||
|
// must wrap anyway.
|
||||||
|
text_prop_above = above;
|
||||||
text_prop_follows = other_tpi != -1;
|
text_prop_follows = other_tpi != -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3581,7 +3586,7 @@ win_line(
|
|||||||
|| filler_todo > 0
|
|| filler_todo > 0
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
|| text_prop_follows
|
|| text_prop_above || text_prop_follows
|
||||||
#endif
|
#endif
|
||||||
|| (wp->w_p_list && wp->w_lcs_chars.eol != NUL
|
|| (wp->w_p_list && wp->w_lcs_chars.eol != NUL
|
||||||
&& wlv.p_extra != at_end_str)
|
&& wlv.p_extra != at_end_str)
|
||||||
@ -3608,12 +3613,12 @@ win_line(
|
|||||||
&& filler_todo <= 0
|
&& filler_todo <= 0
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
&& !text_prop_follows
|
&& !text_prop_above && !text_prop_follows
|
||||||
#endif
|
#endif
|
||||||
) || lcs_eol_one == -1)
|
) || lcs_eol_one == -1)
|
||||||
break;
|
break;
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
if (!wp->w_p_wrap && text_prop_follows)
|
if (!wp->w_p_wrap && text_prop_follows && !text_prop_above)
|
||||||
{
|
{
|
||||||
// do not output more of the line, only the "below" prop
|
// do not output more of the line, only the "below" prop
|
||||||
ptr += STRLEN(ptr);
|
ptr += STRLEN(ptr);
|
||||||
@ -3647,7 +3652,7 @@ win_line(
|
|||||||
&& filler_todo <= 0
|
&& filler_todo <= 0
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
&& !text_prop_follows
|
&& !text_prop_above && !text_prop_follows
|
||||||
#endif
|
#endif
|
||||||
&& wp->w_width == Columns)
|
&& wp->w_width == Columns)
|
||||||
{
|
{
|
||||||
|
@ -377,8 +377,8 @@ plines_win_nofill(
|
|||||||
if (!wp->w_p_wrap)
|
if (!wp->w_p_wrap)
|
||||||
lines = 1
|
lines = 1
|
||||||
#ifdef FEAT_PROP_POPUP
|
#ifdef FEAT_PROP_POPUP
|
||||||
// add a line for each "below" aligned text property
|
// add a line for each "above" and "below" aligned text property
|
||||||
+ prop_count_below(wp->w_buffer, lnum)
|
+ prop_count_above_below(wp->w_buffer, lnum)
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
|
13
src/move.c
13
src/move.c
@ -1068,6 +1068,19 @@ curs_columns(
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
if (curwin->w_virtcol_first_char > 0)
|
||||||
|
{
|
||||||
|
int cols = (curwin->w_width - extra);
|
||||||
|
int rows = cols > 0 ? curwin->w_virtcol_first_char / cols : 1;
|
||||||
|
|
||||||
|
// each "above" text prop shifts the text one row down
|
||||||
|
curwin->w_wrow += rows;
|
||||||
|
curwin->w_wcol -= rows * cols;
|
||||||
|
endcol -= rows * cols;
|
||||||
|
curwin->w_cline_height = rows + 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* If Cursor is left of the screen, scroll rightwards.
|
* If Cursor is left of the screen, scroll rightwards.
|
||||||
* If Cursor is right of the screen, scroll leftwards
|
* If Cursor is right of the screen, scroll leftwards
|
||||||
|
@ -4,7 +4,7 @@ void f_prop_add(typval_T *argvars, typval_T *rettv);
|
|||||||
void f_prop_add_list(typval_T *argvars, typval_T *rettv);
|
void f_prop_add_list(typval_T *argvars, typval_T *rettv);
|
||||||
int prop_add_common(linenr_T start_lnum, colnr_T start_col, dict_T *dict, buf_T *default_buf, typval_T *dict_arg);
|
int prop_add_common(linenr_T start_lnum, colnr_T start_col, dict_T *dict, buf_T *default_buf, typval_T *dict_arg);
|
||||||
int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change);
|
int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change);
|
||||||
int prop_count_below(buf_T *buf, linenr_T lnum);
|
int prop_count_above_below(buf_T *buf, linenr_T lnum);
|
||||||
int count_props(linenr_T lnum, int only_starting, int last_line);
|
int count_props(linenr_T lnum, int only_starting, int last_line);
|
||||||
void sort_text_props(buf_T *buf, textprop_T *props, int *idxs, int count);
|
void sort_text_props(buf_T *buf, textprop_T *props, int *idxs, int count);
|
||||||
int find_visible_prop(win_T *wp, int type_id, int id, textprop_T *prop, linenr_T *found_lnum);
|
int find_visible_prop(win_T *wp, int type_id, int id, textprop_T *prop, linenr_T *found_lnum);
|
||||||
|
9
src/testdir/dumps/Test_prop_with_text_above_5.dump
Normal file
9
src/testdir/dumps/Test_prop_with_text_above_5.dump
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @36
|
||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000000#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @35
|
||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|i+0#0000000&|n|s|e|r|t|e|d| |o|n|e| |t|w|o| @37
|
||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u>r| @43
|
||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| | +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @37
|
||||||
|
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000&|i|v|e| |s|i|x| @45
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
|:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|2|,|1|0| @9|A|l@1|
|
@ -2873,6 +2873,9 @@ func Test_props_with_text_above()
|
|||||||
call term_sendkeys(buf, ":set number signcolumn=yes\<CR>")
|
call term_sendkeys(buf, ":set number signcolumn=yes\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_prop_with_text_above_4', {})
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_4', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, ":set nowrap\<CR>gg$j")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_5', {})
|
||||||
|
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@ -608,12 +608,12 @@ get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the number of text properties with "below" alignment in line "lnum".
|
* Return the number of text properties with "above" or "below" alignment in
|
||||||
* A "right" aligned property also goes below after a "below" or other "right"
|
* line "lnum". A "right" aligned property also goes below after a "below" or
|
||||||
* aligned property.
|
* other "right" aligned property.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
prop_count_below(buf_T *buf, linenr_T lnum)
|
prop_count_above_below(buf_T *buf, linenr_T lnum)
|
||||||
{
|
{
|
||||||
char_u *props;
|
char_u *props;
|
||||||
int count = get_text_props(buf, lnum, &props, FALSE);
|
int count = get_text_props(buf, lnum, &props, FALSE);
|
||||||
@ -636,6 +636,11 @@ prop_count_below(buf_T *buf, linenr_T lnum)
|
|||||||
next_right_goes_below = TRUE;
|
next_right_goes_below = TRUE;
|
||||||
++result;
|
++result;
|
||||||
}
|
}
|
||||||
|
else if (prop.tp_flags & TP_FLAG_ALIGN_ABOVE)
|
||||||
|
{
|
||||||
|
next_right_goes_below = FALSE;
|
||||||
|
++result;
|
||||||
|
}
|
||||||
else if (prop.tp_flags & TP_FLAG_ALIGN_RIGHT)
|
else if (prop.tp_flags & TP_FLAG_ALIGN_RIGHT)
|
||||||
next_right_goes_below = TRUE;
|
next_right_goes_below = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -703,6 +703,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 */
|
||||||
|
/**/
|
||||||
|
451,
|
||||||
/**/
|
/**/
|
||||||
450,
|
450,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user