# HG changeset patch # User Bram Moolenaar # Date 1680470103 -7200 # Node ID 6651b86aed3b9478b1f70fdf49e0ca848ca8535a # Parent 4b6c544c41f6210eed4ff9f5e90d6f567ae619bd patch 9.0.1439: start Insert mode when accessing a hidden prompt buffer Commit: https://github.com/vim/vim/commit/cde8de034524d00aba4ff4142e658baff511e12d Author: orbital Date: Sun Apr 2 22:05:13 2023 +0100 patch 9.0.1439: start Insert mode when accessing a hidden prompt buffer Problem: Start Insert mode when accessing a hidden prompt buffer. Solution: Call leaving_window() in aucmd_restbuf(). (Thorben Tr?bst, closes #12148, closes #12147) diff --git a/src/autocmd.c b/src/autocmd.c --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1657,7 +1657,10 @@ aucmd_restbuf( } } win_found: - +#ifdef FEAT_JOB_CHANNEL + // May need to stop Insert mode if we were in a prompt buffer. + leaving_window(curwin); +#endif // Remove the window and frame from the tree of frames. (void)winframe_remove(curwin, &dummy, NULL); win_remove(curwin, NULL); diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -13,6 +13,7 @@ int win_count(void); int make_windows(int count, int vertical); void win_move_after(win_T *win1, win_T *win2); void win_equal(win_T *next_curwin, int current, int dir); +void leaving_window(win_T *win); void entering_window(win_T *win); void curwin_init(void); void close_windows(buf_T *buf, int keep_curwin); diff --git a/src/testdir/test_prompt_buffer.vim b/src/testdir/test_prompt_buffer.vim --- a/src/testdir/test_prompt_buffer.vim +++ b/src/testdir/test_prompt_buffer.vim @@ -252,4 +252,42 @@ func Test_prompt_while_writing_to_hidden call StopVimInTerminal(buf) endfunc +func Test_prompt_appending_while_hidden() + call CanTestPromptBuffer() + + let script =<< trim END + new prompt + set buftype=prompt + set bufhidden=hide + + func s:TextEntered(text) + if a:text == 'exit' + close + endif + echowin 'Entered:' a:text + endfunc + call prompt_setcallback(bufnr(), function('s:TextEntered')) + + func DoAppend() + call appendbufline('prompt', '$', 'Test') + endfunc + END + call writefile(script, 'XpromptBuffer', 'D') + + let buf = RunVimInTerminal('-S XpromptBuffer', {'rows': 10}) + call TermWait(buf) + + call term_sendkeys(buf, "asomething\") + call TermWait(buf) + + call term_sendkeys(buf, "exit\") + call TermWait(buf) + + call term_sendkeys(buf, ":call DoAppend()\") + call TermWait(buf) + call assert_notmatch('-- INSERT --', term_getline(buf, 10)) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1439, +/**/ 1438, /**/ 1437, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -2292,7 +2292,7 @@ win_equal_rec( } #ifdef FEAT_JOB_CHANNEL - static void + void leaving_window(win_T *win) { // Only matters for a prompt window.