forked from aniani/vim
patch 8.2.1983: ml_get error when using <Cmd> to open a terminal
Problem: ml_get error when using <Cmd> to open a terminal. Solution: If the window changed reset the incsearch state. (closes #7289)
This commit is contained in:
@@ -142,6 +142,7 @@ restore_viewstate(viewstate_T *vs)
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
pos_T search_start; // where 'incsearch' starts searching
|
pos_T search_start; // where 'incsearch' starts searching
|
||||||
pos_T save_cursor;
|
pos_T save_cursor;
|
||||||
|
int winid; // window where this state is valid
|
||||||
viewstate_T init_viewstate;
|
viewstate_T init_viewstate;
|
||||||
viewstate_T old_viewstate;
|
viewstate_T old_viewstate;
|
||||||
pos_T match_start;
|
pos_T match_start;
|
||||||
@@ -154,6 +155,7 @@ typedef struct {
|
|||||||
static void
|
static void
|
||||||
init_incsearch_state(incsearch_state_T *is_state)
|
init_incsearch_state(incsearch_state_T *is_state)
|
||||||
{
|
{
|
||||||
|
is_state->winid = curwin->w_id;
|
||||||
is_state->match_start = curwin->w_cursor;
|
is_state->match_start = curwin->w_cursor;
|
||||||
is_state->did_incsearch = FALSE;
|
is_state->did_incsearch = FALSE;
|
||||||
is_state->incsearch_postponed = FALSE;
|
is_state->incsearch_postponed = FALSE;
|
||||||
@@ -1703,13 +1705,13 @@ getcmdline_int(
|
|||||||
// Trigger SafeState if nothing is pending.
|
// Trigger SafeState if nothing is pending.
|
||||||
may_trigger_safestate(xpc.xp_numfiles <= 0);
|
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
|
// Get a character. Ignore K_IGNORE and K_NOP, they should not do
|
||||||
// anything, such as stop completion.
|
// anything, such as stop completion.
|
||||||
do
|
do
|
||||||
|
{
|
||||||
|
cursorcmd(); // set the cursor on the right spot
|
||||||
c = safe_vgetc();
|
c = safe_vgetc();
|
||||||
while (c == K_IGNORE || c == K_NOP);
|
} while (c == K_IGNORE || c == K_NOP);
|
||||||
|
|
||||||
if (c == K_COMMAND
|
if (c == K_COMMAND
|
||||||
&& do_cmdline(NULL, getcmdkeycmd, NULL, DOCMD_NOWAIT) == OK)
|
&& do_cmdline(NULL, getcmdkeycmd, NULL, DOCMD_NOWAIT) == OK)
|
||||||
@@ -2327,6 +2329,11 @@ cmdline_not_changed:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
cmdline_changed:
|
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 CmdlineChanged autocommands.
|
||||||
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
|
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
|
||||||
|
|
||||||
|
|||||||
20
src/testdir/dumps/Test_terminal_from_cmd.dump
Normal file
20
src/testdir/dumps/Test_terminal_from_cmd.dump
Normal file
@@ -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
|
||||||
@@ -1200,7 +1200,30 @@ func Test_terminal_open_autocmd()
|
|||||||
|
|
||||||
unlet s:called
|
unlet s:called
|
||||||
au! repro
|
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)
|
func Check_dump01(off)
|
||||||
call assert_equal('one two three four five', trim(getline(a:off + 1)))
|
call assert_equal('one two three four five', trim(getline(a:off + 1)))
|
||||||
|
|||||||
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1983,
|
||||||
/**/
|
/**/
|
||||||
1982,
|
1982,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user