]> granicus.if.org Git - vim/commitdiff
patch 8.2.3545: setcellwidths() may make 'listchars' or 'fillchars' invalid v8.2.3545
authorzeertzjq <zeertzjq@outlook.com>
Wed, 20 Oct 2021 10:01:15 +0000 (11:01 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 20 Oct 2021 10:01:15 +0000 (11:01 +0100)
Problem:    setcellwidths() may make 'listchars' or 'fillchars' invalid.
Solution:   Check the value and give an error. (closes #9024)

runtime/doc/eval.txt
src/errors.h
src/mbyte.c
src/optionstr.c
src/testdir/test_utf8.vim
src/version.c

index c3e894f26d06b7b7d14cf7c5aa0e77be9f3b3b0b..c009494318a2b298af4fb6d3cfc037594921bdeb 100644 (file)
@@ -9648,6 +9648,9 @@ setcellwidths({list})                                     *setcellwidths()*
                range overlaps with another.
                Only characters with value 0x100 and higher can be used.
 
+               If the new value causes 'fillchars' or 'listchars' to become
+               invalid it is rejected and an error is given.
+
                To clear the overrides pass an empty list: >
                   setcellwidths([]);
 <              You can use the script $VIMRUNTIME/tools/emoji_list.vim to see
index 12d00b724ad92145e5ef8043ef33aeff47da5932..96a9b2fc9393979416c5147fba722effe1f96c38 100644 (file)
@@ -160,6 +160,10 @@ EXTERN char e_list_value_does_not_have_enough_items[]
        INIT(= N_("E711: List value does not have enough items"));
 EXTERN char e_cannot_slice_dictionary[]
        INIT(= N_("E719: Cannot slice a Dictionary"));
+EXTERN char e_conflicts_with_value_of_listchars[]
+       INIT(= N_("E834: Conflicts with value of 'listchars'"));
+EXTERN char e_conflicts_with_value_of_fillchars[]
+       INIT(= N_("E835: Conflicts with value of 'fillchars'"));
 EXTERN char e_assert_fails_second_arg[]
        INIT(= N_("E856: \"assert_fails()\" second argument must be a string or a list with one or two strings"));
 EXTERN char e_using_invalid_value_as_string_str[]
index a626f50c6003175d1616de28995efd8c601456b0..76eab4e2eca2f5c6fc428a02ba9e05e4a2b9a195 100644 (file)
@@ -5510,6 +5510,8 @@ f_setcellwidths(typval_T *argvars, typval_T *rettv UNUSED)
     int                    i;
     listitem_T     **ptrs;
     cw_interval_T   *table;
+    cw_interval_T   *cw_table_save;
+    size_t         cw_table_size_save;
 
     if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL)
        return;
@@ -5620,9 +5622,41 @@ f_setcellwidths(typval_T *argvars, typval_T *rettv UNUSED)
     }
 
     vim_free(ptrs);
-    vim_free(cw_table);
+
+    cw_table_save = cw_table;
+    cw_table_size_save = cw_table_size;
     cw_table = table;
     cw_table_size = l->lv_len;
+
+    // Check that the new value does not conflict with 'fillchars' or
+    // 'listchars'.
+    if (set_chars_option(curwin, &p_fcs) != NULL)
+    {
+       emsg(_(e_conflicts_with_value_of_fillchars));
+       cw_table = cw_table_save;
+       cw_table_size = cw_table_size_save;
+       vim_free(table);
+       return;
+    }
+    else
+    {
+       tabpage_T       *tp;
+       win_T   *wp;
+
+       FOR_ALL_TAB_WINDOWS(tp, wp)
+       {
+           if (set_chars_option(wp, &wp->w_p_lcs) != NULL)
+           {
+               emsg((e_conflicts_with_value_of_listchars));
+               cw_table = cw_table_save;
+               cw_table_size = cw_table_size_save;
+               vim_free(table);
+               return;
+           }
+       }
+    }
+
+    vim_free(cw_table_save);
 }
 
     void
index 7f2b04ddc4b967a6b14731a7089eaf58c86bf3ec..3afb3dbcf75922abe5aae6df4b99258b564765a0 100644 (file)
@@ -871,7 +871,7 @@ did_set_string_option(
        if (check_opt_strings(p_ambw, p_ambw_values, FALSE) != OK)
            errmsg = e_invarg;
        else if (set_chars_option(curwin, &p_fcs) != NULL)
-           errmsg = _("E835: Conflicts with value of 'fillchars'");
+           errmsg = _(e_conflicts_with_value_of_fillchars);
        else
        {
            tabpage_T   *tp;
@@ -881,7 +881,7 @@ did_set_string_option(
            {
                if (set_chars_option(wp, &wp->w_p_lcs) != NULL)
                {
-                   errmsg = _("E834: Conflicts with value of 'listchars'");
+                   errmsg = _(e_conflicts_with_value_of_listchars);
                    goto ambw_end;
                }
            }
index 5454e430ad084c44b93ead2dbc9af165d9341535..250df0bf9a220e4f1bea9aa3846a979cf75e38de 100644 (file)
@@ -185,6 +185,16 @@ func Test_setcellwidths()
   call assert_fails('call setcellwidths([[0x111, 0x122, 1], [0x122, 0x123, 2]])', 'E1113:')
 
   call assert_fails('call setcellwidths([[0x33, 0x44, 2]])', 'E1114:')
+
+  set listchars=tab:--\\u2192
+  call assert_fails('call setcellwidths([[0x2192, 0x2192, 2]])', 'E834:')
+
+  set fillchars=stl:\\u2501
+  call assert_fails('call setcellwidths([[0x2501, 0x2501, 2]])', 'E835:')
+
+  set listchars&
+  set fillchars&
+  call setcellwidths([])
 endfunc
 
 func Test_print_overlong()
index 227db829a9f031bec7a4442cebb97e66a0c5d97d..072d11f96b85fd4427458a0035dd106d70cc143d 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3545,
 /**/
     3544,
 /**/