summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-08-09 12:53:14 +0100
committerBram Moolenaar <Bram@vim.org>2022-08-09 12:53:14 +0100
commit8ca29b6a3599b82b8822b7697cad63d0244c2d59 (patch)
tree9abef23b2de61a59e95a317edc9cabdf40425637
parentafa23d1b99692e3c726eb694933ab348b442a1e4 (diff)
patch 9.0.0176: checking character options is duplicated and incompletev9.0.0176
Problem: Checking character options is duplicated and incomplete. Solution: Move checking to check_chars_options(). (closes #10863)
-rw-r--r--src/mbyte.c28
-rw-r--r--src/optionstr.c18
-rw-r--r--src/proto/screen.pro1
-rw-r--r--src/screen.c25
-rw-r--r--src/testdir/test_options.vim12
-rw-r--r--src/version.c2
6 files changed, 42 insertions, 44 deletions
diff --git a/src/mbyte.c b/src/mbyte.c
index 691c1608e3..941411b4a9 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -5645,31 +5645,9 @@ f_setcellwidths(typval_T *argvars, typval_T *rettv UNUSED)
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, FALSE) != NULL)
- error = e_conflicts_with_value_of_fillchars;
- else if (set_chars_option(curwin, &p_lcs, FALSE) != NULL)
- error = e_conflicts_with_value_of_listchars;
- else
- {
- tabpage_T *tp;
- win_T *wp;
-
- FOR_ALL_TAB_WINDOWS(tp, wp)
- {
- if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
- {
- error = e_conflicts_with_value_of_listchars;
- break;
- }
- if (set_chars_option(wp, &wp->w_p_fcs, FALSE) != NULL)
- {
- error = e_conflicts_with_value_of_fillchars;
- break;
- }
- }
- }
+ // Check that the new value does not conflict with 'listchars' or
+ // 'fillchars'.
+ error = check_chars_options();
if (error != NULL)
{
emsg(_(error));
diff --git a/src/optionstr.c b/src/optionstr.c
index 331207b67e..7f5a9408c7 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -866,24 +866,8 @@ did_set_string_option(
{
if (check_opt_strings(p_ambw, p_ambw_values, FALSE) != OK)
errmsg = e_invalid_argument;
- else if (set_chars_option(curwin, &p_fcs, FALSE) != NULL)
- errmsg = e_conflicts_with_value_of_fillchars;
else
- {
- tabpage_T *tp;
- win_T *wp;
-
- FOR_ALL_TAB_WINDOWS(tp, wp)
- {
- if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
- {
- errmsg = e_conflicts_with_value_of_listchars;
- goto ambw_end;
- }
- }
- }
-ambw_end:
- {}
+ errmsg = check_chars_options();
}
// 'background'
diff --git a/src/proto/screen.pro b/src/proto/screen.pro
index 66fc0f3da2..81e5e101c1 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -56,4 +56,5 @@ int number_width(win_T *wp);
int screen_screencol(void);
int screen_screenrow(void);
char *set_chars_option(win_T *wp, char_u **varp, int apply);
+char *check_chars_options(void);
/* vim: set ft=c : */
diff --git a/src/screen.c b/src/screen.c
index 1f223f9be7..6929501c4e 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -5155,3 +5155,28 @@ set_chars_option(win_T *wp, char_u **varp, int apply)
return NULL; // no error
}
+
+/*
+ * Check all global and local values of 'listchars' and 'fillchars'.
+ * Return an untranslated error messages if any of them is invalid, NULL
+ * otherwise.
+ */
+ char *
+check_chars_options(void)
+{
+ tabpage_T *tp;
+ win_T *wp;
+
+ if (set_chars_option(curwin, &p_lcs, FALSE) != NULL)
+ return e_conflicts_with_value_of_listchars;
+ if (set_chars_option(curwin, &p_fcs, FALSE) != NULL)
+ return e_conflicts_with_value_of_fillchars;
+ FOR_ALL_TAB_WINDOWS(tp, wp)
+ {
+ if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
+ return e_conflicts_with_value_of_listchars;
+ if (set_chars_option(wp, &wp->w_p_fcs, FALSE) != NULL)
+ return e_conflicts_with_value_of_fillchars;
+ }
+ return NULL;
+}
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 01418bd6d6..ba08dd7968 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -466,9 +466,17 @@ func Test_set_errors()
call assert_fails('set sessionoptions=curdir,sesdir', 'E474:')
call assert_fails('set foldmarker={{{,', 'E474:')
call assert_fails('set sessionoptions=sesdir,curdir', 'E474:')
- call assert_fails('set listchars=trail:· ambiwidth=double', 'E834:')
+ setlocal listchars=trail:·
+ call assert_fails('set ambiwidth=double', 'E834:')
+ setlocal listchars=trail:-
+ setglobal listchars=trail:·
+ call assert_fails('set ambiwidth=double', 'E834:')
set listchars&
- call assert_fails('set fillchars=stl:· ambiwidth=double', 'E835:')
+ setlocal fillchars=stl:·
+ call assert_fails('set ambiwidth=double', 'E835:')
+ setlocal fillchars=stl:-
+ setglobal fillchars=stl:·
+ call assert_fails('set ambiwidth=double', 'E835:')
set fillchars&
call assert_fails('set fileencoding=latin1,utf-8', 'E474:')
set nomodifiable
diff --git a/src/version.c b/src/version.c
index 39449539c5..0334bf061e 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 */
/**/
+ 176,
+/**/
175,
/**/
174,