Problem: Virtual text "above" does not work with 'nowrap'.
Solution: Do wrap the line after. (closes #11084)
// syntax_attr
int text_prop_id = 0; // active property ID
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 saved_search_attr = 0; // search_attr to be used when n_extra
// goes to zero
// Sort the properties on priority and/or starting last.
// Then combine the attributes, highest priority last.
+ text_prop_above = FALSE;
text_prop_follows = FALSE;
sort_text_props(wp->w_buffer, text_props,
text_prop_idxs, text_props_active);
char_u *p = ((char_u **)wp->w_buffer
->b_textprop_text.ga_data)[
-text_prop_id - 1];
+ int above = (tp->tp_flags
+ & TP_FLAG_ALIGN_ABOVE);
// reset the ID in the copy to avoid it being used
// again
{
int right = (tp->tp_flags
& TP_FLAG_ALIGN_RIGHT);
- int above = (tp->tp_flags
- & TP_FLAG_ALIGN_ABOVE);
int below = (tp->tp_flags
& TP_FLAG_ALIGN_BELOW);
int wrap = (tp->tp_flags & TP_FLAG_WRAP);
// If another text prop follows the condition below at
// 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;
}
}
|| filler_todo > 0
#endif
#ifdef FEAT_PROP_POPUP
- || text_prop_follows
+ || text_prop_above || text_prop_follows
#endif
|| (wp->w_p_list && wp->w_lcs_chars.eol != NUL
&& wlv.p_extra != at_end_str)
&& filler_todo <= 0
#endif
#ifdef FEAT_PROP_POPUP
- && !text_prop_follows
+ && !text_prop_above && !text_prop_follows
#endif
) || lcs_eol_one == -1)
break;
#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
ptr += STRLEN(ptr);
&& filler_todo <= 0
#endif
#ifdef FEAT_PROP_POPUP
- && !text_prop_follows
+ && !text_prop_above && !text_prop_follows
#endif
&& wp->w_width == Columns)
{
if (!wp->w_p_wrap)
lines = 1
#ifdef FEAT_PROP_POPUP
- // add a line for each "below" aligned text property
- + prop_count_below(wp->w_buffer, lnum)
+ // add a line for each "above" and "below" aligned text property
+ + prop_count_above_below(wp->w_buffer, lnum)
#endif
;
else
#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 right of the screen, scroll leftwards
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 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);
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);
--- /dev/null
+| +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|
call term_sendkeys(buf, ":set number signcolumn=yes\<CR>")
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)
endfunc
}
/*
- * Return the number of text properties with "below" alignment in line "lnum".
- * A "right" aligned property also goes below after a "below" or other "right"
- * aligned property.
+ * Return the number of text properties with "above" or "below" alignment in
+ * line "lnum". A "right" aligned property also goes below after a "below" or
+ * other "right" aligned property.
*/
int
-prop_count_below(buf_T *buf, linenr_T lnum)
+prop_count_above_below(buf_T *buf, linenr_T lnum)
{
char_u *props;
int count = get_text_props(buf, lnum, &props, FALSE);
next_right_goes_below = TRUE;
++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)
next_right_goes_below = TRUE;
}
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 451,
/**/
450,
/**/