summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-08-11 23:15:38 +0200
committerChristian Brabandt <cb@256bit.org>2023-08-11 23:16:10 +0200
commit7e0bae024d4c1673cff31763227ad52b936fa56f (patch)
treef76335fcdc8bd03dc55fbefe671dd5729021320d /src
parentcd4e4e169ab3ff0b9315e5bc16d5ba490ee251ff (diff)
patch 9.0.1687: mapset() not properly handling script IDv9.0.1687
Problem: mapset() not properly handling script ID Solution: replace_termcodes() may accept a script ID closes: #12699 closes: #12697 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
Diffstat (limited to 'src')
-rw-r--r--src/clientserver.c2
-rw-r--r--src/if_ole.cpp2
-rw-r--r--src/map.c27
-rw-r--r--src/menu.c2
-rw-r--r--src/optionstr.c2
-rw-r--r--src/proto/term.pro2
-rw-r--r--src/term.c6
-rw-r--r--src/terminal.c2
-rw-r--r--src/testdir/test_map_functions.vim26
-rw-r--r--src/usercmd.c2
-rw-r--r--src/version.c2
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.
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, "<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,