summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-08-06 22:03:20 +0100
committerBram Moolenaar <Bram@vim.org>2022-08-06 22:03:20 +0100
commit48ca24d913105a14cf6d723d45f6b39e7b7b7b77 (patch)
tree660d337157ed875de20abda6e1bcc193b9df49da
parentcba6952e3499f85545c274873c67bb843d3f3518 (diff)
patch 9.0.0158: with 'nowrap' "below" property not displayed correctlyv9.0.0158
Problem: With 'nowrap' "below" property not displayed correctly. Solution: Adjust virtual text with 'nowrap', do not truncate.
-rw-r--r--src/drawline.c29
-rw-r--r--src/testdir/dumps/Test_prop_with_text_below_nowrap_1.dump8
-rw-r--r--src/testdir/dumps/Test_prop_with_text_below_nowrap_2.dump8
-rw-r--r--src/testdir/test_textprop.vim33
-rw-r--r--src/version.c2
5 files changed, 76 insertions, 4 deletions
diff --git a/src/drawline.c b/src/drawline.c
index 26b52d3b17..fb662f71bd 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -1642,9 +1642,15 @@ win_line(
--bcol;
# endif
// Add any text property that starts in this column.
+ // With 'nowrap' and not in the first screen line only "below"
+ // text prop can show.
while (text_prop_next < text_prop_count
&& (text_props[text_prop_next].tp_col == MAXCOL
- ? *ptr == NUL
+ ? (*ptr == NUL
+ && (wp->w_p_wrap
+ || wlv.row == startrow
+ || (text_props[text_prop_next].tp_flags
+ & TP_FLAG_ALIGN_BELOW)))
: bcol >= text_props[text_prop_next].tp_col - 1))
{
if (bcol <= text_props[text_prop_next].tp_col - 1
@@ -1761,7 +1767,8 @@ win_line(
vim_memset(l, ' ', added);
vim_strncpy(l + added, wlv.p_extra,
n_used);
- if (n_used < wlv.n_extra)
+ if (n_used < wlv.n_extra
+ && wp->w_p_wrap)
{
char_u *lp = l + added + n_used - 1;
@@ -1810,11 +1817,15 @@ win_line(
}
else if (text_prop_next < text_prop_count
&& text_props[text_prop_next].tp_col == MAXCOL
- && *ptr != NUL
- && ptr[mb_ptr2len(ptr)] == NUL)
+ && ((*ptr != NUL && ptr[mb_ptr2len(ptr)] == NUL)
+ || (!wp->w_p_wrap
+ && wlv.col == wp->w_width - 1
+ && (text_props[text_prop_next].tp_flags
+ & TP_FLAG_ALIGN_BELOW))))
// When at last-but-one character and a text property
// follows after it, we may need to flush the line after
// displaying that character.
+ // Or when not wrapping and at the rightmost column.
text_prop_follows = TRUE;
}
#endif
@@ -3461,6 +3472,16 @@ win_line(
#endif
) || lcs_eol_one == -1)
break;
+#ifdef FEAT_PROP_POPUP
+ if (!wp->w_p_wrap)
+ {
+ // do not output more of the line, only the "below" prop
+ ptr += STRLEN(ptr);
+# ifdef FEAT_LINEBREAK
+ dont_use_showbreak = TRUE;
+# endif
+ }
+#endif
// When the window is too narrow draw all "@" lines.
if (wlv.draw_state != WL_LINE
diff --git a/src/testdir/dumps/Test_prop_with_text_below_nowrap_1.dump b/src/testdir/dumps/Test_prop_with_text_below_nowrap_1.dump
new file mode 100644
index 0000000000..e7f1837f97
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_below_nowrap_1.dump
@@ -0,0 +1,8 @@
+|o+0&#ffffff0|n|a|s|d|f| |a|s|d|f| |a|s|d|f| |s|d|f| |d|f| |a|s|d|f| |a|s|d|f| |e| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|
+|t+0#e000e06&|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&@16
+|t|w>o| @56
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|"+0#0000000&|f|o@1|b|a|r|"| |[|N|e|w|]| @27|2|,|3| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_with_text_below_nowrap_2.dump b/src/testdir/dumps/Test_prop_with_text_below_nowrap_2.dump
new file mode 100644
index 0000000000..0bcaf66114
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_below_nowrap_2.dump
@@ -0,0 +1,8 @@
+| +0&#ffffff0|a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d|f| |a|s|d| |f|a|s| |d>f|t+0#e000e06&|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|v|e
+|t|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&@16
+@60
+|~+0#4040ff13&| @58
+|~| @58
+|~| @58
+|~| @58
+|"+0#0000000&|f|o@1|b|a|r|"| |[|N|e|w|]| @27|1|,|6@1| @9|A|l@1|
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 484cb3cea4..8f3a304509 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -2482,6 +2482,39 @@ func Test_props_with_text_after_nowrap()
call delete('XscriptPropsAfterNowrap')
endfunc
+func Test_props_with_text_below_nowrap()
+ CheckRunVimInTerminal
+
+ let lines =<< trim END
+ vim9script
+ edit foobar
+ set nowrap
+ set showbreak=+++\
+ setline(1, ['onasdf asdf asdf sdf df asdf asdf e asdf asdf asdf asdf asd fas df', 'two'])
+ prop_type_add('test', {highlight: 'Special'})
+ prop_add(1, 0, {
+ type: 'test',
+ text: 'the quick brown fox jumps over the lazy dog',
+ text_align: 'after'
+ })
+ prop_add(1, 0, {
+ type: 'test',
+ text: 'the quick brown fox jumps over the lazy dog',
+ text_align: 'below'
+ })
+ normal G$
+ END
+ call writefile(lines, 'XscriptPropsBelowNowrap')
+ let buf = RunVimInTerminal('-S XscriptPropsBelowNowrap', #{rows: 8, cols: 60})
+ call VerifyScreenDump(buf, 'Test_prop_with_text_below_nowrap_1', {})
+
+ call term_sendkeys(buf, "gg$")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_below_nowrap_2', {})
+
+ call StopVimInTerminal(buf)
+ call delete('XscriptPropsBelowNowrap')
+endfunc
+
func Test_props_with_text_after_split_join()
CheckRunVimInTerminal
diff --git a/src/version.c b/src/version.c
index 667b6071bd..0a39e5d9d7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 158,
+/**/
157,
/**/
156,