summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-01-02 13:08:01 +0000
committerBram Moolenaar <Bram@vim.org>2023-01-02 13:08:01 +0000
commit39c82ea6563f8467b8d36f0ecb8ba93a0685c280 (patch)
treebbcfa5e5f5198af24b605713942daf0ce49566ba
parent7bdcba08bb5e4c39093cdedee187177d705c7cb9 (diff)
patch 9.0.1130: unexpected output when autoloading a scriptv9.0.1130
Problem: Unexpected output when autoloading a script for an interactive operation. Solution: Reset "KeyTyped" while loading a script and when handling a nested function. (closes #11773)
-rw-r--r--src/scriptfile.c11
-rw-r--r--src/testdir/dumps/Test_keytyped_in_nested_func.dump6
-rw-r--r--src/testdir/test_vim9_func.vim42
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c7
5 files changed, 65 insertions, 3 deletions
diff --git a/src/scriptfile.c b/src/scriptfile.c
index d348631998..4b1fa6b148 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -1334,10 +1334,10 @@ errret:
* When "ret_sid" is not NULL and we loaded the script before, don't load it
* again.
*
- * The 'eap' argument is used when sourcing lines from a buffer instead of a
+ * The "eap" argument is used when sourcing lines from a buffer instead of a
* file.
*
- * If 'clearvars' is TRUE, then for scripts which are loaded more than
+ * If "clearvars" is TRUE, then for scripts which are loaded more than
* once, clear all the functions and variables previously defined in that
* script.
*
@@ -1538,6 +1538,7 @@ do_source_ext(
current_sctx.sc_version = SCRIPT_VERSION_VIM9;
else
current_sctx.sc_version = 1; // default script version
+ current_sctx.sc_lnum = 0;
#ifdef FEAT_EVAL
# ifdef FEAT_PROFILE
@@ -1549,7 +1550,10 @@ do_source_ext(
// Also starts profiling timer for nested script.
save_funccal(&funccalp_entry);
- current_sctx.sc_lnum = 0;
+ // Reset "KeyTyped" to avoid some commands thinking they are invoked
+ // interactively. E.g. defining a function would output indent.
+ int save_KeyTyped = KeyTyped;
+ KeyTyped = FALSE;
// Check if this script was sourced before to find its SID.
// Always use a new sequence number.
@@ -1765,6 +1769,7 @@ almosttheend:
# endif
#endif
current_sctx = save_current_sctx;
+ KeyTyped = save_KeyTyped;
if (cookie.fp != NULL)
fclose(cookie.fp);
diff --git a/src/testdir/dumps/Test_keytyped_in_nested_func.dump b/src/testdir/dumps/Test_keytyped_in_nested_func.dump
new file mode 100644
index 0000000000..46bebea4d2
--- /dev/null
+++ b/src/testdir/dumps/Test_keytyped_in_nested_func.dump
@@ -0,0 +1,6 @@
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|"> @72
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 3840d1144f..be07aec04a 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -4413,6 +4413,48 @@ def Test_invalid_redir()
delfunc g:Ttwo
enddef
+func Test_keytyped_in_nested_function()
+ CheckRunVimInTerminal
+
+ call Run_Test_keytyped_in_nested_function()
+endfunc
+
+def Run_Test_keytyped_in_nested_function()
+ var lines =<< trim END
+ vim9script
+ autocmd CmdlineEnter * sample#Init()
+
+ exe 'set rtp=' .. getcwd() .. '/Xrtpdir'
+ END
+ writefile(lines, 'Xkeytyped', 'D')
+
+ var dir = 'Xrtpdir/autoload'
+ mkdir(dir, 'pR')
+
+ lines =<< trim END
+ vim9script
+ export def Init(): void
+ cnoremap <expr>" <SID>Quote('"')
+ enddef
+ def Quote(str: string): string
+ def InPair(): number
+ return 0
+ enddef
+ return str
+ enddef
+ END
+ writefile(lines, dir .. '/sample.vim')
+
+ var buf = g:RunVimInTerminal('-S Xkeytyped', {rows: 6})
+
+ term_sendkeys(buf, ':"')
+ g:VerifyScreenDump(buf, 'Test_keytyped_in_nested_func', {})
+
+ # clean up
+ term_sendkeys(buf, "\<Esc>")
+ g:StopVimInTerminal(buf)
+enddef
+
" The following messes up syntax highlight, keep near the end.
if has('python3')
def Test_python3_command()
diff --git a/src/version.c b/src/version.c
index cb4889dc79..212d08dbf1 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 */
/**/
+ 1130,
+/**/
1129,
/**/
1128,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 0e6c32cbf7..c5b41da3a0 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -987,7 +987,14 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, garray_T *lines_to_free)
goto theend;
}
+ // Make sure "KeyTyped" is not set, it may cause indent to be written.
+ int save_KeyTyped = KeyTyped;
+ KeyTyped = FALSE;
+
ufunc = define_function(eap, lambda_name, lines_to_free, FALSE);
+
+ KeyTyped = save_KeyTyped;
+
if (ufunc == NULL)
{
r = eap->skip ? OK : FAIL;