diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2021-12-17 16:21:20 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-17 16:21:20 +0000 |
commit | db1a410b610b2c1941311acc57dcc4afec20720e (patch) | |
tree | 9bd19ace55b20647fa29bea3dbbeef2b8d30cdd6 /src/option.c | |
parent | d2ff705af32862b4da49d213613233f93343874c (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.c | 30 |
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; |