vim-patch:9.2.0938: cursorbind: cursor in the other window is not updated after undo (#41282)

Problem:  In diff mode with 'cursorbind' the cursor in the other window is
          not updated after an undo that changes which lines correspond.
Solution: Also check whether the text changed before skipping the update
          (Hirohito Higashi).

fixes:   vim/vim#20982
related: vim/vim#13219
related: vim/vim#13210
closes:  vim/vim#21004

2045a20d4b

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zeertzjq
2026-08-12 08:16:08 +08:00
committed by GitHub
parent eb5c60b8c5
commit e9dc4da86e
2 changed files with 35 additions and 1 deletions

View File

@@ -2588,12 +2588,21 @@ int pagescroll(Direction dir, int count, bool half)
void do_check_cursorbind(void)
{
static win_T *prev_curwin = NULL;
static buf_T *prev_curbuf = NULL;
static varnumber_T prev_changedtick = 0;
static pos_T prev_cursor = { 0, 0, 0 };
if (curwin == prev_curwin && equalpos(curwin->w_cursor, prev_cursor)) {
assert(curwin != NULL && curbuf != NULL);
// Nothing to do when the cursor didn't move and the text didn't change.
// After a change the corresponding line in a diff may be different.
if (curwin == prev_curwin && curbuf == prev_curbuf
&& buf_get_changedtick(curbuf) == prev_changedtick
&& equalpos(curwin->w_cursor, prev_cursor)) {
return;
}
prev_curwin = curwin;
prev_curbuf = curbuf;
prev_changedtick = buf_get_changedtick(curbuf);
prev_cursor = curwin->w_cursor;
linenr_T line = curwin->w_cursor.lnum;

View File

@@ -3391,4 +3391,29 @@ func Test_diffput_to_empty_buf()
call term_sendkeys(buf, 'j')
call VerifyScreenDump(buf, 'Test_diffput_to_empty_buf_03', {})
call StopVimInTerminal(buf)
endfunc
" Undo can change which lines correspond in a diff. 'cursorbind' must update
" the other window even when the cursor here did not move.
func Test_diff_cursorbind_after_undo()
call setline(1, ['x', 'y', 'c', 'd'])
let w1 = win_getid()
new
call setline(1, ['p', 'q', 'c', 'd'])
let w2 = win_getid()
windo diffthis
call win_gotoid(w1)
normal! 2dd
call assert_equal(1, line('.', w1))
call assert_equal(1, line('.', w2))
normal! jk
call assert_equal(1, line('.', w1))
call assert_equal(3, line('.', w2))
normal! u
call assert_equal(1, line('.', w1))
call assert_equal(1, line('.', w2))
%bw!