From e615db06046312e74886fa1ef98feb5a9db2a7c3 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 20 Jan 2022 21:00:54 +0000 Subject: patch 8.2.4166: undo synced when switching buffer in another window Problem: Undo synced when switching buffer in another window. Solution: Do not sync undo when not needed. (closes #9575) --- src/buffer.c | 6 +++++- src/testdir/test_timers.vim | 23 +++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) (limited to 'src') 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("\bbbb\") }) + 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 @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4166, /**/ 4165, /**/ -- cgit v1.2.3