From 7e0bae024d4c1673cff31763227ad52b936fa56f Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 11 Aug 2023 23:15:38 +0200 Subject: patch 9.0.1687: mapset() not properly handling script ID Problem: mapset() not properly handling script ID Solution: replace_termcodes() may accept a script ID closes: #12699 closes: #12697 Signed-off-by: Christian Brabandt Co-authored-by: zeertzjq --- src/clientserver.c | 2 +- src/if_ole.cpp | 2 +- src/map.c | 27 +++++++++++++++------------ src/menu.c | 2 +- src/optionstr.c | 2 +- src/proto/term.pro | 2 +- src/term.c | 6 ++++-- src/terminal.c | 2 +- src/testdir/test_map_functions.vim | 26 +++++++++++++++++++++++++- src/usercmd.c | 2 +- src/version.c | 2 ++ 11 files changed, 53 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/clientserver.c b/src/clientserver.c index 400a4ad3eb..cfc0ab6613 100644 --- a/src/clientserver.c +++ b/src/clientserver.c @@ -34,7 +34,7 @@ server_to_input_buf(char_u *str) // The last but one parameter of replace_termcodes() is TRUE so that the // sequence is recognised - needed for a real backslash. p_cpo = (char_u *)"Bk"; - str = replace_termcodes(str, &ptr, REPTERM_DO_LT, NULL); + str = replace_termcodes(str, &ptr, 0, REPTERM_DO_LT, NULL); p_cpo = cpo_save; if (*ptr != NUL) // trailing CTRL-V results in nothing diff --git a/src/if_ole.cpp b/src/if_ole.cpp index f347387a90..d191010cd0 100644 --- a/src/if_ole.cpp +++ b/src/if_ole.cpp @@ -323,7 +323,7 @@ CVim::SendKeys(BSTR keys) } /* Translate key codes like */ - str = replace_termcodes((char_u *)buffer, &ptr, REPTERM_DO_LT, NULL); + str = replace_termcodes((char_u *)buffer, &ptr, 0, REPTERM_DO_LT, NULL); /* If ptr was set, then a new buffer was allocated, * so we can free the old one. diff --git a/src/map.c b/src/map.c index 6020f63d30..5988445bd1 100644 --- a/src/map.c +++ b/src/map.c @@ -590,9 +590,9 @@ do_map( if (special) flags |= REPTERM_SPECIAL; - new_keys = replace_termcodes(keys, &keys_buf, flags, &did_simplify); + new_keys = replace_termcodes(keys, &keys_buf, 0, flags, &did_simplify); if (did_simplify) - (void)replace_termcodes(keys, &alt_keys_buf, + (void)replace_termcodes(keys, &alt_keys_buf, 0, flags | REPTERM_NO_SIMPLIFY, NULL); keys = new_keys; } @@ -602,7 +602,7 @@ do_map( if (STRICMP(rhs, "") == 0) // "" means nothing rhs = (char_u *)""; else - rhs = replace_termcodes(rhs, &arg_buf, + rhs = replace_termcodes(rhs, &arg_buf, 0, REPTERM_DO_LT | (special ? REPTERM_SPECIAL : 0), NULL); } @@ -1133,7 +1133,7 @@ map_to_exists(char_u *str, char_u *modechars, int abbr) char_u *buf; int retval; - rhs = replace_termcodes(str, &buf, REPTERM_DO_LT, NULL); + rhs = replace_termcodes(str, &buf, 0, REPTERM_DO_LT, NULL); retval = map_to_exists_mode(rhs, mode_str2flags(modechars), abbr); vim_free(buf); @@ -2488,14 +2488,15 @@ get_maparg(typval_T *argvars, typval_T *rettv, int exact) mode = get_map_mode(&which, 0); - keys_simplified = replace_termcodes(keys, &keys_buf, flags, &did_simplify); + keys_simplified = replace_termcodes(keys, &keys_buf, 0, flags, + &did_simplify); rhs = check_map(keys_simplified, mode, exact, FALSE, abbr, &mp, &buffer_local); if (did_simplify) { // When the lhs is being simplified the not-simplified keys are // preferred for printing, like in do_map(). - (void)replace_termcodes(keys, &alt_keys_buf, + (void)replace_termcodes(keys, &alt_keys_buf, 0, flags | REPTERM_NO_SIMPLIFY, NULL); rhs = check_map(alt_keys_buf, mode, exact, FALSE, abbr, &mp, &buffer_local); @@ -2579,7 +2580,8 @@ f_maplist(typval_T *argvars UNUSED, typval_T *rettv) did_simplify = FALSE; lhs = str2special_save(mp->m_keys, TRUE, FALSE); - (void)replace_termcodes(lhs, &keys_buf, flags, &did_simplify); + (void)replace_termcodes(lhs, &keys_buf, 0, flags, + &did_simplify); vim_free(lhs); mapblock2dict(mp, d, @@ -2758,11 +2760,6 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED) return; } orig_rhs = rhs; - if (STRICMP(rhs, "") == 0) // "" means nothing - rhs = (char_u *)""; - else - rhs = replace_termcodes(rhs, &arg_buf, - REPTERM_DO_LT | REPTERM_SPECIAL, NULL); noremap = dict_get_number(d, "noremap") ? REMAP_NONE: 0; if (dict_get_number(d, "script") != 0) @@ -2776,6 +2773,12 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED) nowait = dict_get_number(d, "nowait") != 0; // mode from the dict is not used + if (STRICMP(rhs, "") == 0) // "" means nothing + rhs = (char_u *)""; + else + rhs = replace_termcodes(rhs, &arg_buf, sid, + REPTERM_DO_LT | REPTERM_SPECIAL, NULL); + if (buffer) { map_table = curbuf->b_maphash; diff --git a/src/menu.c b/src/menu.c index 04cd5f103c..e4008baab4 100644 --- a/src/menu.c +++ b/src/menu.c @@ -394,7 +394,7 @@ ex_menu( else if (modes & MENU_TIP_MODE) map_buf = NULL; // Menu tips are plain text. else - map_to = replace_termcodes(map_to, &map_buf, + map_to = replace_termcodes(map_to, &map_buf, 0, REPTERM_DO_LT | (special ? REPTERM_SPECIAL : 0), NULL); menuarg.modes = modes; #ifdef FEAT_TOOLBAR diff --git a/src/optionstr.c b/src/optionstr.c index 06958aab2c..31e30e195b 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -2102,7 +2102,7 @@ did_set_pastetoggle(optset_T *args UNUSED) // translate key codes like in a mapping if (*p_pt) { - (void)replace_termcodes(p_pt, &p, + (void)replace_termcodes(p_pt, &p, 0, REPTERM_FROM_PART | REPTERM_DO_LT, NULL); if (p != NULL) { diff --git a/src/proto/term.pro b/src/proto/term.pro index 4c93a81306..4150cbe000 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -85,7 +85,7 @@ int decode_modifiers(int n); int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen); void term_get_fg_color(char_u *r, char_u *g, char_u *b); void term_get_bg_color(char_u *r, char_u *g, char_u *b); -char_u *replace_termcodes(char_u *from, char_u **bufp, int flags, int *did_simplify); +char_u *replace_termcodes(char_u *from, char_u **bufp, scid_T sid_arg, int flags, int *did_simplify); void show_termcodes(int flags); int show_one_termcode(char_u *name, char_u *code, int printit); void update_tcap(int attr); diff --git a/src/term.c b/src/term.c index 0416acc705..15420450e1 100644 --- a/src/term.c +++ b/src/term.c @@ -6591,6 +6591,8 @@ term_get_bg_color(char_u *r, char_u *g, char_u *b) replace_termcodes( char_u *from, char_u **bufp, + scid_T sid_arg UNUSED, // script ID to use for , + // or 0 to use current_sctx int flags, int *did_simplify) { @@ -6660,12 +6662,12 @@ replace_termcodes( */ if (STRNICMP(src, "", 5) == 0) { - if (current_sctx.sc_sid <= 0) + if (sid_arg < 0 || (sid_arg == 0 && current_sctx.sc_sid <= 0)) emsg(_(e_using_sid_not_in_script_context)); else { char_u *dot; - long sid = current_sctx.sc_sid; + long sid = sid_arg != 0 ? sid_arg : current_sctx.sc_sid; src += 5; if (in_vim9script() diff --git a/src/terminal.c b/src/terminal.c index d235eb34c9..cb889ae19a 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -867,7 +867,7 @@ ex_terminal(exarg_T *eap) vim_free(opt.jo_eof_chars); p = skiptowhite(cmd); *p = NUL; - keys = replace_termcodes(ep + 1, &buf, + keys = replace_termcodes(ep + 1, &buf, 0, REPTERM_FROM_PART | REPTERM_DO_LT | REPTERM_SPECIAL, NULL); opt.jo_set2 |= JO2_EOF_CHARS; opt.jo_eof_chars = vim_strsave(keys); diff --git a/src/testdir/test_map_functions.vim b/src/testdir/test_map_functions.vim index d76c79cb85..4c62f89ff5 100644 --- a/src/testdir/test_map_functions.vim +++ b/src/testdir/test_map_functions.vim @@ -494,8 +494,32 @@ func Test_map_restore() nunmap endfunc -" Test restoring the script context of a mapping +" Test restoring an mapping func Test_map_restore_sid() + func RestoreMap() + const d = maparg('', 'i', v:false, v:true) + iunmap + call mapset('i', v:false, d) + endfunc + + let mapscript =<< trim [CODE] + inoremap Return =42 + inoremap