diffview was doing the job for reviewing a branch before merging it, but not well enough. codediff renders diffs the way VSCode does - light line-level backgrounds with deeper character-level highlights on top of them - so what actually changed within a line is legible rather than inferred. Keymaps carry over one for one: <leader>gd opens the status explorer, <leader>gh/<leader>gH the file and branch history, and <leader>gm still prompts for a base branch and diffs rev...HEAD against it. <leader>gc is folded into codediff's own quit action alongside q, since there is no close command to map it to. Its diffing is done in C, and the library is downloaded prebuilt on first use rather than compiled, so there is no build step for vim.pack to worry about.
41 lines
1.4 KiB
Lua
41 lines
1.4 KiB
Lua
vim.pack.add({ 'https://github.com/esmuellert/codediff.nvim' })
|
|
|
|
require('codediff').setup({
|
|
keymaps = {
|
|
-- q closes the diff tab from inside it; <leader>gc is here too so the
|
|
-- same key that opened things from the g/diff group also shuts them.
|
|
view = { quit = { 'q', '<leader>gc' } },
|
|
},
|
|
})
|
|
|
|
local function map(lhs, rhs, desc)
|
|
vim.keymap.set('n', lhs, rhs, { desc = desc })
|
|
end
|
|
|
|
map('<leader>gd', '<Cmd>CodeDiff<CR>', 'Diff working tree')
|
|
map('<leader>gh', '<Cmd>CodeDiff history %<CR>', 'File history')
|
|
map('<leader>gH', '<Cmd>CodeDiff history<CR>', 'Branch history')
|
|
|
|
-- The base branch name varies per repo (main, master, develop, ...), so ask
|
|
-- the first remote's HEAD what it is rather than hardcoding one.
|
|
local function default_branch()
|
|
local remote = vim.fn.systemlist('git remote')[1]
|
|
if not remote or remote == '' then
|
|
return ''
|
|
end
|
|
local ref = vim.fn.systemlist('git symbolic-ref refs/remotes/' .. remote .. '/HEAD')[1]
|
|
if not ref or ref == '' then
|
|
return ''
|
|
end
|
|
return ref:gsub('^refs/remotes/' .. remote .. '/', '')
|
|
end
|
|
|
|
map('<leader>gm', function()
|
|
vim.ui.input({ prompt = 'Diff against: ', default = default_branch() }, function(rev)
|
|
if rev and rev ~= '' then
|
|
-- rev...HEAD is merge-base semantics: what this branch added, not what
|
|
-- the base branch has moved on to since.
|
|
vim.cmd('CodeDiff ' .. rev .. '...HEAD')
|
|
end
|
|
end)
|
|
end, 'Diff against branch')
|