vim-patch:9.0.1439: start Insert mode when accessing a hidden prompt buffer (#22867)

Problem:    Start Insert mode when accessing a hidden prompt buffer.
Solution:   Call leaving_window() in aucmd_restbuf(). (Thorben Tröbst,
            closes vim/vim#12148, closes vim/vim#12147)

cde8de0345

Cherry-pick test_prompt_buffer.vim changes from patch 9.0.0631.

Co-authored-by: orbital <orbital@holgerines.de>
This commit is contained in:
zeertzjq
2023-04-03 08:36:14 +08:00
committed by GitHub
parent 53f36806f1
commit 10baf89712
4 changed files with 84 additions and 8 deletions

View File

@@ -1495,7 +1495,9 @@ void aucmd_restbuf(aco_save_T *aco)
} }
} }
win_found: win_found:
// May need to stop Insert mode if we were in a prompt buffer.
leaving_window(curwin);
// Remove the window.
win_remove(curwin, NULL); win_remove(curwin, NULL);
pmap_del(handle_T)(&window_handles, curwin->handle); pmap_del(handle_T)(&window_handles, curwin->handle);
if (curwin->w_grid_alloc.chars != NULL) { if (curwin->w_grid_alloc.chars != NULL) {

View File

@@ -2417,7 +2417,7 @@ static void win_equal_rec(win_T *next_curwin, bool current, frame_T *topfr, int
} }
} }
static void leaving_window(win_T *const win) void leaving_window(win_T *const win)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
// Only matters for a prompt window. // Only matters for a prompt window.

View File

@@ -3,9 +3,11 @@ local Screen = require('test.functional.ui.screen')
local feed = helpers.feed local feed = helpers.feed
local source = helpers.source local source = helpers.source
local clear = helpers.clear local clear = helpers.clear
local command = helpers.command
local poke_eventloop = helpers.poke_eventloop local poke_eventloop = helpers.poke_eventloop
local meths = helpers.meths local meths = helpers.meths
local eq = helpers.eq local eq = helpers.eq
local neq = helpers.neq
describe('prompt buffer', function() describe('prompt buffer', function()
local screen local screen
@@ -14,9 +16,11 @@ describe('prompt buffer', function()
clear() clear()
screen = Screen.new(25, 10) screen = Screen.new(25, 10)
screen:attach() screen:attach()
source([[ command('set laststatus=0 nohidden')
set laststatus=0 nohidden end)
local function source_script()
source([[
func TextEntered(text) func TextEntered(text)
if a:text == "exit" if a:text == "exit"
" Reset &modified to allow the buffer to be closed. " Reset &modified to allow the buffer to be closed.
@@ -63,7 +67,7 @@ describe('prompt buffer', function()
~ | ~ |
-- INSERT -- | -- INSERT -- |
]]) ]])
end) end
after_each(function() after_each(function()
screen:detach() screen:detach()
@@ -71,6 +75,7 @@ describe('prompt buffer', function()
-- oldtest: Test_prompt_basic() -- oldtest: Test_prompt_basic()
it('works', function() it('works', function()
source_script()
feed("hello\n") feed("hello\n")
screen:expect([[ screen:expect([[
cmd: hello | cmd: hello |
@@ -101,6 +106,7 @@ describe('prompt buffer', function()
-- oldtest: Test_prompt_editing() -- oldtest: Test_prompt_editing()
it('editing', function() it('editing', function()
source_script()
feed("hello<BS><BS>") feed("hello<BS><BS>")
screen:expect([[ screen:expect([[
cmd: hel^ | cmd: hel^ |
@@ -170,6 +176,7 @@ describe('prompt buffer', function()
-- oldtest: Test_prompt_switch_windows() -- oldtest: Test_prompt_switch_windows()
it('switch windows', function() it('switch windows', function()
source_script()
feed("<C-O>:call SwitchWindows()<CR>") feed("<C-O>:call SwitchWindows()<CR>")
screen:expect{grid=[[ screen:expect{grid=[[
cmd: | cmd: |
@@ -213,11 +220,41 @@ describe('prompt buffer', function()
-- oldtest: Test_prompt_while_writing_to_hidden_buffer() -- oldtest: Test_prompt_while_writing_to_hidden_buffer()
it('keeps insert mode after aucmd_restbuf in callback', function() it('keeps insert mode after aucmd_restbuf in callback', function()
source_script()
source [[ source [[
let s:buf = nvim_create_buf(1, 1) let s:buf = nvim_create_buf(1, 1)
call timer_start(0, {-> nvim_buf_set_lines(s:buf, -1, -1, 0, ['walrus'])}) call timer_start(0, {-> nvim_buf_set_lines(s:buf, -1, -1, 0, ['walrus'])})
]] ]]
poke_eventloop() poke_eventloop()
eq({ mode = "i", blocking = false }, meths.get_mode()) eq({ mode = 'i', blocking = false }, meths.get_mode())
end)
-- oldtest: Test_prompt_appending_while_hidden()
it('accessing hidden prompt buffer does not start insert mode', function()
local prev_win = meths.get_current_win()
source([[
new prompt
set buftype=prompt
set bufhidden=hide
func s:TextEntered(text)
if a:text == 'exit'
close
endif
let g:entered = a:text
endfunc
call prompt_setcallback(bufnr(), function('s:TextEntered'))
func DoAppend()
call appendbufline('prompt', '$', 'Test')
endfunc
]])
feed('asomething<CR>')
eq('something', meths.get_var('entered'))
neq(prev_win, meths.get_current_win())
feed('exit<CR>')
eq(prev_win, meths.get_current_win())
command('call DoAppend()')
eq({ mode = 'n', blocking = false }, meths.get_mode())
end) end)
end) end)

View File

@@ -238,7 +238,7 @@ func Test_prompt_while_writing_to_hidden_buffer()
\ done'], #{out_io: 'buffer', out_name: ''}) \ done'], #{out_io: 'buffer', out_name: ''})
startinsert startinsert
END END
eval script->writefile(scriptName) eval script->writefile(scriptName, 'D')
let buf = RunVimInTerminal('-S ' .. scriptName, {}) let buf = RunVimInTerminal('-S ' .. scriptName, {})
call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))}) call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))})
@@ -251,7 +251,44 @@ func Test_prompt_while_writing_to_hidden_buffer()
call WaitForAssert({-> assert_equal('cmd:testtesttest', term_getline(buf, 1))}) call WaitForAssert({-> assert_equal('cmd:testtesttest', term_getline(buf, 1))})
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
call delete(scriptName) 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\<CR>")
call TermWait(buf)
call term_sendkeys(buf, "exit\<CR>")
call TermWait(buf)
call term_sendkeys(buf, ":call DoAppend()\<CR>")
call TermWait(buf)
call assert_notmatch('-- INSERT --', term_getline(buf, 10))
call StopVimInTerminal(buf)
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab