forked from aniani/vim
patch 9.0.0709: virtual text "after" not correct with 'nowrap'
Problem: Virtual text "after" not correct with 'nowrap'. Solution: Do not display "after" text prop on the next line when 'wrap' is off.
This commit is contained in:
@@ -1178,7 +1178,7 @@ win_lbr_chartabsize(
|
|||||||
{
|
{
|
||||||
int n_extra = (int)STRLEN(p);
|
int n_extra = (int)STRLEN(p);
|
||||||
|
|
||||||
cells = text_prop_position(wp, tp,
|
cells = text_prop_position(wp, tp, vcol,
|
||||||
(vcol + size) % (wp->w_width - col_off) + col_off,
|
(vcol + size) % (wp->w_width - col_off) + col_off,
|
||||||
&n_extra, &p, NULL, NULL);
|
&n_extra, &p, NULL, NULL);
|
||||||
#ifdef FEAT_LINEBREAK
|
#ifdef FEAT_LINEBREAK
|
||||||
|
@@ -612,7 +612,8 @@ textprop_size_after_trunc(
|
|||||||
text_prop_position(
|
text_prop_position(
|
||||||
win_T *wp,
|
win_T *wp,
|
||||||
textprop_T *tp,
|
textprop_T *tp,
|
||||||
int vcol, // current screen column
|
int vcol UNUSED, // current text column
|
||||||
|
int scr_col, // current screen column
|
||||||
int *n_extra, // nr of bytes for virtual text
|
int *n_extra, // nr of bytes for virtual text
|
||||||
char_u **p_extra, // virtual text
|
char_u **p_extra, // virtual text
|
||||||
int *n_attr, // attribute cells, NULL if not used
|
int *n_attr, // attribute cells, NULL if not used
|
||||||
@@ -624,7 +625,7 @@ text_prop_position(
|
|||||||
int wrap = (tp->tp_flags & TP_FLAG_WRAP);
|
int wrap = (tp->tp_flags & TP_FLAG_WRAP);
|
||||||
int padding = tp->tp_col == MAXCOL && tp->tp_len > 1
|
int padding = tp->tp_col == MAXCOL && tp->tp_len > 1
|
||||||
? tp->tp_len - 1 : 0;
|
? tp->tp_len - 1 : 0;
|
||||||
int col_with_padding = vcol + (below ? 0 : padding);
|
int col_with_padding = scr_col + (below ? 0 : padding);
|
||||||
int room = wp->w_width - col_with_padding;
|
int room = wp->w_width - col_with_padding;
|
||||||
int before = room; // spaces before the text
|
int before = room; // spaces before the text
|
||||||
int after = 0; // spaces after the text
|
int after = 0; // spaces after the text
|
||||||
@@ -1888,21 +1889,21 @@ win_line(
|
|||||||
for (pi = 0; pi < text_props_active; ++pi)
|
for (pi = 0; pi < text_props_active; ++pi)
|
||||||
{
|
{
|
||||||
int tpi = text_prop_idxs[pi];
|
int tpi = text_prop_idxs[pi];
|
||||||
|
textprop_T *tp = &text_props[tpi];
|
||||||
proptype_T *pt = text_prop_type_by_id(
|
proptype_T *pt = text_prop_type_by_id(
|
||||||
wp->w_buffer, text_props[tpi].tp_type);
|
wp->w_buffer, tp->tp_type);
|
||||||
|
|
||||||
if (pt != NULL && (pt->pt_hl_id > 0
|
if (pt != NULL && (pt->pt_hl_id > 0
|
||||||
|| text_props[tpi].tp_id < 0)
|
|| tp->tp_id < 0) && tp->tp_id != -MAXCOL)
|
||||||
&& text_props[tpi].tp_id != -MAXCOL)
|
|
||||||
{
|
{
|
||||||
if (pt->pt_hl_id > 0)
|
if (pt->pt_hl_id > 0)
|
||||||
used_attr = syn_id2attr(pt->pt_hl_id);
|
used_attr = syn_id2attr(pt->pt_hl_id);
|
||||||
text_prop_type = pt;
|
text_prop_type = pt;
|
||||||
text_prop_attr =
|
text_prop_attr =
|
||||||
hl_combine_attr(text_prop_attr, used_attr);
|
hl_combine_attr(text_prop_attr, used_attr);
|
||||||
text_prop_flags = pt->pt_flags;
|
|
||||||
text_prop_id = text_props[tpi].tp_id;
|
|
||||||
other_tpi = used_tpi;
|
other_tpi = used_tpi;
|
||||||
|
text_prop_flags = pt->pt_flags;
|
||||||
|
text_prop_id = tp->tp_id;
|
||||||
used_tpi = tpi;
|
used_tpi = tpi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1972,6 +1973,7 @@ win_line(
|
|||||||
// Shared with win_lbr_chartabsize(), must do
|
// Shared with win_lbr_chartabsize(), must do
|
||||||
// exactly the same.
|
// exactly the same.
|
||||||
start_line = text_prop_position(wp, tp,
|
start_line = text_prop_position(wp, tp,
|
||||||
|
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, &n_attr_skip);
|
||||||
@@ -2011,7 +2013,10 @@ win_line(
|
|||||||
// If this is an "above" text prop and 'nowrap' the we
|
// If this is an "above" text prop and 'nowrap' the we
|
||||||
// must wrap anyway.
|
// must wrap anyway.
|
||||||
text_prop_above = above;
|
text_prop_above = above;
|
||||||
text_prop_follows = other_tpi != -1;
|
text_prop_follows = other_tpi != -1
|
||||||
|
&& (wp->w_p_wrap
|
||||||
|
|| (text_props[other_tpi].tp_flags
|
||||||
|
& (TP_FLAG_ALIGN_BELOW | TP_FLAG_ALIGN_RIGHT)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (text_prop_next < text_prop_count
|
else if (text_prop_next < text_prop_count
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* drawline.c */
|
/* drawline.c */
|
||||||
int text_prop_position(win_T *wp, textprop_T *tp, int vcol, int *n_extra, char_u **p_extra, int *n_attr, int *n_attr_skip);
|
int text_prop_position(win_T *wp, textprop_T *tp, int vcol, int scr_col, int *n_extra, char_u **p_extra, int *n_attr, int *n_attr_skip);
|
||||||
int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int nochange, int number_only);
|
int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int nochange, int number_only);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
8
src/testdir/dumps/Test_text_after_nowrap_1.dump
Normal file
8
src/testdir/dumps/Test_text_after_nowrap_1.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|f+0&#ffffff0|i|r|s|t| |l|i|n|e| @1|a+0&#ffd7ff255|f|t|e|r| |t|h|e| |t|e|x|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |a|f|t|e|r| |t|h|e| |t|e|x|t| |a|f|t
|
||||||
|
|s+0&#ffffff0|e|c|o|n|d| >l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l|i|n|e| |s|e|c|o|n|d| |l|i|n|e|
|
||||||
|
|t|h|i|r|d| @54
|
||||||
|
|f|o|u|r|t|h| @53
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
| +0#0000000&@41|2|,|8| @10|A|l@1|
|
@@ -3211,6 +3211,36 @@ func Test_long_text_below_with_padding()
|
|||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_text_after_nowrap()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
" FIXME: the second property causes a hang
|
||||||
|
let lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
setline(1, ['first line', 'second line '->repeat(50), 'third', 'fourth'])
|
||||||
|
set nowrap
|
||||||
|
prop_type_add('theprop', {highlight: 'DiffChange'})
|
||||||
|
prop_add(1, 0, {
|
||||||
|
type: 'theprop',
|
||||||
|
text: 'after the text '->repeat(5),
|
||||||
|
text_align: 'after',
|
||||||
|
text_padding_left: 2,
|
||||||
|
})
|
||||||
|
#prop_add(1, 0, {
|
||||||
|
# type: 'theprop',
|
||||||
|
# text: 'after the text '->repeat(5),
|
||||||
|
# text_align: 'after',
|
||||||
|
# text_padding_left: 2,
|
||||||
|
#})
|
||||||
|
normal 2Gw
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XTextAfterNowrap', 'D')
|
||||||
|
let buf = RunVimInTerminal('-S XTextAfterNowrap', #{rows: 8, cols: 60})
|
||||||
|
call VerifyScreenDump(buf, 'Test_text_after_nowrap_1', {})
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_insert_text_change_arg()
|
func Test_insert_text_change_arg()
|
||||||
CheckRunVimInTerminal
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
709,
|
||||||
/**/
|
/**/
|
||||||
708,
|
708,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user