]> granicus.if.org Git - vim/commitdiff
patch 9.0.0656: cannot specify another character to use instead of '@' v9.0.0656
authorBram Moolenaar <Bram@vim.org>
Tue, 4 Oct 2022 13:36:29 +0000 (14:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 4 Oct 2022 13:36:29 +0000 (14:36 +0100)
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)

17 files changed:
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 [new file with mode: 0644]
src/testdir/dumps/Test_display_lastline_euro_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_display_lastline_euro_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_display_lastline_euro_3.dump [new file with mode: 0644]
src/testdir/dumps/Test_display_lastline_euro_4.dump [new file with mode: 0644]
src/testdir/dumps/Test_display_lastline_euro_5.dump [new file with mode: 0644]
src/testdir/test_display.vim
src/version.c

index a0098a7bddd71398dcb5e6c836ec922a42c1a9ee..b3c4a408eca3e02e0a8cbe7ab1a305ff4d4ba8d9 100644 (file)
@@ -2956,6 +2956,9 @@ A jump table for the options with a short description can be found at |Q_op|.
        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 short description can be found at |Q_op|.
          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 short description can be found at |Q_op|.
          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)
index fa5d6683df32370ce3b5b04a8f28233edc603932..47354924233d951f84ecfd817fdac6e171a0f7a7 100644 (file)
@@ -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;
        }
     }
index 2ce3ec37dd9150722f8d42250c786077c45a53e8..8a122ba1bd0ca8319b96733bda51e70db9806ffa 100644 (file)
@@ -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,
index ebb5ffcedffa0893f2e18e5a2ea03394b5450b07..e5fd4bf0d4c4308c6ed050d2ae4e76e5e583d8a3 100644 (file)
@@ -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 **varp, int apply)
        {&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 **varp, int apply)
                fill_chars.foldsep = '|';
                fill_chars.diff = '-';
                fill_chars.eob = '~';
+               fill_chars.lastline = '@';
            }
        }
        p = value;
index d68468c1b8d266d249f769ba39b9d7543c2dceda..686aa8f6c725bd36e41a07344d2e1314e9669925 100644 (file)
@@ -3519,6 +3519,7 @@ typedef struct
     int        foldsep;
     int        diff;
     int        eob;
+    int        lastline;
 } fill_chars_T;
 
 /*
index b0e34ead43e0e51be4647f21e997135c4e1910b9..d074773b8f9c3bb750b4493cd23dd515abcbf5dd 100644 (file)
@@ -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
index 2bd33094742734fa07f7f7186a67779ed24ebe98..065e5d85880cb106ead031667e714f13d127334a 100644 (file)
@@ -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
index a0b6e09ba735d35de5b08e531ec353b867a41b83..38673ab56426e5bf14c0edcb13f7bcb7be435d42 100644 (file)
@@ -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&&
index e34e7c76619862ac3772df126f2e70be6c672468..29786319cbb6dc101a4d1dc96cd0f5d8ec0302c6 100644 (file)
@@ -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&&
diff --git a/src/testdir/dumps/Test_display_lastline_5.dump b/src/testdir/dumps/Test_display_lastline_5.dump
new file mode 100644 (file)
index 0000000..7567da1
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_display_lastline_euro_1.dump b/src/testdir/dumps/Test_display_lastline_euro_1.dump
new file mode 100644 (file)
index 0000000..2223d87
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_display_lastline_euro_2.dump b/src/testdir/dumps/Test_display_lastline_euro_2.dump
new file mode 100644 (file)
index 0000000..e8da202
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_display_lastline_euro_3.dump b/src/testdir/dumps/Test_display_lastline_euro_3.dump
new file mode 100644 (file)
index 0000000..db414e7
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_display_lastline_euro_4.dump b/src/testdir/dumps/Test_display_lastline_euro_4.dump
new file mode 100644 (file)
index 0000000..492438c
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_display_lastline_euro_5.dump b/src/testdir/dumps/Test_display_lastline_euro_5.dump
new file mode 100644 (file)
index 0000000..75fc732
--- /dev/null
@@ -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
index 7237ed8a2f262ddd6d02c2ae647c2790de44d3f5..4d2ee9f202867218c46ea55fcd60574376147906 100644 (file)
@@ -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(100)])
+      call setline(1, ['aaa', 'b'->repeat(200)])
       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
index dc9b6bd4a6311510cea511ef4d67291c31c5747c..a90ab473e7e00042e67961acf3a5dd2ffde60e22 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    656,
 /**/
     655,
 /**/