summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-16 13:30:33 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-16 13:30:33 +0000
commita9725221ac4650b7e9219bf6e3682826fe2e0096 (patch)
tree893ca68160127bb366bf61a6795cd60d55ed51b3
parentfa1a45705995f16ee7e69434c772107a3ddeeebd (diff)
downloadvim-git-a9725221ac4650b7e9219bf6e3682826fe2e0096.tar.gz
patch 8.2.4107: script context not restored after using <ScriptCmd>v8.2.4107
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.
-rw-r--r--runtime/doc/builtin.txt3
-rw-r--r--src/evalfunc.c15
-rw-r--r--src/getchar.c6
-rw-r--r--src/testdir/test_mapping.vim14
-rw-r--r--src/version.c2
5 files changed, 36 insertions, 4 deletions
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 2605f6d3b..9029685f5 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -2394,6 +2394,9 @@ feedkeys({string} [, {mode}]) *feedkeys()*
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.
diff --git a/src/evalfunc.c b/src/evalfunc.c
index f44207dff..c73128028 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -3932,6 +3932,7 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
char_u nbuf[NUMBUFLEN];
int typed = FALSE;
int execute = FALSE;
+ int context = FALSE;
int dangerous = FALSE;
int lowlevel = FALSE;
char_u *keys_esc;
@@ -3961,6 +3962,7 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
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;
}
@@ -4007,11 +4009,19 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
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;
@@ -4025,6 +4035,9 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
}
msg_scroll |= save_msg_scroll;
+
+ if (context)
+ current_sctx = save_sctx;
}
}
}
diff --git a/src/getchar.c b/src/getchar.c
index ec9cfae18..ff7195231 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3797,7 +3797,7 @@ getcmdkeycmd(
}
}
else
- ga_append(&line_ga, (char)c1);
+ ga_append(&line_ga, c1);
cmod = 0;
}
@@ -3815,7 +3815,7 @@ do_cmdkey_command(int key UNUSED, int flags)
{
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)
{
@@ -3827,7 +3827,7 @@ do_cmdkey_command(int key UNUSED, int flags)
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
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index 2e9c3e8cd..2d878d27b 100644
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -4,6 +4,7 @@ source shared.vim
source check.vim
source screendump.vim
source term_util.vim
+source vim9.vim
func Test_abbreviation()
" abbreviation with 0x80 should work
@@ -1397,6 +1398,19 @@ func Test_map_cmdkey_redo()
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
diff --git a/src/version.c b/src/version.c
index 2e8e9f3cc..ec96b869a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4107,
+/**/
4106,
/**/
4105,