vim-patch:9.0.1243: :setglobal cannot use script-local function for "expr" option (#21997)

Problem:    :setglobal cannot use script-local function for "expr" option.
Solution:   Use the pointer to the option value properly. (closes vim/vim#11883)

01d4efe2e8
This commit is contained in:
zeertzjq
2023-01-26 07:46:51 +08:00
committed by GitHub
parent c94d8e7f13
commit f15947866c
5 changed files with 155 additions and 22 deletions

View File

@@ -1497,12 +1497,12 @@ static void did_set_vartabstop(buf_T *buf, win_T *win, char **varp, char **errms
}
}
static void did_set_optexpr(win_T *win, char **p_opt, char **varp, char **gvarp)
static void did_set_optexpr(char **varp)
{
char *name = get_scriptlocal_funcname(*p_opt);
char *name = get_scriptlocal_funcname(*varp);
if (name != NULL) {
free_string_option(*p_opt);
*p_opt = name;
free_string_option(*varp);
*varp = name;
}
}
@@ -1808,23 +1808,18 @@ static char *did_set_string_option_for(buf_T *buf, win_T *win, int opt_idx, char
did_set_varsoftabstop(buf, varp, &errmsg);
} else if (varp == &buf->b_p_vts) { // 'vartabstop'
did_set_vartabstop(buf, win, varp, &errmsg);
} else if (varp == &p_dex) { // 'diffexpr'
did_set_optexpr(win, &p_dex, varp, gvarp);
} else if (varp == &win->w_p_fde) { // 'foldexpr'
did_set_optexpr(win, &win->w_p_fde, varp, gvarp);
if (foldmethodIsExpr(win)) {
} else if (varp == &p_dex // 'diffexpr'
|| gvarp == &win->w_allbuf_opt.wo_fde // 'foldexpr'
|| gvarp == &win->w_allbuf_opt.wo_fdt // 'foldtext'
|| gvarp == &p_fex // 'formatexpr'
|| gvarp == &p_inex // 'includeexpr'
|| gvarp == &p_inde // 'indentexpr'
|| varp == &p_pex // 'patchexpr'
|| varp == &p_ccv) { // 'charconvert'
did_set_optexpr(varp);
if (varp == &win->w_p_fde && foldmethodIsExpr(win)) {
foldUpdateAll(win);
}
} else if (varp == &win->w_p_fdt) { // 'foldtext'
did_set_optexpr(win, &win->w_p_fdt, varp, gvarp);
} else if (varp == &p_pex) { // 'patchexpr'
did_set_optexpr(win, &p_pex, varp, gvarp);
} else if (gvarp == &p_fex) { // 'formatexpr'
did_set_optexpr(win, &buf->b_p_fex, varp, gvarp);
} else if (gvarp == &p_inex) { // 'includeexpr'
did_set_optexpr(win, &buf->b_p_inex, varp, gvarp);
} else if (gvarp == &p_inde) { // 'indentexpr'
did_set_optexpr(win, &buf->b_p_inde, varp, gvarp);
} else if (gvarp == &p_cfu) { // 'completefunc'
set_completefunc_option(&errmsg);
} else if (gvarp == &p_ofu) { // 'omnifunc'