aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-04-10 07:33:26 +0800
committerGitHub <noreply@github.com>2023-04-10 07:33:26 +0800
commitd52cc668c736ef6ca7ee3655a7eb7fe6475afadc (patch)
tree4dcad35062230be2b9095bc13a11d4d60157622a
parent71225228fc2700a18c56c57f9dc14494cef83149 (diff)
downloadrneovim-d52cc668c736ef6ca7ee3655a7eb7fe6475afadc.tar.gz
rneovim-d52cc668c736ef6ca7ee3655a7eb7fe6475afadc.tar.bz2
rneovim-d52cc668c736ef6ca7ee3655a7eb7fe6475afadc.zip
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>
-rw-r--r--src/nvim/autocmd.c6
-rw-r--r--src/nvim/autocmd.h1
-rw-r--r--test/functional/legacy/prompt_buffer_spec.lua6
-rw-r--r--test/old/testdir/test_prompt_buffer.vim11
4 files changed, 24 insertions, 0 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c
index f1ce919942..726344a42b 100644
--- 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
index 791b589167..6dbd18ba7c 100644
--- 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
index 6c72cde855..5c3f8a6f8c 100644
--- 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
index 43d8bb4789..2cc3f19b59 100644
--- 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