summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-27 14:10:08 +0100
committerBram Moolenaar <Bram@vim.org>2023-05-27 14:10:08 +0100
commita40c0bcc83c32da02869f59b10538d6327df61c5 (patch)
tree324d7b8cf77e91910d71ae804b335a12dd0400ae
parenta1d5f9f33c68d06475406d6f44d307d5e01adc01 (diff)
patch 9.0.1582: :stopinsert may not work in a popup close handlerv9.0.1582
Problem: :stopinsert may not work in a popup close handler. (Ben Jackson) Solution: Restore stop_insert_mode when appropriate. (closes #12452, closes #12434)
-rw-r--r--src/autocmd.c4
-rw-r--r--src/testdir/test_quickfix.vim23
-rw-r--r--src/version.c2
3 files changed, 28 insertions, 1 deletions
diff --git a/src/autocmd.c b/src/autocmd.c
index c93d4bd754..862ddf7ccc 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -1657,11 +1657,13 @@ aucmd_restbuf(
}
win_found:
#ifdef FEAT_JOB_CHANNEL
+ ;
+ int save_stop_insert_mode = stop_insert_mode;
// 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;
+ stop_insert_mode = save_stop_insert_mode;
#endif
// Remove the window and frame from the tree of frames.
(void)winframe_remove(curwin, &dummy, NULL);
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index bc180fc04c..79c169273d 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -6404,5 +6404,28 @@ func Test_setqflist_cb_arg()
call setqflist([], 'f')
endfunc
+" Test that setqflist() should not prevent :stopinsert from working
+func Test_setqflist_stopinsert()
+ new
+ call setqflist([], 'f')
+ copen
+ cclose
+ func StopInsert()
+ stopinsert
+ call setqflist([{'text': 'foo'}])
+ return ''
+ endfunc
+
+ call setline(1, 'abc')
+ call cursor(1, 1)
+ call feedkeys("i\<C-R>=StopInsert()\<CR>$", 'tnix')
+ call assert_equal('foo', getqflist()[0].text)
+ call assert_equal([0, 1, 3, 0, v:maxcol], getcurpos())
+ call assert_equal(['abc'], getline(1, '$'))
+
+ delfunc StopInsert
+ call setqflist([], 'f')
+ bwipe!
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 330914da78..7138fee6f1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1582,
+/**/
1581,
/**/
1580,