diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-03 08:36:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-03 08:36:14 +0800 |
commit | 10baf89712724b4b95f7c641f2012f051737003c (patch) | |
tree | eec22a0282d1c291ea54d3d0d4a7dd1feb2b91c9 | |
parent | 53f36806f1b5107c0570ffbf57180a8e08f45b2e (diff) | |
download | rneovim-10baf89712724b4b95f7c641f2012f051737003c.tar.gz rneovim-10baf89712724b4b95f7c641f2012f051737003c.tar.bz2 rneovim-10baf89712724b4b95f7c641f2012f051737003c.zip |
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)
https://github.com/vim/vim/commit/cde8de034524d00aba4ff4142e658baff511e12d
Cherry-pick test_prompt_buffer.vim changes from patch 9.0.0631.
Co-authored-by: orbital <orbital@holgerines.de>
-rw-r--r-- | src/nvim/autocmd.c | 4 | ||||
-rw-r--r-- | src/nvim/window.c | 2 | ||||
-rw-r--r-- | test/functional/legacy/prompt_buffer_spec.lua | 45 | ||||
-rw-r--r-- | test/old/testdir/test_prompt_buffer.vim | 41 |
4 files changed, 84 insertions, 8 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 578542adfe..9b4cb336bc 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -1495,7 +1495,9 @@ void aucmd_restbuf(aco_save_T *aco) } } 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); pmap_del(handle_T)(&window_handles, curwin->handle); if (curwin->w_grid_alloc.chars != NULL) { diff --git a/src/nvim/window.c b/src/nvim/window.c index 762ad13ba3..48663c5a20 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -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 { // Only matters for a prompt window. diff --git a/test/functional/legacy/prompt_buffer_spec.lua b/test/functional/legacy/prompt_buffer_spec.lua index 602593d632..6c72cde855 100644 --- a/test/functional/legacy/prompt_buffer_spec.lua +++ b/test/functional/legacy/prompt_buffer_spec.lua @@ -3,9 +3,11 @@ local Screen = require('test.functional.ui.screen') local feed = helpers.feed local source = helpers.source local clear = helpers.clear +local command = helpers.command local poke_eventloop = helpers.poke_eventloop local meths = helpers.meths local eq = helpers.eq +local neq = helpers.neq describe('prompt buffer', function() local screen @@ -14,9 +16,11 @@ describe('prompt buffer', function() clear() screen = Screen.new(25, 10) screen:attach() - source([[ - set laststatus=0 nohidden + command('set laststatus=0 nohidden') + end) + local function source_script() + source([[ func TextEntered(text) if a:text == "exit" " Reset &modified to allow the buffer to be closed. @@ -63,7 +67,7 @@ describe('prompt buffer', function() ~ | -- INSERT -- | ]]) - end) + end after_each(function() screen:detach() @@ -71,6 +75,7 @@ describe('prompt buffer', function() -- oldtest: Test_prompt_basic() it('works', function() + source_script() feed("hello\n") screen:expect([[ cmd: hello | @@ -101,6 +106,7 @@ describe('prompt buffer', function() -- oldtest: Test_prompt_editing() it('editing', function() + source_script() feed("hello<BS><BS>") screen:expect([[ cmd: hel^ | @@ -170,6 +176,7 @@ describe('prompt buffer', function() -- oldtest: Test_prompt_switch_windows() it('switch windows', function() + source_script() feed("<C-O>:call SwitchWindows()<CR>") screen:expect{grid=[[ cmd: | @@ -213,11 +220,41 @@ describe('prompt buffer', function() -- oldtest: Test_prompt_while_writing_to_hidden_buffer() it('keeps insert mode after aucmd_restbuf in callback', function() + source_script() source [[ let s:buf = nvim_create_buf(1, 1) call timer_start(0, {-> nvim_buf_set_lines(s:buf, -1, -1, 0, ['walrus'])}) ]] 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) diff --git a/test/old/testdir/test_prompt_buffer.vim b/test/old/testdir/test_prompt_buffer.vim index b1288b4892..43d8bb4789 100644 --- a/test/old/testdir/test_prompt_buffer.vim +++ b/test/old/testdir/test_prompt_buffer.vim @@ -238,7 +238,7 @@ func Test_prompt_while_writing_to_hidden_buffer() \ done'], #{out_io: 'buffer', out_name: ''}) startinsert END - eval script->writefile(scriptName) + eval script->writefile(scriptName, 'D') let buf = RunVimInTerminal('-S ' .. scriptName, {}) 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 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 " vim: shiftwidth=2 sts=2 expandtab |