neovim

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

commit d52cc668c736ef6ca7ee3655a7eb7fe6475afadc
parent 71225228fc2700a18c56c57f9dc14494cef83149
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Mon, 10 Apr 2023 07:33:26 +0800

vim-patch:9.0.1443: ending Insert mode when accessing a hidden prompt buffer (#22984)

Problem:    Ending Insert mode when accessing a hidden prompt buffer.
Solution:   Don't stop Insert mode when it was active before. (closes vim/vim#12237)

https://github.com/vim/vim/commit/05a627c3d4e42a18f76c14828d68ee4747118211

Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat:
Msrc/nvim/autocmd.c | 6++++++
Msrc/nvim/autocmd.h | 1+
Mtest/functional/legacy/prompt_buffer_spec.lua | 6++++++
Mtest/old/testdir/test_prompt_buffer.vim | 11+++++++++++
4 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c @@ -1421,6 +1421,8 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) aco->save_curwin_handle = curwin->handle; aco->save_curbuf = curbuf; aco->save_prevwin_handle = prevwin == NULL ? 0 : prevwin->handle; + aco->save_State = State; + if (win != NULL) { // There is a window for "buf" in the current tab page, make it the // curwin. This is preferred, it has the least side effects (esp. if @@ -1497,6 +1499,10 @@ void aucmd_restbuf(aco_save_T *aco) win_found: // May need to stop Insert mode if we were in a prompt buffer. leaving_window(curwin); + // Do not stop Insert mode when already in Insert mode before. + if (aco->save_State & MODE_INSERT) { + stop_insert_mode = false; + } // Remove the window. win_remove(curwin, NULL); pmap_del(handle_T)(&window_handles, curwin->handle); diff --git a/src/nvim/autocmd.h b/src/nvim/autocmd.h @@ -32,6 +32,7 @@ typedef struct { bufref_T new_curbuf; ///< new curbuf char *globaldir; ///< saved value of globaldir bool save_VIsual_active; ///< saved VIsual_active + int save_State; ///< saved State } aco_save_T; typedef struct AutoCmd_S AutoCmd; diff --git a/test/functional/legacy/prompt_buffer_spec.lua b/test/functional/legacy/prompt_buffer_spec.lua @@ -247,6 +247,7 @@ describe('prompt buffer', function() func DoAppend() call appendbufline('prompt', '$', 'Test') + return '' endfunc ]]) feed('asomething<CR>') @@ -254,7 +255,12 @@ describe('prompt buffer', function() neq(prev_win, meths.get_current_win()) feed('exit<CR>') eq(prev_win, meths.get_current_win()) + eq({ mode = 'n', blocking = false }, meths.get_mode()) command('call DoAppend()') eq({ mode = 'n', blocking = false }, meths.get_mode()) + feed('i') + eq({ mode = 'i', blocking = false }, meths.get_mode()) + command('call DoAppend()') + eq({ mode = 'i', blocking = false }, meths.get_mode()) end) end) diff --git a/test/old/testdir/test_prompt_buffer.vim b/test/old/testdir/test_prompt_buffer.vim @@ -271,6 +271,7 @@ func Test_prompt_appending_while_hidden() func DoAppend() call appendbufline('prompt', '$', 'Test') + return '' endfunc END call writefile(script, 'XpromptBuffer', 'D') @@ -283,11 +284,21 @@ func Test_prompt_appending_while_hidden() call term_sendkeys(buf, "exit\<CR>") call TermWait(buf) + call assert_notmatch('-- INSERT --', term_getline(buf, 10)) call term_sendkeys(buf, ":call DoAppend()\<CR>") call TermWait(buf) call assert_notmatch('-- INSERT --', term_getline(buf, 10)) + call term_sendkeys(buf, "i") + call TermWait(buf) + call assert_match('-- INSERT --', term_getline(buf, 10)) + + call term_sendkeys(buf, "\<C-R>=DoAppend()\<CR>") + call TermWait(buf) + call assert_match('-- INSERT --', term_getline(buf, 10)) + + call term_sendkeys(buf, "\<Esc>") call StopVimInTerminal(buf) endfunc