mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
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:
@@ -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) {
|
||||||
|
@@ -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.
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user