2024-09-17 15:02:57 -03:00

124 lines
6.3 KiB
Lua

return {
"sindrets/diffview.nvim",
event = "User AstroGitFile",
opts = function()
local actions = require "diffview.actions"
local utils = require "astrocore" -- astronvim utils
local prefix = "<leader>D"
utils.set_mappings {
n = {
[prefix] = { name = " Diff View" },
[prefix .. "<cr>"] = { "<cmd>DiffviewOpen<cr>", desc = "Open DiffView" },
[prefix .. "h"] = { "<cmd>DiffviewFileHistory %<cr>", desc = "Open DiffView File History" },
[prefix .. "H"] = { "<cmd>DiffviewFileHistory<cr>", desc = "Open DiffView Branch History" },
},
}
local build_keymaps = function(maps)
local out = {}
local i = 1
for lhs, def in
pairs(utils.extend_tbl(maps, {
[prefix .. "q"] = { "<cmd>DiffviewClose<cr>", desc = "Quit Diffview" }, -- Toggle the file panel.
["]D"] = { actions.select_next_entry, desc = "Next Difference" }, -- Open the diff for the next file
["[D"] = { actions.select_prev_entry, desc = "Previous Difference" }, -- Open the diff for the previous file
["[C"] = { actions.prev_conflict, desc = "Next Conflict" }, -- In the merge_tool: jump to the previous conflict
["]C"] = { actions.next_conflict, desc = "Previous Conflict" }, -- In the merge_tool: jump to the next conflict
["Cl"] = { actions.cycle_layout, desc = "Cycle Diff Layout" }, -- Cycle through available layouts.
["Ct"] = { actions.listing_style, desc = "Cycle Tree Style" }, -- Cycle through available layouts.
["<leader>e"] = { actions.toggle_files, desc = "Toggle Explorer" }, -- Toggle the file panel.
["<leader>o"] = { actions.focus_files, desc = "Focus Explorer" }, -- Bring focus to the file panel
}))
do
local opts
local rhs = def
local mode = { "n" }
if type(def) == "table" then
if def.mode then mode = def.mode end
rhs = def[1]
def[1] = nil
def.mode = nil
opts = def
end
out[i] = { mode, lhs, rhs, opts }
i = i + 1
end
return out
end
return {
enhanced_diff_hl = true,
view = {
merge_tool = { layout = "diff3_mixed" },
},
hooks = { diff_buf_read = function(bufnr) vim.b[bufnr].view_activated = false end },
keymaps = {
disable_defaults = true,
view = build_keymaps {
[prefix .. "o"] = { actions.conflict_choose "ours", desc = "Take Ours" }, -- Choose the OURS version of a conflict
[prefix .. "t"] = { actions.conflict_choose "theirs", desc = "Take Theirs" }, -- Choose the THEIRS version of a conflict
[prefix .. "b"] = { actions.conflict_choose "base", desc = "Take Base" }, -- Choose the BASE version of a conflict
[prefix .. "a"] = { actions.conflict_choose "all", desc = "Take All" }, -- Choose all the versions of a conflict
[prefix .. "0"] = { actions.conflict_choose "none", desc = "Take None" }, -- Delete the conflict region
},
diff3 = build_keymaps {
[prefix .. "O"] = { actions.diffget "ours", mode = { "n", "x" }, desc = "Get Our Diff" }, -- Obtain the diff hunk from the OURS version of the file
[prefix .. "T"] = { actions.diffget "theirs", mode = { "n", "x" }, desc = "Get Their Diff" }, -- Obtain the diff hunk from the THEIRS version of the file
},
diff4 = build_keymaps {
[prefix .. "B"] = { actions.diffget "base", mode = { "n", "x" }, desc = "Get Base Diff" }, -- Obtain the diff hunk from the OURS version of the file
[prefix .. "O"] = { actions.diffget "ours", mode = { "n", "x" }, desc = "Get Our Diff" }, -- Obtain the diff hunk from the OURS version of the file
[prefix .. "T"] = { actions.diffget "theirs", mode = { "n", "x" }, desc = "Get Their Diff" }, -- Obtain the diff hunk from the THEIRS version of the file
},
file_panel = build_keymaps {
j = actions.next_entry, -- Bring the cursor to the next file entry
k = actions.prev_entry, -- Bring the cursor to the previous file entry.
o = actions.select_entry,
S = actions.stage_all, -- Stage all entries.
U = actions.unstage_all, -- Unstage all entries.
X = actions.restore_entry, -- Restore entry to the state on the left side.
L = actions.open_commit_log, -- Open the commit log panel.
Cf = { actions.toggle_flatten_dirs, desc = "Flatten" }, -- Flatten empty subdirectories in tree listing style.
R = actions.refresh_files, -- Update stats and entries in the file list.
["-"] = actions.toggle_stage_entry, -- Stage / unstage the selected entry.
["<down>"] = actions.next_entry,
["<up>"] = actions.prev_entry,
["<cr>"] = actions.select_entry, -- Open the diff for the selected entry.
["<2-LeftMouse>"] = actions.select_entry,
["<c-b>"] = actions.scroll_view(-0.25), -- Scroll the view up
["<c-f>"] = actions.scroll_view(0.25), -- Scroll the view down
["<tab>"] = actions.select_next_entry,
["<s-tab>"] = actions.select_prev_entry,
},
file_history_panel = build_keymaps {
j = actions.next_entry,
k = actions.prev_entry,
o = actions.select_entry,
y = actions.copy_hash, -- Copy the commit hash of the entry under the cursor
L = actions.open_commit_log,
zR = { actions.open_all_folds, desc = "Open all folds" },
zM = { actions.close_all_folds, desc = "Close all folds" },
["?"] = { actions.options, desc = "Options" }, -- Open the option panel
["<down>"] = actions.next_entry,
["<up>"] = actions.prev_entry,
["<cr>"] = actions.select_entry,
["<2-LeftMouse>"] = actions.select_entry,
["<C-A-d>"] = actions.open_in_diffview, -- Open the entry under the cursor in a diffview
["<c-b>"] = actions.scroll_view(-0.25),
["<c-f>"] = actions.scroll_view(0.25),
["<tab>"] = actions.select_next_entry,
["<s-tab>"] = actions.select_prev_entry,
},
option_panel = {
q = actions.close,
o = actions.select_entry,
["<cr>"] = actions.select_entry,
["<2-LeftMouse"] = actions.select_entry,
},
},
}
end,
}