]> granicus.if.org Git - vim/commitdiff
patch 9.0.1130: unexpected output when autoloading a script v9.0.1130
authorBram Moolenaar <Bram@vim.org>
Mon, 2 Jan 2023 13:08:01 +0000 (13:08 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 2 Jan 2023 13:08:01 +0000 (13:08 +0000)
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)

src/scriptfile.c
src/testdir/dumps/Test_keytyped_in_nested_func.dump [new file with mode: 0644]
src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index d348631998230c5a55d2c1e8e0452d91dfa96f7a..4b1fa6b14818f6ceda0176087086bf0155b4b873 100644 (file)
@@ -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 (file)
index 0000000..46bebea
--- /dev/null
@@ -0,0 +1,6 @@
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|"> @72
index 3840d1144f93cc80208496d1b689c34611db0f37..be07aec04a4b6279b9a113692366306b10e04714 100644 (file)
@@ -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()
index cb4889dc79ae49feb3c458cf6b9f35507fd3c3ac..212d08dbf15d932311046e6c09635f2e6e28aa32 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1130,
 /**/
     1129,
 /**/
index 0e6c32cbf7dd5feb225d337ee5855ea166f89347..c5b41da3a01a161943a6075fde51f6b4d759ce73 100644 (file)
@@ -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;