diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/clientserver.c | 2 | ||||
-rw-r--r-- | src/if_ole.cpp | 2 | ||||
-rw-r--r-- | src/map.c | 27 | ||||
-rw-r--r-- | src/menu.c | 2 | ||||
-rw-r--r-- | src/optionstr.c | 2 | ||||
-rw-r--r-- | src/proto/term.pro | 2 | ||||
-rw-r--r-- | src/term.c | 6 | ||||
-rw-r--r-- | src/terminal.c | 2 | ||||
-rw-r--r-- | src/testdir/test_map_functions.vim | 26 | ||||
-rw-r--r-- | src/usercmd.c | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
11 files changed, 53 insertions, 22 deletions
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 // <lt> 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 <Esc> */ - 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. @@ -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, "<nop>") == 0) // "<Nop>" 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, "<nop>") == 0) // "<Nop>" 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, "<nop>") == 0) // "<Nop>" 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 <SID>, + // or 0 to use current_sctx int flags, int *did_simplify) { @@ -6660,12 +6662,12 @@ replace_termcodes( */ if (STRNICMP(src, "<SID>", 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 <C-B> endfunc -" Test restoring the script context of a mapping +" Test restoring an <SID> mapping func Test_map_restore_sid() + func RestoreMap() + const d = maparg('<CR>', 'i', v:false, v:true) + iunmap <buffer> <CR> + call mapset('i', v:false, d) + endfunc + + let mapscript =<< trim [CODE] + inoremap <silent><buffer> <SID>Return <C-R>=42<CR> + inoremap <script><buffer> <CR> <CR><SID>Return + [CODE] + call writefile(mapscript, 'Xmapscript', 'D') + + new + source Xmapscript + inoremap <buffer> <C-B> <Cmd>call RestoreMap()<CR> + call feedkeys("i\<CR>\<C-B>\<CR>", 'xt') + call assert_equal(['', '42', '42'], getline(1, '$')) + + bwipe! + delfunc RestoreMap +endfunc + +" Test restoring a mapping with a negative script ID +func Test_map_restore_negative_sid() let after =<< trim [CODE] call assert_equal("\tLast set from --cmd argument", \ execute('verbose nmap ,n')->trim()->split("\n")[-1]) diff --git a/src/usercmd.c b/src/usercmd.c index 7d844620bd..57435fafbc 100644 --- a/src/usercmd.c +++ b/src/usercmd.c @@ -990,7 +990,7 @@ uc_add_command( char_u *rep_buf = NULL; garray_T *gap; - replace_termcodes(rep, &rep_buf, 0, NULL); + replace_termcodes(rep, &rep_buf, 0, 0, NULL); if (rep_buf == NULL) { // can't replace termcodes - try using the string as is diff --git a/src/version.c b/src/version.c index f4c73e7991..dc054dfd7a 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1687, +/**/ 1686, /**/ 1685, |