Problem: Script context not restored after using <ScriptCmd>.
Solution: Also restore context when not in a script. (closes #9536)
Add the 'c' flag to feedkeys() to be able to test this.
Note that if you manage to call feedkeys() while
executing commands, thus calling it recursively, then
all typeahead will be consumed by the last call.
+ 'c' Remove any script context when executing, so that
+ legacy script syntax applies, "s:var" does not work,
+ etc.
'!' When used with 'x' will not end Insert mode. Can be
used in a test when a timer is set to exit Insert mode
a little later. Useful for testing CursorHoldI.
char_u nbuf[NUMBUFLEN];
int typed = FALSE;
int execute = FALSE;
+ int context = FALSE;
int dangerous = FALSE;
int lowlevel = FALSE;
char_u *keys_esc;
case 't': typed = TRUE; break;
case 'i': insert = TRUE; break;
case 'x': execute = TRUE; break;
+ case 'c': context = TRUE; break;
case '!': dangerous = TRUE; break;
case 'L': lowlevel = TRUE; break;
}
if (execute)
{
- int save_msg_scroll = msg_scroll;
+ int save_msg_scroll = msg_scroll;
+ sctx_T save_sctx;
// Avoid a 1 second delay when the keys start Insert mode.
msg_scroll = FALSE;
+ if (context)
+ {
+ save_sctx = current_sctx;
+ current_sctx.sc_sid = 0;
+ current_sctx.sc_version = 0;
+ }
+
if (!dangerous)
{
++ex_normal_busy;
}
msg_scroll |= save_msg_scroll;
+
+ if (context)
+ current_sctx = save_sctx;
}
}
}
}
}
else
- ga_append(&line_ga, (char)c1);
+ ga_append(&line_ga, c1);
cmod = 0;
}
{
int res;
#ifdef FEAT_EVAL
- sctx_T save_current_sctx = {0, 0, 0, 0};
+ sctx_T save_current_sctx = {-1, 0, 0, 0};
if (key == K_SCRIPT_COMMAND && last_used_map != NULL)
{
res = do_cmdline(NULL, getcmdkeycmd, NULL, flags);
#ifdef FEAT_EVAL
- if (save_current_sctx.sc_sid > 0)
+ if (save_current_sctx.sc_sid >= 0)
current_sctx = save_current_sctx;
#endif
source check.vim
source screendump.vim
source term_util.vim
+source vim9.vim
func Test_abbreviation()
" abbreviation with 0x80 should work
ounmap i-
endfunc
+func Test_map_script_cmd_restore()
+ let lines =<< trim END
+ vim9script
+ nnoremap <F3> <ScriptCmd>eval 1 + 2<CR>
+ END
+ call CheckScriptSuccess(lines)
+ call feedkeys("\<F3>:let g:result = 3+4\<CR>", 'xtc')
+ call assert_equal(7, g:result)
+
+ nunmap <F3>
+ unlet g:result
+endfunc
+
" Test for using <script> with a map to remap characters in rhs
func Test_script_local_remap()
new
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 4107,
/**/
4106,
/**/