Skip to content

Commit

Permalink
patch 8.2.1983: ml_get error when using <Cmd> to open a terminal
Browse files Browse the repository at this point in the history
Problem:    ml_get error when using <Cmd> to open a terminal.
Solution:   If the window changed reset the incsearch state. (closes #7289)
  • Loading branch information
brammool committed Nov 14, 2020
1 parent 2ce7790 commit f4d61bc
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 4 deletions.
13 changes: 10 additions & 3 deletions src/ex_getln.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -2327,6 +2329,11 @@ getcmdline_int(
#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);

Expand Down
20 changes: 20 additions & 0 deletions src/testdir/dumps/Test_terminal_from_cmd.dump
Original file line number Diff line number Diff line change
@@ -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
25 changes: 24 additions & 1 deletion src/testdir/test_terminal.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1983,
/**/
1982,
/**/
Expand Down

0 comments on commit f4d61bc

Please sign in to comment.