forked from aniani/vim
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 <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
committed by
Christian Brabandt
parent
cd4e4e169a
commit
7e0bae024d
@@ -34,7 +34,7 @@ server_to_input_buf(char_u *str)
|
|||||||
// The last but one parameter of replace_termcodes() is TRUE so that the
|
// The last but one parameter of replace_termcodes() is TRUE so that the
|
||||||
// <lt> sequence is recognised - needed for a real backslash.
|
// <lt> sequence is recognised - needed for a real backslash.
|
||||||
p_cpo = (char_u *)"Bk";
|
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;
|
p_cpo = cpo_save;
|
||||||
|
|
||||||
if (*ptr != NUL) // trailing CTRL-V results in nothing
|
if (*ptr != NUL) // trailing CTRL-V results in nothing
|
||||||
|
@@ -323,7 +323,7 @@ CVim::SendKeys(BSTR keys)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Translate key codes like <Esc> */
|
/* 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,
|
/* If ptr was set, then a new buffer was allocated,
|
||||||
* so we can free the old one.
|
* so we can free the old one.
|
||||||
|
27
src/map.c
27
src/map.c
@@ -590,9 +590,9 @@ do_map(
|
|||||||
|
|
||||||
if (special)
|
if (special)
|
||||||
flags |= REPTERM_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)
|
if (did_simplify)
|
||||||
(void)replace_termcodes(keys, &alt_keys_buf,
|
(void)replace_termcodes(keys, &alt_keys_buf, 0,
|
||||||
flags | REPTERM_NO_SIMPLIFY, NULL);
|
flags | REPTERM_NO_SIMPLIFY, NULL);
|
||||||
keys = new_keys;
|
keys = new_keys;
|
||||||
}
|
}
|
||||||
@@ -602,7 +602,7 @@ do_map(
|
|||||||
if (STRICMP(rhs, "<nop>") == 0) // "<Nop>" means nothing
|
if (STRICMP(rhs, "<nop>") == 0) // "<Nop>" means nothing
|
||||||
rhs = (char_u *)"";
|
rhs = (char_u *)"";
|
||||||
else
|
else
|
||||||
rhs = replace_termcodes(rhs, &arg_buf,
|
rhs = replace_termcodes(rhs, &arg_buf, 0,
|
||||||
REPTERM_DO_LT | (special ? REPTERM_SPECIAL : 0), NULL);
|
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;
|
char_u *buf;
|
||||||
int retval;
|
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);
|
retval = map_to_exists_mode(rhs, mode_str2flags(modechars), abbr);
|
||||||
vim_free(buf);
|
vim_free(buf);
|
||||||
@@ -2488,14 +2488,15 @@ get_maparg(typval_T *argvars, typval_T *rettv, int exact)
|
|||||||
|
|
||||||
mode = get_map_mode(&which, 0);
|
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,
|
rhs = check_map(keys_simplified, mode, exact, FALSE, abbr,
|
||||||
&mp, &buffer_local);
|
&mp, &buffer_local);
|
||||||
if (did_simplify)
|
if (did_simplify)
|
||||||
{
|
{
|
||||||
// When the lhs is being simplified the not-simplified keys are
|
// When the lhs is being simplified the not-simplified keys are
|
||||||
// preferred for printing, like in do_map().
|
// 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);
|
flags | REPTERM_NO_SIMPLIFY, NULL);
|
||||||
rhs = check_map(alt_keys_buf, mode, exact, FALSE, abbr, &mp,
|
rhs = check_map(alt_keys_buf, mode, exact, FALSE, abbr, &mp,
|
||||||
&buffer_local);
|
&buffer_local);
|
||||||
@@ -2579,7 +2580,8 @@ f_maplist(typval_T *argvars UNUSED, typval_T *rettv)
|
|||||||
did_simplify = FALSE;
|
did_simplify = FALSE;
|
||||||
|
|
||||||
lhs = str2special_save(mp->m_keys, TRUE, 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);
|
vim_free(lhs);
|
||||||
|
|
||||||
mapblock2dict(mp, d,
|
mapblock2dict(mp, d,
|
||||||
@@ -2758,11 +2760,6 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
orig_rhs = rhs;
|
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;
|
noremap = dict_get_number(d, "noremap") ? REMAP_NONE: 0;
|
||||||
if (dict_get_number(d, "script") != 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;
|
nowait = dict_get_number(d, "nowait") != 0;
|
||||||
// mode from the dict is not used
|
// 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)
|
if (buffer)
|
||||||
{
|
{
|
||||||
map_table = curbuf->b_maphash;
|
map_table = curbuf->b_maphash;
|
||||||
|
@@ -394,7 +394,7 @@ ex_menu(
|
|||||||
else if (modes & MENU_TIP_MODE)
|
else if (modes & MENU_TIP_MODE)
|
||||||
map_buf = NULL; // Menu tips are plain text.
|
map_buf = NULL; // Menu tips are plain text.
|
||||||
else
|
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);
|
REPTERM_DO_LT | (special ? REPTERM_SPECIAL : 0), NULL);
|
||||||
menuarg.modes = modes;
|
menuarg.modes = modes;
|
||||||
#ifdef FEAT_TOOLBAR
|
#ifdef FEAT_TOOLBAR
|
||||||
|
@@ -2102,7 +2102,7 @@ did_set_pastetoggle(optset_T *args UNUSED)
|
|||||||
// translate key codes like in a mapping
|
// translate key codes like in a mapping
|
||||||
if (*p_pt)
|
if (*p_pt)
|
||||||
{
|
{
|
||||||
(void)replace_termcodes(p_pt, &p,
|
(void)replace_termcodes(p_pt, &p, 0,
|
||||||
REPTERM_FROM_PART | REPTERM_DO_LT, NULL);
|
REPTERM_FROM_PART | REPTERM_DO_LT, NULL);
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
{
|
{
|
||||||
|
@@ -85,7 +85,7 @@ int decode_modifiers(int n);
|
|||||||
int check_termcode(int max_offset, char_u *buf, int bufsize, int *buflen);
|
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_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);
|
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);
|
void show_termcodes(int flags);
|
||||||
int show_one_termcode(char_u *name, char_u *code, int printit);
|
int show_one_termcode(char_u *name, char_u *code, int printit);
|
||||||
void update_tcap(int attr);
|
void update_tcap(int attr);
|
||||||
|
@@ -6591,6 +6591,8 @@ term_get_bg_color(char_u *r, char_u *g, char_u *b)
|
|||||||
replace_termcodes(
|
replace_termcodes(
|
||||||
char_u *from,
|
char_u *from,
|
||||||
char_u **bufp,
|
char_u **bufp,
|
||||||
|
scid_T sid_arg UNUSED, // script ID to use for <SID>,
|
||||||
|
// or 0 to use current_sctx
|
||||||
int flags,
|
int flags,
|
||||||
int *did_simplify)
|
int *did_simplify)
|
||||||
{
|
{
|
||||||
@@ -6660,12 +6662,12 @@ replace_termcodes(
|
|||||||
*/
|
*/
|
||||||
if (STRNICMP(src, "<SID>", 5) == 0)
|
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));
|
emsg(_(e_using_sid_not_in_script_context));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char_u *dot;
|
char_u *dot;
|
||||||
long sid = current_sctx.sc_sid;
|
long sid = sid_arg != 0 ? sid_arg : current_sctx.sc_sid;
|
||||||
|
|
||||||
src += 5;
|
src += 5;
|
||||||
if (in_vim9script()
|
if (in_vim9script()
|
||||||
|
@@ -867,7 +867,7 @@ ex_terminal(exarg_T *eap)
|
|||||||
vim_free(opt.jo_eof_chars);
|
vim_free(opt.jo_eof_chars);
|
||||||
p = skiptowhite(cmd);
|
p = skiptowhite(cmd);
|
||||||
*p = NUL;
|
*p = NUL;
|
||||||
keys = replace_termcodes(ep + 1, &buf,
|
keys = replace_termcodes(ep + 1, &buf, 0,
|
||||||
REPTERM_FROM_PART | REPTERM_DO_LT | REPTERM_SPECIAL, NULL);
|
REPTERM_FROM_PART | REPTERM_DO_LT | REPTERM_SPECIAL, NULL);
|
||||||
opt.jo_set2 |= JO2_EOF_CHARS;
|
opt.jo_set2 |= JO2_EOF_CHARS;
|
||||||
opt.jo_eof_chars = vim_strsave(keys);
|
opt.jo_eof_chars = vim_strsave(keys);
|
||||||
|
@@ -494,8 +494,32 @@ func Test_map_restore()
|
|||||||
nunmap <C-B>
|
nunmap <C-B>
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Test restoring the script context of a mapping
|
" Test restoring an <SID> mapping
|
||||||
func Test_map_restore_sid()
|
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]
|
let after =<< trim [CODE]
|
||||||
call assert_equal("\tLast set from --cmd argument",
|
call assert_equal("\tLast set from --cmd argument",
|
||||||
\ execute('verbose nmap ,n')->trim()->split("\n")[-1])
|
\ execute('verbose nmap ,n')->trim()->split("\n")[-1])
|
||||||
|
@@ -990,7 +990,7 @@ uc_add_command(
|
|||||||
char_u *rep_buf = NULL;
|
char_u *rep_buf = NULL;
|
||||||
garray_T *gap;
|
garray_T *gap;
|
||||||
|
|
||||||
replace_termcodes(rep, &rep_buf, 0, NULL);
|
replace_termcodes(rep, &rep_buf, 0, 0, NULL);
|
||||||
if (rep_buf == NULL)
|
if (rep_buf == NULL)
|
||||||
{
|
{
|
||||||
// can't replace termcodes - try using the string as is
|
// can't replace termcodes - try using the string as is
|
||||||
|
@@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1687,
|
||||||
/**/
|
/**/
|
||||||
1686,
|
1686,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user