summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-20 21:00:54 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-20 21:00:54 +0000
commite615db06046312e74886fa1ef98feb5a9db2a7c3 (patch)
tree8777ab7d7ac5b1ad11f2b59d42f6b50f2b12fb66 /src
parent05386ca1d4823e5c98c24b8cd038af49aee62577 (diff)
patch 8.2.4166: undo synced when switching buffer in another windowv8.2.4166
Problem: Undo synced when switching buffer in another window. Solution: Do not sync undo when not needed. (closes #9575)
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c6
-rw-r--r--src/testdir/test_timers.vim23
-rw-r--r--src/version.c2
3 files changed, 30 insertions, 1 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 18aa2a09e7..d8d0f3cb5f 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1744,7 +1744,11 @@ set_curbuf(buf_T *buf, int action)
{
win_T *previouswin = curwin;
- if (prevbuf == curbuf)
+ // Do not sync when in Insert mode and the buffer is open in
+ // another window, might be a timer doing something in another
+ // window.
+ if (prevbuf == curbuf
+ && ((State & INSERT) == 0 || curbuf->b_nwindows <= 1))
u_sync(FALSE);
close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, prevbuf,
unload ? action : (action == DOBUF_GOTO
diff --git a/src/testdir/test_timers.vim b/src/testdir/test_timers.vim
index 790b7b0d05..84fe05e557 100644
--- a/src/testdir/test_timers.vim
+++ b/src/testdir/test_timers.vim
@@ -484,5 +484,28 @@ func Test_timer_outputting_message()
call delete('XTest_timermessage')
endfunc
+func Test_timer_using_win_execute_undo_sync()
+ let bufnr1 = bufnr()
+ new
+ let g:bufnr2 = bufnr()
+ let g:winid = win_getid()
+ exe "buffer " .. bufnr1
+ wincmd w
+ call setline(1, ['test'])
+ autocmd InsertEnter * call timer_start(100, { -> win_execute(g:winid, 'buffer ' .. g:bufnr2) })
+ call timer_start(200, { -> feedkeys("\<CR>bbbb\<Esc>") })
+ call feedkeys("Oaaaa", 'x!t')
+ " will hang here until the second timer fires
+ call assert_equal(['aaaa', 'bbbb', 'test'], getline(1, '$'))
+ undo
+ call assert_equal(['test'], getline(1, '$'))
+
+ bwipe!
+ bwipe!
+ unlet g:winid
+ unlet g:bufnr2
+ au! InsertEnter
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 350b7e10b0..eaeb0a1c37 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4166,
+/**/
4165,
/**/
4164,