commit 9c89212de1eaaa62a654dd941b346fa51f634fdb
parent d8cea8d45d6602e3e4b9624e12dd14938440ff37
Author: phanium <91544758+phanen@users.noreply.github.com>
Date: Fri, 10 Oct 2025 22:07:01 +0800
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
Diffstat:
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
@@ -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
@@ -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:<or [-] }{3:[No Name] [+] }|
+ |
+ ]])
+ end)
+
describe('branch+remove is correctly graphed', function()
it('when branching left', function()
generate_undo_tree_from_rev({ 0, 1, 2, 3, 1, 3, 4, 3, 2, 0 })