vim-patch:8.2.3545: setcellwidths() may make 'listchars' or 'fillchars' invalid

Problem:    setcellwidths() may make 'listchars' or 'fillchars' invalid.
Solution:   Check the value and give an error. (closes vim/vim#9024)
94358a1e6e

Cherry-pick f_setcellwidths() change from patch 9.0.0036.
Cherry-pick 'ambiwidth' docs update from runtime update 079ba76ae7a7.
This commit is contained in:
zeertzjq
2022-08-08 12:08:28 +08:00
parent 01a7009af9
commit 9fedb6fd78
6 changed files with 55 additions and 4 deletions

View File

@@ -2838,7 +2838,38 @@ void f_setcellwidths(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
xfree(ptrs);
xfree(cw_table);
cw_interval_T *const cw_table_save = cw_table;
const size_t cw_table_size_save = cw_table_size;
cw_table = table;
cw_table_size = (size_t)tv_list_len(l);
// Check that the new value does not conflict with 'fillchars' or
// 'listchars'.
char *error = NULL;
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 {
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;
}
}
}
if (error != NULL) {
emsg(_(error));
cw_table = cw_table_save;
cw_table_size = cw_table_size_save;
xfree(table);
return;
}
xfree(cw_table_save);
}