]> granicus.if.org Git - vim/commitdiff
patch 8.2.4166: undo synced when switching buffer in another window v8.2.4166
authorBram Moolenaar <Bram@vim.org>
Thu, 20 Jan 2022 21:00:54 +0000 (21:00 +0000)
committerBram Moolenaar <Bram@vim.org>
Thu, 20 Jan 2022 21:00:54 +0000 (21:00 +0000)
Problem:    Undo synced when switching buffer in another window.
Solution:   Do not sync undo when not needed. (closes #9575)

src/buffer.c
src/testdir/test_timers.vim
src/version.c

index 18aa2a09e78eeb19b9cbdde28993fb8e9e76556c..d8d0f3cb5f5d58f838f84d55d5e3d7c5331d67d3 100644 (file)
@@ -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
index 790b7b0d059d9aa6279633ad82391d820f857065..84fe05e557cd43ce41467acb510f5ee5bdeba9f0 100644 (file)
@@ -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
index 350b7e10b00284ba65435f1a2713b3f5de1e9a64..eaeb0a1c3701e239b338fc13b2e260beb8a9394a 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4166,
 /**/
     4165,
 /**/