]> granicus.if.org Git - vim/commitdiff
patch 8.2.1983: ml_get error when using <Cmd> to open a terminal v8.2.1983
authorBram Moolenaar <Bram@vim.org>
Sat, 14 Nov 2020 13:22:28 +0000 (14:22 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 14 Nov 2020 13:22:28 +0000 (14:22 +0100)
Problem:    ml_get error when using <Cmd> to open a terminal.
Solution:   If the window changed reset the incsearch state. (closes #7289)

src/ex_getln.c
src/testdir/dumps/Test_terminal_from_cmd.dump [new file with mode: 0644]
src/testdir/test_terminal.vim
src/version.c

index a00d6deb32abc259a6bc66382bc501cd7bb33007..80a920486926c17b0e624a2b5a71c55b3bbf2216 100644 (file)
@@ -142,6 +142,7 @@ restore_viewstate(viewstate_T *vs)
 typedef struct {
     pos_T      search_start;   // where 'incsearch' starts searching
     pos_T      save_cursor;
+    int                winid;          // window where this state is valid
     viewstate_T        init_viewstate;
     viewstate_T        old_viewstate;
     pos_T      match_start;
@@ -154,6 +155,7 @@ typedef struct {
     static void
 init_incsearch_state(incsearch_state_T *is_state)
 {
+    is_state->winid = curwin->w_id;
     is_state->match_start = curwin->w_cursor;
     is_state->did_incsearch = FALSE;
     is_state->incsearch_postponed = FALSE;
@@ -1703,13 +1705,13 @@ getcmdline_int(
        // Trigger SafeState if nothing is pending.
        may_trigger_safestate(xpc.xp_numfiles <= 0);
 
-       cursorcmd();            // set the cursor on the right spot
-
        // Get a character.  Ignore K_IGNORE and K_NOP, they should not do
        // anything, such as stop completion.
        do
+       {
+           cursorcmd();                // set the cursor on the right spot
            c = safe_vgetc();
-       while (c == K_IGNORE || c == K_NOP);
+       while (c == K_IGNORE || c == K_NOP);
 
        if (c == K_COMMAND
                   && do_cmdline(NULL, getcmdkeycmd, NULL, DOCMD_NOWAIT) == OK)
@@ -2327,6 +2329,11 @@ cmdline_not_changed:
 #endif
 
 cmdline_changed:
+#ifdef FEAT_SEARCH_EXTRA
+       // If the window changed incremental search state is not valid.
+       if (is_state.winid != curwin->w_id)
+           init_incsearch_state(&is_state);
+#endif
        // Trigger CmdlineChanged autocommands.
        trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
 
diff --git a/src/testdir/dumps/Test_terminal_from_cmd.dump b/src/testdir/dumps/Test_terminal_from_cmd.dump
new file mode 100644 (file)
index 0000000..5eea73f
--- /dev/null
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+@75
+@75
+@75
+@75
+@75
+@75
+@75
+|!+2#ffffff16#00e0003|/|b|i|n|/|s|h| |[|f|i|n|i|s|h|e|d|]| @37|0|,|0|-|1| @9|A|l@1
+|a+0#0000000#ffffff0| @73
+|b| @73
+|c| @73
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1| @11|A|l@1
+|/+0&&> @73
index 16ad720f7eafd78caecdf8fc720f808b23c5dff3..137a8a6056c7081f2065360ff7b062f26fd834fc 100644 (file)
@@ -1200,7 +1200,30 @@ func Test_terminal_open_autocmd()
 
   unlet s:called
   au! repro
-endfunction
+endfunc
+
+func Test_open_term_from_cmd()
+  CheckUnix
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+      call setline(1, ['a', 'b', 'c'])
+      3
+      set incsearch
+      cnoremap <F3> <Cmd>call term_start(['/bin/sh', '-c', ':'])<CR>
+  END
+  call writefile(lines, 'Xopenterm')
+  let buf = RunVimInTerminal('-S Xopenterm', {})
+
+  " this opens a window, incsearch should not use the old cursor position
+  call term_sendkeys(buf, "/\<F3>")
+  call VerifyScreenDump(buf, 'Test_terminal_from_cmd', {})
+  call term_sendkeys(buf, "\<Esc>")
+  call term_sendkeys(buf, ":q\<CR>")
+
+  call StopVimInTerminal(buf)
+  call delete('Xopenterm')
+endfunc
 
 func Check_dump01(off)
   call assert_equal('one two three four five', trim(getline(a:off + 1)))
index db4d84793ee5ce9c31611591ef8817362e790c11..43cd9cb23beb430b7623b7ba13de153513135bd4 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1983,
 /**/
     1982,
 /**/