changeset 29635:592818fd3110 v9.0.0158

patch 9.0.0158: with 'nowrap' "below" property not displayed correctly Commit: https://github.com/vim/vim/commit/48ca24d913105a14cf6d723d45f6b39e7b7b7b77 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 6 22:03:20 2022 +0100 patch 9.0.0158: with 'nowrap' "below" property not displayed correctly Problem: With 'nowrap' "below" property not displayed correctly. Solution: Adjust virtual text with 'nowrap', do not truncate.
author Bram Moolenaar <Bram@vim.org>
date Sat, 06 Aug 2022 23:15:03 +0200
parents 08e35dfcb499
children b741f05e2349
files src/drawline.c src/testdir/dumps/Test_prop_with_text_below_nowrap_1.dump src/testdir/dumps/Test_prop_with_text_below_nowrap_2.dump src/testdir/test_textprop.vim src/version.c
diffstat 5 files changed, 76 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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
new file mode 100644
--- /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| 
new file mode 100644
--- /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| 
--- 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
 
--- 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,