mirror of
https://github.com/neovim/neovim.git
synced 2026-08-15 11:59:31 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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!
|
||||
|
||||
Reference in New Issue
Block a user