feat: unified diff conflict resolution for unmerged files (#99)
## Problem Pressing `du` on a `UU` (unmerged) file in the fugitive status buffer had no effect. There was no way to see a proper ours-vs-theirs diff with syntax highlighting and intra-line changes, or to resolve conflicts from within a unified diff view. Additionally, pressing `du` on a section header containing only unmerged files showed "no changes in section" because `git diff` produces combined (`diff --cc`) output for unmerged files, which was stripped entirely. ## Solution Fetch `:2:` (ours) and `:3:` (theirs) from the git index and generate a standard unified diff. The existing highlight pipeline (treesitter + intra-line) applies automatically. Resolution keymaps (`doo`/`dot`/`dob`/`don`) on hunks in the diff view write changes back to the working file's conflict markers. Navigation (`]x`/`[x`) jumps between unresolved conflict hunks. For section diffs, combined diff entries are now replaced with generated ours-vs-theirs unified diffs instead of being stripped. Works for merge, cherry-pick, and rebase conflicts — git populates `:2:`/`:3:` the same way for all three. Closes #61
This commit is contained in:
parent
49fc446aae
commit
a2053a132b
8 changed files with 1287 additions and 28 deletions
|
|
@ -82,3 +82,28 @@ end, { desc = 'Jump to next conflict' })
|
|||
vim.keymap.set('n', '<Plug>(diffs-conflict-prev)', function()
|
||||
require('diffs.conflict').goto_prev(vim.api.nvim_get_current_buf())
|
||||
end, { desc = 'Jump to previous conflict' })
|
||||
|
||||
local function merge_action(fn)
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local config = require('diffs').get_conflict_config()
|
||||
fn(bufnr, config)
|
||||
end
|
||||
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-ours)', function()
|
||||
merge_action(require('diffs.merge').resolve_ours)
|
||||
end, { desc = 'Accept ours in merge diff' })
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-theirs)', function()
|
||||
merge_action(require('diffs.merge').resolve_theirs)
|
||||
end, { desc = 'Accept theirs in merge diff' })
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-both)', function()
|
||||
merge_action(require('diffs.merge').resolve_both)
|
||||
end, { desc = 'Accept both in merge diff' })
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-none)', function()
|
||||
merge_action(require('diffs.merge').resolve_none)
|
||||
end, { desc = 'Reject both in merge diff' })
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-next)', function()
|
||||
require('diffs.merge').goto_next(vim.api.nvim_get_current_buf())
|
||||
end, { desc = 'Jump to next conflict hunk' })
|
||||
vim.keymap.set('n', '<Plug>(diffs-merge-prev)', function()
|
||||
require('diffs.merge').goto_prev(vim.api.nvim_get_current_buf())
|
||||
end, { desc = 'Jump to previous conflict hunk' })
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue