Mercurial > vim
changeset 29672:6b8aaf16af99 v9.0.0176
patch 9.0.0176: checking character options is duplicated and incomplete
Commit: https://github.com/vim/vim/commit/8ca29b6a3599b82b8822b7697cad63d0244c2d59
Author: zeertzjq <zeertzjq@outlook.com>
Date: Tue Aug 9 12:53:14 2022 +0100
patch 9.0.0176: checking character options is duplicated and incomplete
Problem: Checking character options is duplicated and incomplete.
Solution: Move checking to check_chars_options(). (closes https://github.com/vim/vim/issues/10863)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 09 Aug 2022 14:00:05 +0200 |
parents | 4e3501a00ec7 |
children | d3904bdae951 |
files | src/mbyte.c src/optionstr.c src/proto/screen.pro src/screen.c src/testdir/test_options.vim src/version.c |
diffstat | 6 files changed, 42 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/src/mbyte.c +++ b/src/mbyte.c @@ -5645,31 +5645,9 @@ f_setcellwidths(typval_T *argvars, typva 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));
--- 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'
--- 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 : */
--- a/src/screen.c +++ b/src/screen.c @@ -5155,3 +5155,28 @@ set_chars_option(win_T *wp, char_u **var 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; +}
--- 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