changeset 30643:dfb02f9dcbe8 v9.0.0656

patch 9.0.0656: cannot specify another character to use instead of '@' Commit: https://github.com/vim/vim/commit/4ba5f1dab656103e8f4a4505452d1816b9e83c1e Author: Bram Moolenaar <Bram@vim.org> Date: Tue Oct 4 14:36:29 2022 +0100 patch 9.0.0656: cannot specify another character to use instead of '@' Problem: Cannot specify another character to use instead of '@' at the end of the window. Solution: Add "lastline" to 'fillchars'. (Martin Tournoij, closes #11264, closes #10963)
author Bram Moolenaar <Bram@vim.org>
date Tue, 04 Oct 2022 15:45:03 +0200
parents 9f3422ba87ca
children 0c102a723b9a
files runtime/doc/options.txt src/drawscreen.c src/optiondefs.h src/screen.c src/structs.h src/testdir/dumps/Test_display_lastline_1.dump src/testdir/dumps/Test_display_lastline_2.dump src/testdir/dumps/Test_display_lastline_3.dump src/testdir/dumps/Test_display_lastline_4.dump src/testdir/dumps/Test_display_lastline_5.dump src/testdir/dumps/Test_display_lastline_euro_1.dump src/testdir/dumps/Test_display_lastline_euro_2.dump src/testdir/dumps/Test_display_lastline_euro_3.dump src/testdir/dumps/Test_display_lastline_euro_4.dump src/testdir/dumps/Test_display_lastline_euro_5.dump src/testdir/test_display.vim src/version.c
diffstat 17 files changed, 121 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2956,6 +2956,9 @@ A jump table for the options with a shor
 	When neither "lastline" nor "truncate" is included, a last line that
 	doesn't fit is replaced with "@" lines.
 
+	The "@" character can be changed by setting the "lastline" item in
+	'fillchars'.  The character is highlighted with |hl-NonText|.
+
 						*'eadirection'* *'ead'*
 'eadirection' 'ead'	string	(default "both")
 			global
@@ -3420,6 +3423,7 @@ A jump table for the options with a shor
 	  foldsep	'|'		open fold middle character
 	  diff		'-'		deleted lines of the 'diff' option
 	  eob		'~'		empty lines below the end of a buffer
+	  lastline	'@'		'display' contains lastline/truncate
 
 	Any one that is omitted will fall back to the default.  For "stl" and
 	"stlnc" the space will be used when there is highlighting, '^' or '='
@@ -3442,6 +3446,7 @@ A jump table for the options with a shor
 	  fold		Folded			|hl-Folded|
 	  diff		DiffDelete		|hl-DiffDelete|
 	  eob		EndOfBuffer		|hl-EndOfBuffer|
+	  lastline	NonText			|hl-NonText|
 
 		*'fixendofline'* *'fixeol'* *'nofixendofline'* *'nofixeol'*
 'fixendofline' 'fixeol'	boolean	(default on)
