From 9c89212de1eaaa62a654dd941b346fa51f634fdb Mon Sep 17 00:00:00 2001 From: phanium <91544758+phanen@users.noreply.github.com> Date: Fri, 10 Oct 2025 22:07:01 +0800 Subject: [PATCH] fix(undotree): sync scroll pos with undo #36117 Problem: when undo in buffer, undotree window is not updated to position of correct node Solution: schedule nvim_win_set_cursor --- .../dist/opt/nvim.undotree/lua/undotree.lua | 8 ++++--- test/functional/plugin/undotree_spec.lua | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/runtime/pack/dist/opt/nvim.undotree/lua/undotree.lua b/runtime/pack/dist/opt/nvim.undotree/lua/undotree.lua index 08219879f9..d7eb00ce9e 100644 --- a/runtime/pack/dist/opt/nvim.undotree/lua/undotree.lua +++ b/runtime/pack/dist/opt/nvim.undotree/lua/undotree.lua @@ -264,9 +264,11 @@ local function draw(inbuf, outbuf) local curseq_line = buf_apply_graph_lines(tree, graph_lines, outbuf, meta, curseq) vim.bo[outbuf].modifiable = false - if vim.api.nvim_win_is_valid(vim.b[outbuf].nvim_is_undotree) then - vim.api.nvim_win_set_cursor(vim.b[outbuf].nvim_is_undotree, { curseq_line, 0 }) - end + vim.schedule(function() + if vim.api.nvim_win_is_valid(vim.b[outbuf].nvim_is_undotree) then + vim.api.nvim_win_set_cursor(vim.b[outbuf].nvim_is_undotree, { curseq_line, 0 }) + end + end) return meta end diff --git a/test/functional/plugin/undotree_spec.lua b/test/functional/plugin/undotree_spec.lua index 4d7a5142ac..b3d1336d16 100644 --- a/test/functional/plugin/undotree_spec.lua +++ b/test/functional/plugin/undotree_spec.lua @@ -6,6 +6,7 @@ local eq = t.eq local exec = n.exec local api = n.api local dedent = t.dedent +local Screen = require('test.functional.ui.screen') ---@param reverse_tree {[integer]:integer} local function generate_undo_tree_from_rev(reverse_tree) @@ -80,6 +81,28 @@ describe(':Undotree', function() eq('foo', api.nvim_get_current_line()) end) + it('sync scroll pos when undo', function() + local screen = Screen.new(30, 10) + for _ = 1, n.api.nvim_get_option_value('lines', {}) do + api.nvim_set_current_line('foo') + end + exec 'Undotree' + exec 'wincmd w' + exec 'silent undo' + screen:expect([[ + * 3 │^foo | + * 4 │{1:~ }| + * 5 │{1:~ }| + * 6 │{1:~ }| + * 7 │{1:~ }| + * 8 │{1:~ }| + {21:* 9 }│{1:~ }| + * 10 │{1:~ }| + {2: