0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.1.0040: issue with prompt buffer and hidden buffer

Problem:  Modifying a hidden buffer still interferes with prompt buffer
          mode changes.
Solution: Save and restore b_prompt_insert.
          (zeertzjq)

closes: #13875

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
Modifying hidden buffer still interferes with prompt buffer mode changes
This commit is contained in:
zeertzjq
2024-01-17 21:22:59 +01:00
committed by Christian Brabandt
parent 6a8d2e1634
commit f267847017
4 changed files with 31 additions and 9 deletions

View File

@@ -1565,9 +1565,12 @@ aucmd_prepbuf(
} }
aco->save_curwin_id = curwin->w_id; aco->save_curwin_id = curwin->w_id;
aco->save_curbuf = curbuf;
aco->save_prevwin_id = prevwin == NULL ? 0 : prevwin->w_id; aco->save_prevwin_id = prevwin == NULL ? 0 : prevwin->w_id;
aco->save_State = State; aco->save_State = State;
#ifdef FEAT_JOB_CHANNEL
if (bt_prompt(curbuf))
aco->save_prompt_insert = curbuf->b_prompt_insert;
#endif
if (win != NULL) if (win != NULL)
{ {
@@ -1692,6 +1695,8 @@ win_found:
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
// May need to restore insert mode for a prompt buffer. // May need to restore insert mode for a prompt buffer.
entering_window(curwin); entering_window(curwin);
if (bt_prompt(curbuf))
curbuf->b_prompt_insert = aco->save_prompt_insert;
#endif #endif
prevwin = win_find_by_id(aco->save_prevwin_id); prevwin = win_find_by_id(aco->save_prevwin_id);
#ifdef FEAT_EVAL #ifdef FEAT_EVAL

View File

@@ -4358,7 +4358,6 @@ typedef int vimmenu_T;
*/ */
typedef struct typedef struct
{ {
buf_T *save_curbuf; // saved curbuf
int use_aucmd_win_idx; // index in aucmd_win[] if >= 0 int use_aucmd_win_idx; // index in aucmd_win[] if >= 0
int save_curwin_id; // ID of saved curwin int save_curwin_id; // ID of saved curwin
int new_curwin_id; // ID of new curwin int new_curwin_id; // ID of new curwin
@@ -4367,6 +4366,9 @@ typedef struct
char_u *globaldir; // saved value of globaldir char_u *globaldir; // saved value of globaldir
int save_VIsual_active; // saved VIsual_active int save_VIsual_active; // saved VIsual_active
int save_State; // saved State int save_State; // saved State
#ifdef FEAT_JOB_CHANNEL
int save_prompt_insert; // saved b_prompt_insert
#endif
} aco_save_T; } aco_save_T;
/* /*

View File

@@ -297,9 +297,10 @@ func Test_prompt_appending_while_hidden()
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc endfunc
" Modifying a hidden buffer while closing a prompt buffer should not prevent " Modifying a hidden buffer while leaving a prompt buffer should not prevent
" stopping of Insert mode. " stopping of Insert mode, and returning to the prompt buffer later should
func Test_prompt_close_modify_hidden() " restore Insert mode.
func Test_prompt_leave_modify_hidden()
call CanTestPromptBuffer() call CanTestPromptBuffer()
let script =<< trim END let script =<< trim END
@@ -309,22 +310,34 @@ func Test_prompt_close_modify_hidden()
new prompt new prompt
set buftype=prompt set buftype=prompt
inoremap <buffer> w <Cmd>wincmd w<CR>
inoremap <buffer> q <Cmd>bwipe!<CR> inoremap <buffer> q <Cmd>bwipe!<CR>
autocmd BufWinLeave prompt call setbufline('hidden', 1, 'Test') autocmd BufLeave prompt call appendbufline('hidden', '$', 'Leave')
autocmd BufEnter prompt call appendbufline('hidden', '$', 'Enter')
autocmd BufWinLeave prompt call appendbufline('hidden', '$', 'Close')
END END
call writefile(script, 'XpromptCloseModifyHidden', 'D') call writefile(script, 'XpromptLeaveModifyHidden', 'D')
let buf = RunVimInTerminal('-S XpromptCloseModifyHidden', {'rows': 10}) let buf = RunVimInTerminal('-S XpromptLeaveModifyHidden', {'rows': 10})
call TermWait(buf) call TermWait(buf)
call term_sendkeys(buf, "a") call term_sendkeys(buf, "a")
call WaitForAssert({-> assert_match('-- INSERT --', term_getline(buf, 10))}) call WaitForAssert({-> assert_match('-- INSERT --', term_getline(buf, 10))})
call term_sendkeys(buf, "w")
call WaitForAssert({-> assert_notmatch('-- INSERT --', term_getline(buf, 10))})
call term_sendkeys(buf, "\<C-W>w")
call WaitForAssert({-> assert_match('-- INSERT --', term_getline(buf, 10))})
call term_sendkeys(buf, "q") call term_sendkeys(buf, "q")
call WaitForAssert({-> assert_notmatch('-- INSERT --', term_getline(buf, 10))}) call WaitForAssert({-> assert_notmatch('-- INSERT --', term_getline(buf, 10))})
call term_sendkeys(buf, ":bwipe!\<CR>") call term_sendkeys(buf, ":bwipe!\<CR>")
call WaitForAssert({-> assert_equal('Test', term_getline(buf, 1))}) call WaitForAssert({-> assert_equal('Leave', term_getline(buf, 2))})
call WaitForAssert({-> assert_equal('Enter', term_getline(buf, 3))})
call WaitForAssert({-> assert_equal('Leave', term_getline(buf, 4))})
call WaitForAssert({-> assert_equal('Close', term_getline(buf, 5))})
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc endfunc

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
40,
/**/ /**/
39, 39,
/**/ /**/