Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lua/codediff/ui/conflict/keymaps.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions tests/ui/conflict/merge_keymap_ownership_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Loading