--- a/src/drawscreen.c
+++ b/src/drawscreen.c
@@ -2643,33 +2643,42 @@ win_update(win_T *wp)
 #endif
 	else if (dy_flags & DY_TRUNCATE)	// 'display' has "truncate"
 	{
-	    int scr_row = W_WINROW(wp) + wp->w_height - 1;
+	    int		scr_row = W_WINROW(wp) + wp->w_height - 1;
+	    int		symbol  = wp->w_fill_chars.lastline;
+	    int		len;
+	    char_u	fillbuf[12];  // 2 characters of 6 bytes
+
+	    len =  mb_char2bytes(symbol, &fillbuf[0]);
+	    len += mb_char2bytes(symbol, &fillbuf[len]);
 
 	    // Last line isn't finished: Display "@@@" in the last screen line.
-	    screen_puts_len((char_u *)"@@", wp->w_width > 2 ? 2 : wp->w_width,
-				       scr_row, wp->w_wincol, HL_ATTR(HLF_AT));
+	    screen_puts_len(fillbuf,
+			    wp->w_width > 2 ? len : wp->w_width,
+			    scr_row, wp->w_wincol, HL_ATTR(HLF_AT));
 	    screen_fill(scr_row, scr_row + 1,
 		    (int)wp->w_wincol + 2, (int)W_ENDCOL(wp),
-		    '@', ' ', HL_ATTR(HLF_AT));
+		    symbol, ' ', HL_ATTR(HLF_AT));
 	    set_empty_rows(wp, srow);
 	    wp->w_botline = lnum;
 	}
 	else if (dy_flags & DY_LASTLINE)	// 'display' has "lastline"
 	{
 	    int start_col = (int)W_ENDCOL(wp) - 3;
+	    int symbol    = wp->w_fill_chars.lastline;
 
 	    // Last line isn't finished: Display "@@@" at the end.
 	    screen_fill(W_WINROW(wp) + wp->w_height - 1,
 		    W_WINROW(wp) + wp->w_height,
 		    start_col < wp->w_wincol ? wp->w_wincol : start_col,
 		    (int)W_ENDCOL(wp),
-		    '@', '@', HL_ATTR(HLF_AT));
+		    symbol, symbol, HL_ATTR(HLF_AT));
 	    set_empty_rows(wp, srow);
 	    wp->w_botline = lnum;
 	}
 	else
 	{
-	    win_draw_end(wp, '@', ' ', TRUE, srow, wp->w_height, HLF_AT);
+	    win_draw_end(wp, wp->w_fill_chars.lastline, ' ', TRUE,
+						   srow, wp->w_height, HLF_AT);
 	    wp->w_botline = lnum;
 	}
     }
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -936,7 +936,8 @@ static struct vimoption options[] =
 			    SCTX_INIT},
     {"fillchars",   "fcs",  P_STRING|P_VI_DEF|P_RALL|P_ONECOMMA|P_NODUP,
 			    (char_u *)&p_fcs, PV_FCS,
-			    {(char_u *)"vert:|,fold:-,eob:~", (char_u *)0L}
+			    {(char_u *)"vert:|,fold:-,eob:~,lastline:@",
+								  (char_u *)0L}
 			    SCTX_INIT},
     {"fixendofline",  "fixeol", P_BOOL|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_fixeol, PV_FIXEOL,
--- a/src/screen.c
+++ b/src/screen.c
@@ -2511,7 +2511,7 @@ screen_fill(
 		    else
 			force_next = FALSE;
 		}
-#endif
+#endif // FEAT_GUI || defined(UNIX)
 		ScreenLines[off] = c;
 		if (enc_utf8)
 		{
@@ -4943,6 +4943,7 @@ set_chars_option(win_T *wp, char_u **var
 	{&fill_chars.foldsep,	"foldsep"},
 	{&fill_chars.diff,	"diff"},
 	{&fill_chars.eob,	"eob"},
+	{&fill_chars.lastline,	"lastline"},
     };
 
     static lcs_chars_T lcs_chars;
@@ -5022,6 +5023,7 @@ set_chars_option(win_T *wp, char_u **var
 		fill_chars.foldsep = '|';
 		fill_chars.diff = '-';
 		fill_chars.eob = '~';
+		fill_chars.lastline = '@';
 	    }
 	}
 	p = value;
--- a/src/structs.h
+++ b/src/structs.h
@@ -3519,6 +3519,7 @@ typedef struct
     int	foldsep;
     int	diff;
     int	eob;
+    int	lastline;
 } fill_chars_T;
 
 /*
--- a/src/testdir/dumps/Test_display_lastline_1.dump
+++ b/src/testdir/dumps/Test_display_lastline_1.dump
@@ -1,10 +1,10 @@
 >a+0&#ffffff0||+1&&|a+0&&@2| @69
 |a||+1&&|b+0&&@72
-|a||+1&&|b+0&&@26| @45
+|a||+1&&|b+0&&@72
+@1||+1&&|b+0&&@53| @18
 |b||+1&&|~+0#4040ff13&| @71
 |b+0#0000000&||+1&&|~+0#4040ff13&| @71
 |b+0#0000000&||+1&&|~+0#4040ff13&| @71
-|b+0#0000000&||+1&&|~+0#4040ff13&| @71
 |@||+1#0000000&|~+0#4040ff13&| @71
 |<+3#0000000&| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1
 | +0&&@74
--- a/src/testdir/dumps/Test_display_lastline_2.dump
+++ b/src/testdir/dumps/Test_display_lastline_2.dump
@@ -1,10 +1,10 @@
 >a+0&#ffffff0||+1&&|a+0&&@2| @69
 |a||+1&&|b+0&&@72
-|a||+1&&|b+0&&@26| @45
+|a||+1&&|b+0&&@72
+@1||+1&&|b+0&&@53| @18
 |b||+1&&|~+0#4040ff13&| @71
 |b+0#0000000&||+1&&|~+0#4040ff13&| @71
 |b+0#0000000&||+1&&|~+0#4040ff13&| @71
-|b+0#0000000&||+1&&|~+0#4040ff13&| @71
 |@||+1#0000000&|~+0#4040ff13&| @71
 |<+3#0000000&| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1
 |:+0&&|s|e|t| |d|i|s|p|l|a|y|=|l|a|s|t|l|i|n|e| @53
--- a/src/testdir/dumps/Test_display_lastline_3.dump
+++ b/src/testdir/dumps/Test_display_lastline_3.dump
@@ -1,7 +1,7 @@
 >a+0&#ffffff0@2| @69||+1&&|a+0&&
 |b@72||+1&&|a+0&&
-|b@26| @45||+1&&|a+0&&
-|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|b@72||+1&&|a+0&&
+|b@53| @18||+1&&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
--- a/src/testdir/dumps/Test_display_lastline_4.dump
+++ b/src/testdir/dumps/Test_display_lastline_4.dump
@@ -1,7 +1,7 @@
 >a+0&#ffffff0@2| @69||+1&&|a+0&&
 |b@72||+1&&|a+0&&
-|b@26| @45||+1&&|a+0&&
-|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|b@72||+1&&|a+0&&
+|b@53| @18||+1&&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
 |~+0#4040ff13&| @71||+1#0000000&|b+0&&
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_5.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0@2| @71
+|b@74
+|@+0#4040ff13&@2| @71
+|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p
+|a+0&&@2| @71
+|b@74
+@75
+@50| @24
+|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|A|l@1
+|:+0&&|3|s|p|l|i|t| @67
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_euro_1.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0||+1&&|a+0&&@2| @69
+|a||+1&&|b+0&&@72
+|a||+1&&|b+0&&@72
+@1||+1&&|b+0&&@53| @18
+|b||+1&&|~+0#4040ff13&| @71
+|b+0#0000000&||+1&&|~+0#4040ff13&| @71
+|b+0#0000000&||+1&&|~+0#4040ff13&| @71
+|€||+1#0000000&|~+0#4040ff13&| @71
+|<+3#0000000&| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1
+| +0&&@74
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_euro_2.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0||+1&&|a+0&&@2| @69
+|a||+1&&|b+0&&@72
+|a||+1&&|b+0&&@72
+@1||+1&&|b+0&&@53| @18
+|b||+1&&|~+0#4040ff13&| @71
+|b+0#0000000&||+1&&|~+0#4040ff13&| @71
+|b+0#0000000&||+1&&|~+0#4040ff13&| @71
+|€||+1#0000000&|~+0#4040ff13&| @71
+|<+3#0000000&| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1
+|:+0&&|s|e|t| |d|i|s|p|l|a|y|=|l|a|s|t|l|i|n|e| @53
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_euro_3.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0@2| @69||+1&&|a+0&&
+|b@72||+1&&|a+0&&
+|b@72||+1&&|a+0&&
+|b@53| @18||+1&&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|€+0#4040ff13&
+|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1| |<+1&&
+|:+0&&|1|0@1|w|i|n|c|m|d| |>| @62
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_euro_4.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0@2| @69||+1&&|a+0&&
+|b@72||+1&&|a+0&&
+|b@72||+1&&|a+0&&
+|b@53| @18||+1&&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|b+0&&
+|~+0#4040ff13&| @71||+1#0000000&|€+0#4040ff13&
+|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @41|1|,|1| @11|A|l@1| |<+1&&
+|:+0&&|s|e|t| |d|i|s|p|l|a|y|=|t|r|u|n|c|a|t|e| @53
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_display_lastline_euro_5.dump
@@ -0,0 +1,10 @@
+>a+0&#ffffff0@2| @71
+|b@74
+|€+0#4040ff13&@2| @71
+|[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|T|o|p
+|a+0&&@2| @71
+|b@74
+@75
+@50| @24
+|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|1| @11|A|l@1
+|:+0&&|3|s|p|l|i|t| @67
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -391,30 +391,46 @@ func Test_display_linebreak_breakat()
   let &breakat=_breakat
 endfunc
 
-func Test_display_lastline()
-  CheckScreendump
+func Run_Test_display_lastline(euro)
+  let lines =<< trim END
+      call setline(1, ['aaa', 'b'->repeat(200)])
+      set display=truncate
 
-  let lines =<< trim END
-      call setline(1, ['aaa', 'b'->repeat(100)])
-      set display=truncate
       vsplit
       100wincmd <
   END
+  if a:euro != ''
+    let lines[2] = 'set fillchars=vert:\|,lastline:€'
+  endif
   call writefile(lines, 'XdispLastline', 'D')
   let buf = RunVimInTerminal('-S XdispLastline', #{rows: 10})
-  call VerifyScreenDump(buf, 'Test_display_lastline_1', {})
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}1', {})
 
   call term_sendkeys(buf, ":set display=lastline\<CR>")
-  call VerifyScreenDump(buf, 'Test_display_lastline_2', {})
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}2', {})
 
   call term_sendkeys(buf, ":100wincmd >\<CR>")
-  call VerifyScreenDump(buf, 'Test_display_lastline_3', {})
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}3', {})
 
   call term_sendkeys(buf, ":set display=truncate\<CR>")
-  call VerifyScreenDump(buf, 'Test_display_lastline_4', {})
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}4', {})
+
+  call term_sendkeys(buf, ":close\<CR>")
+  call term_sendkeys(buf, ":3split\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}5', {})
 
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_display_lastline()
+  CheckScreendump
+
+  call Run_Test_display_lastline('')
+  call Run_Test_display_lastline('euro_')
+
+  call assert_fails(':set fillchars=lastline:', 'E474:')
+  call assert_fails(':set fillchars=lastline:〇', 'E474:')
+endfunc
+
 
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    656,
+/**/
     655,
 /**/
     654,