neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 82b1a389ba98f5f8e8d6c9d7485386be272a22df
parent a5629abce29668e9781768986f7e799ba429f017
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sun, 29 Oct 2023 09:32:03 +0800

fix(terminal): avoid Insert mode in Terminal buffer (#25820)


Diffstat:
Msrc/nvim/edit.c | 7+++++++
Mtest/functional/terminal/ex_terminal_spec.lua | 14++++++++++++++
2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/src/nvim/edit.c b/src/nvim/edit.c @@ -396,6 +396,13 @@ static int insert_check(VimState *state) Insstart_orig = Insstart; } + if (curbuf->terminal) { + // Exit Insert mode and go to Terminal mode. + stop_insert_mode = true; + restart_edit = 'I'; + stuffcharReadbuff(K_NOP); + } + if (stop_insert_mode && !ins_compl_active()) { // ":stopinsert" used s->count = 0; diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua @@ -125,6 +125,20 @@ describe(':terminal', function() feed('a') eq({ blocking=false, mode='t' }, nvim('get_mode')) end) + + it('switching to terminal buffer in Insert mode goes to Terminal mode #7164', function() + command('terminal') + command('vnew') + feed('i') + command('let g:events = []') + command('autocmd InsertLeave * let g:events += ["InsertLeave"]') + command('autocmd TermEnter * let g:events += ["TermEnter"]') + command('inoremap <F2> <Cmd>wincmd p<CR>') + eq({ blocking=false, mode='i' }, nvim('get_mode')) + feed('<F2>') + eq({ blocking=false, mode='t' }, nvim('get_mode')) + eq({'InsertLeave', 'TermEnter'}, eval('g:events')) + end) end) describe(':terminal (with fake shell)', function()