aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2021-11-07 21:28:11 +0000
committerSean Dewar <seandewar@users.noreply.github.com>2021-12-07 11:34:27 +0000
commit38cd91de5f0f89daccdcbac16508af830d8001d7 (patch)
tree6cd45b16c31cca00279d5459b61081e082b83bc7
parent1fffccc5d62e4fa01c1ce52405da359723defb1c (diff)
downloadrneovim-38cd91de5f0f89daccdcbac16508af830d8001d7.tar.gz
rneovim-38cd91de5f0f89daccdcbac16508af830d8001d7.tar.bz2
rneovim-38cd91de5f0f89daccdcbac16508af830d8001d7.zip
vim-patch:8.2.1781: writing to prompt buffer interferes with insert mode
Problem: Writing to prompt buffer interferes with insert mode. Solution: Use win_enter() instead of just setting "curwin". (Ben Jackson, closes vim/vim#7035) https://github.com/vim/vim/commit/4537bcc88956f86267c25edf8008e0dbde598652 Vim test will be skipped, so add a Lua test. The problem boils down to the use of aucmd_restbuf in a callback, so just test that (via nvim_buf_set_lines).
-rw-r--r--src/nvim/autocmd.c2
-rw-r--r--src/nvim/testdir/test_prompt_buffer.vim34
-rw-r--r--test/functional/legacy/prompt_buffer_spec.lua14
3 files changed, 48 insertions, 2 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c
index 490fe5a0ac..e274d00a77 100644
--- a/src/nvim/autocmd.c
+++ b/src/nvim/autocmd.c
@@ -1208,7 +1208,7 @@ win_found:
win_T *const save_curwin = win_find_by_handle(aco->save_curwin_handle);
if (save_curwin != NULL) {
- curwin = save_curwin;
+ win_enter(save_curwin, true);
} else {
// Hmm, original window disappeared. Just use the first one.
curwin = firstwin;
diff --git a/src/nvim/testdir/test_prompt_buffer.vim b/src/nvim/testdir/test_prompt_buffer.vim
index fde97a66a8..72b037dd37 100644
--- a/src/nvim/testdir/test_prompt_buffer.vim
+++ b/src/nvim/testdir/test_prompt_buffer.vim
@@ -186,4 +186,38 @@ func Test_prompt_buffer_getbufinfo()
%bwipe!
endfunc
+function! Test_prompt_while_writing_to_hidden_buffer()
+ throw 'skipped: TODO'
+ call CanTestPromptBuffer()
+ CheckUnix
+
+ " Make a job continuously write to a hidden buffer, check that the prompt
+ " buffer is not affected.
+ let scriptName = 'XpromptscriptHiddenBuf'
+ let script =<< trim END
+ set buftype=prompt
+ call prompt_setprompt( bufnr(), 'cmd:' )
+ let job = job_start(['/bin/sh', '-c',
+ \ 'while true;
+ \ do echo line;
+ \ sleep 0.1;
+ \ done'], #{out_io: 'buffer', out_name: ''})
+ startinsert
+ END
+ eval script->writefile(scriptName)
+
+ let buf = RunVimInTerminal('-S ' .. scriptName, {})
+ call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))})
+
+ call term_sendkeys(buf, 'test')
+ call WaitForAssert({-> assert_equal('cmd:test', term_getline(buf, 1))})
+ call term_sendkeys(buf, 'test')
+ call WaitForAssert({-> assert_equal('cmd:testtest', term_getline(buf, 1))})
+ call term_sendkeys(buf, 'test')
+ call WaitForAssert({-> assert_equal('cmd:testtesttest', term_getline(buf, 1))})
+
+ call StopVimInTerminal(buf)
+ call delete(scriptName)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/test/functional/legacy/prompt_buffer_spec.lua b/test/functional/legacy/prompt_buffer_spec.lua
index 513be807be..a987eaf12c 100644
--- a/test/functional/legacy/prompt_buffer_spec.lua
+++ b/test/functional/legacy/prompt_buffer_spec.lua
@@ -1,9 +1,12 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local feed= helpers.feed
+local feed = helpers.feed
local source = helpers.source
local clear = helpers.clear
local feed_command = helpers.feed_command
+local poke_eventloop = helpers.poke_eventloop
+local meths = helpers.meths
+local eq = helpers.eq
describe('prompt buffer', function()
local screen
@@ -150,4 +153,13 @@ describe('prompt buffer', function()
]])
end)
+ it('keeps insert mode after aucmd_restbuf in callback', function()
+ source [[
+ let s:buf = nvim_create_buf(1, 1)
+ call timer_start(0, {-> nvim_buf_set_lines(s:buf, -1, -1, 0, ['walrus'])})
+ startinsert
+ ]]
+ poke_eventloop()
+ eq({ mode = "i", blocking = false }, meths.get_mode())
+ end)
end)