diff --git a/lua/codediff/ui/conflict/keymaps.lua b/lua/codediff/ui/conflict/keymaps.lua index c328d4c5..82841e46 100644 --- a/lua/codediff/ui/conflict/keymaps.lua +++ b/lua/codediff/ui/conflict/keymaps.lua @@ -88,6 +88,15 @@ function M.setup_keymaps(tabpage) extra = { desc = action.desc, expr = true }, }) end + else + lifecycle.set_buf_keymap(tabpage, bufnr, "n", "u", function() + if not session.result_bufnr or not vim.api.nvim_buf_is_valid(session.result_bufnr) then + return + end + vim.api.nvim_buf_call(session.result_bufnr, function() + vim.cmd("undo") + end) + end, vim.tbl_extend("force", base_opts, { desc = "Undo previous result edit" })) end end end diff --git a/tests/ui/conflict/merge_keymap_ownership_spec.lua b/tests/ui/conflict/merge_keymap_ownership_spec.lua index 9b61a343..d274c1b9 100644 --- a/tests/ui/conflict/merge_keymap_ownership_spec.lua +++ b/tests/ui/conflict/merge_keymap_ownership_spec.lua @@ -101,6 +101,26 @@ describe("merge view keymap ownership", function() assert.equals("Next conflict [buf]", effective(session.original_bufnr, "]x"), "conflict navigation must be bound on the diff panes") end) + it("undoes result changes with `u` from non-result conflict panes", function() + local session = open_merge_view() + local tabpage = vim.api.nvim_get_current_tabpage() + local conflict = require("codediff.ui.conflict") + + local before = vim.api.nvim_buf_get_lines(session.result_bufnr, 0, -1, false) + + vim.api.nvim_set_current_buf(session.original_bufnr) + vim.api.nvim_win_set_cursor(0, { 3, 0 }) + assert.is_true(conflict.accept_incoming(tabpage), "accept action should modify the result buffer") + + local after_accept = vim.api.nvim_buf_get_lines(session.result_bufnr, 0, -1, false) + assert.not_same(before, after_accept, "accept action should change result content") + + vim.api.nvim_feedkeys("u", "x", false) + + local after_undo = vim.api.nvim_buf_get_lines(session.result_bufnr, 0, -1, false) + assert.are.same(before, after_undo, "`u` from a non-result pane should undo result buffer changes") + end) + it("claims do and dp again in an ordinary diff", function() -- The counterpart: outside a merge, do/dp are codediff's. Without this a -- change that simply never binds them would pass the assertions above.