return { "sindrets/diffview.nvim", event = "User AstroGitFile", opts = function() local actions = require "diffview.actions" local utils = require "astrocore" -- astronvim utils local prefix = "D" utils.set_mappings { n = { [prefix] = { name = " Diff View" }, [prefix .. ""] = { "DiffviewOpen", desc = "Open DiffView" }, [prefix .. "h"] = { "DiffviewFileHistory %", desc = "Open DiffView File History" }, [prefix .. "H"] = { "DiffviewFileHistory", 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"] = { "DiffviewClose", 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. ["e"] = { actions.toggle_files, desc = "Toggle Explorer" }, -- Toggle the file panel. ["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. [""] = actions.next_entry, [""] = actions.prev_entry, [""] = actions.select_entry, -- Open the diff for the selected entry. ["<2-LeftMouse>"] = actions.select_entry, [""] = actions.scroll_view(-0.25), -- Scroll the view up [""] = actions.scroll_view(0.25), -- Scroll the view down [""] = actions.select_next_entry, [""] = 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 [""] = actions.next_entry, [""] = actions.prev_entry, [""] = actions.select_entry, ["<2-LeftMouse>"] = actions.select_entry, [""] = actions.open_in_diffview, -- Open the entry under the cursor in a diffview [""] = actions.scroll_view(-0.25), [""] = actions.scroll_view(0.25), [""] = actions.select_next_entry, [""] = actions.select_prev_entry, }, option_panel = { q = actions.close, o = actions.select_entry, [""] = actions.select_entry, ["<2-LeftMouse"] = actions.select_entry, }, }, } end, }