summaryrefslogtreecommitdiffstats
path: root/src/option.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-12-17 16:21:20 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-17 16:21:20 +0000
commitdb1a410b610b2c1941311acc57dcc4afec20720e (patch)
tree9bd19ace55b20647fa29bea3dbbeef2b8d30cdd6 /src/option.c
parentd2ff705af32862b4da49d213613233f93343874c (diff)
patch 8.2.3838: cannot use script-local function for setting *func optionsv8.2.3838
Problem: Cannot use script-local function for setting *func options. Solution: Use the script context. (Yegappan Lakshmanan, closes #9362)
Diffstat (limited to 'src/option.c')
-rw-r--r--src/option.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/option.c b/src/option.c
index de6e562c26..b55789dba5 100644
--- a/src/option.c
+++ b/src/option.c
@@ -7199,17 +7199,39 @@ option_set_callback_func(char_u *optval UNUSED, callback_T *optcb UNUSED)
return OK;
}
- if (STRNCMP(optval, "s:", 2) == 0 && !SCRIPT_ID_VALID(current_sctx.sc_sid))
- return FAIL;
-
if (*optval == '{' || (in_vim9script() && *optval == '(')
|| (STRNCMP(optval, "function(", 9) == 0)
|| (STRNCMP(optval, "funcref(", 8) == 0))
// Lambda expression or a funcref
tv = eval_expr(optval, NULL);
else
+ {
// treat everything else as a function name string
- tv = alloc_string_tv(vim_strsave(optval));
+
+ // Function name starting with "s:" are supported only in a vimscript
+ // context.
+ if (STRNCMP(optval, "s:", 2) == 0)
+ {
+ char sid_buf[25];
+ char_u *funcname;
+
+ if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
+ {
+ emsg(_(e_using_sid_not_in_script_context));
+ return FAIL;
+ }
+ // Expand s: prefix into <SNR>nr_<name>
+ sprintf(sid_buf, "<SNR>%ld_", (long)current_sctx.sc_sid);
+ funcname = alloc(STRLEN(sid_buf) + STRLEN(optval + 2) + 1);
+ if (funcname == NULL)
+ return FAIL;
+ STRCPY(funcname, sid_buf);
+ STRCAT(funcname, optval + 2);
+ tv = alloc_string_tv(funcname);
+ }
+ else
+ tv = alloc_string_tv(vim_strsave(optval));
+ }
if (tv == NULL)
return FAIL;