feat(diff): autojump (#48)

centralized configuration

Signed-off-by: Aaron Pham <contact@aarnphm.xyz>
This commit is contained in:
Aaron Pham
2024-08-17 14:14:02 -04:00
committed by GitHub
parent f5d9d2139a
commit 1aaf6a8227
4 changed files with 68 additions and 108 deletions

View File

@@ -5,11 +5,12 @@ local M = {}
local color = require("avante.diff.colors")
local utils = require("avante.diff.utils")
local Config = require("avante.config")
local fn = vim.fn
local api = vim.api
local fmt = string.format
local map = vim.keymap.set
local job = utils.job
-----------------------------------------------------------------------------//
-- REFERENCES:
-----------------------------------------------------------------------------//
@@ -28,7 +29,7 @@ local job = utils.job
---@alias ConflictSide "'ours'"|"'theirs'"|"'both'"|"'base'"|"'none'"
--- @class ConflictHighlights
--- @class AvanteConflictHighlights
--- @field current string
--- @field incoming string
--- @field ancestor string?
@@ -60,31 +61,10 @@ local job = utils.job
--- @field tick integer
--- @field bufnr integer
--- @class AvanteConflictMappings
--- @field ours string
--- @field theirs string
--- @field none string
--- @field both string
--- @field next string
--- @field prev string
--- @class AvanteConflictConfig
--- @field default_mappings AvanteConflictMappings
--- @field disable_diagnostics boolean
--- @field list_opener string|function
--- @field highlights ConflictHighlights
--- @field debug boolean
--- @class AvanteConflictUserConfig
--- @field default_mappings boolean|AvanteConflictMappings
--- @field disable_diagnostics boolean
--- @field list_opener string|function
--- @field highlights ConflictHighlights
--- @field debug boolean
-----------------------------------------------------------------------------//
-- Constants
-----------------------------------------------------------------------------//
---@enum AvanteConflictSides
local SIDES = {
OURS = "ours",
THEIRS = "theirs",
@@ -123,30 +103,6 @@ local DEFAULT_INCOMING_BG_COLOR = 3229523 -- #314753
local DEFAULT_ANCESTOR_BG_COLOR = 6824314 -- #68217A
-----------------------------------------------------------------------------//
--- @type AvanteConflictMappings
local DEFAULT_MAPPINGS = {
ours = "co",
theirs = "ct",
none = "c0",
both = "cb",
next = "]x",
prev = "[x",
}
--- @type AvanteConflictConfig
local config = {
debug = false,
default_mappings = DEFAULT_MAPPINGS,
default_commands = true,
disable_diagnostics = false,
list_opener = "copen",
highlights = {
current = "DiffText",
incoming = "DiffAdd",
ancestor = nil,
},
}
--- @return table<string, ConflictBufferCache>
local function create_visited_buffers()
return setmetatable({}, {
@@ -367,20 +323,19 @@ local function set_cursor(position, side)
api.nvim_win_set_cursor(0, { target.range_start + 1, 0 })
end
local show_keybinding_hint_extmark_id = nil
local function register_cursor_move_events(bufnr)
local show_keybinding_hint_extmark_id = nil
local function show_keybinding_hint(lnum)
if show_keybinding_hint_extmark_id then
api.nvim_buf_del_extmark(bufnr, KEYBINDING_NAMESPACE, show_keybinding_hint_extmark_id)
end
local hint = string.format(
" [Press <%s> for CHOICE OURS, <%s> for CHOICE THEIRS, <%s> for PREV, <%s> for NEXT] ",
config.default_mappings.ours,
config.default_mappings.theirs,
config.default_mappings.prev,
config.default_mappings.next
" [Press <%s> for OURS, <%s> for THEIRS, <%s> for PREV, <%s> for NEXT] ",
Config.diff.mappings.ours,
Config.diff.mappings.theirs,
Config.diff.mappings.prev,
Config.diff.mappings.next
)
local win_width = api.nvim_win_get_width(0)
local col = win_width - #hint - math.ceil(win_width * 0.3) - 4
@@ -413,8 +368,8 @@ end
---Get the conflict marker positions for a buffer if any and update the buffers state
---@param bufnr integer
---@param range_start integer
---@param range_end integer
---@param range_start? integer
---@param range_end? integer
local function parse_buffer(bufnr, range_start, range_end)
local lines = utils.get_buf_lines(range_start or 0, range_end or -1, bufnr)
local prev_conflicts = visited_buffers[bufnr].positions ~= nil and #visited_buffers[bufnr].positions > 0
@@ -453,10 +408,10 @@ local function set_commands()
M.conflicts_to_qf_items(function(items)
if #items > 0 then
fn.setqflist(items, "r")
if type(config.list_opener) == "function" then
config.list_opener()
if type(Config.diff.list_opener) == "function" then
Config.diff.list_opener()
else
vim.cmd(config.list_opener)
vim.cmd(Config.diff.list_opener)
end
end
end)
@@ -501,19 +456,21 @@ local function set_plug_mappings()
map("n", "<Plug>(git-conflict-prev-conflict)", "<Cmd>AvanteConflictPrevConflict<CR>", opts("Previous Conflict"))
end
---@param bufnr integer given buffer id
local function setup_buffer_mappings(bufnr)
---@param desc string
local function opts(desc)
return { silent = true, buffer = bufnr, desc = "Git Conflict: " .. desc }
end
map({ "n", "v" }, config.default_mappings.ours, "<Plug>(git-conflict-ours)", opts("Choose Ours"))
map({ "n", "v" }, config.default_mappings.both, "<Plug>(git-conflict-both)", opts("Choose Both"))
map({ "n", "v" }, config.default_mappings.none, "<Plug>(git-conflict-none)", opts("Choose None"))
map({ "n", "v" }, config.default_mappings.theirs, "<Plug>(git-conflict-theirs)", opts("Choose Theirs"))
map({ "v", "v" }, config.default_mappings.ours, "<Plug>(git-conflict-ours)", opts("Choose Ours"))
-- map('V', config.default_mappings.ours, '<Plug>(git-conflict-ours)', opts('Choose Ours'))
map("n", config.default_mappings.prev, "<Plug>(git-conflict-prev-conflict)", opts("Previous Conflict"))
map("n", config.default_mappings.next, "<Plug>(git-conflict-next-conflict)", opts("Next Conflict"))
map({ "n", "v" }, Config.diff.mappings.ours, "<Plug>(git-conflict-ours)", opts("Choose Ours"))
map({ "n", "v" }, Config.diff.mappings.both, "<Plug>(git-conflict-both)", opts("Choose Both"))
map({ "n", "v" }, Config.diff.mappings.none, "<Plug>(git-conflict-none)", opts("Choose None"))
map({ "n", "v" }, Config.diff.mappings.theirs, "<Plug>(git-conflict-theirs)", opts("Choose Theirs"))
map({ "v", "v" }, Config.diff.mappings.ours, "<Plug>(git-conflict-ours)", opts("Choose Ours"))
-- map('V', Config.diff.mappings.ours, '<Plug>(git-conflict-ours)', opts('Choose Ours'))
map("n", Config.diff.mappings.prev, "<Plug>(git-conflict-prev-conflict)", opts("Previous Conflict"))
map("n", Config.diff.mappings.next, "<Plug>(git-conflict-next-conflict)", opts("Next Conflict"))
vim.b[bufnr].conflict_mappings_set = true
end
@@ -528,7 +485,7 @@ local function clear_buffer_mappings(bufnr)
if not bufnr or not vim.b[bufnr].conflict_mappings_set then
return
end
for _, mapping in pairs(config.default_mappings) do
for _, mapping in pairs(Config.diff.mappings) do
if is_mapped(mapping) then
api.nvim_buf_del_keymap(bufnr, "n", mapping)
end
@@ -541,7 +498,7 @@ end
-----------------------------------------------------------------------------//
---Derive the colour of the section label highlights based on each sections highlights
---@param highlights ConflictHighlights
---@param highlights AvanteConflictHighlights
local function set_highlights(highlights)
local current_color = utils.get_hl(highlights.current)
local incoming_color = utils.get_hl(highlights.incoming)
@@ -560,21 +517,10 @@ local function set_highlights(highlights)
api.nvim_set_hl(0, ANCESTOR_LABEL_HL, { background = ancestor_label_bg, default = true })
end
---@param user_config AvanteConflictUserConfig
function M.setup(user_config)
local _user_config = user_config or {}
function M.setup()
set_highlights(Config.diff.highlights)
if _user_config.default_mappings == true then
_user_config.default_mappings = DEFAULT_MAPPINGS
end
config = vim.tbl_deep_extend("force", config, _user_config)
set_highlights(config.highlights)
if config.default_commands then
set_commands()
end
set_commands()
set_plug_mappings()
@@ -582,7 +528,7 @@ function M.setup(user_config)
api.nvim_create_autocmd("ColorScheme", {
group = AUGROUP_NAME,
callback = function()
set_highlights(config.highlights)
set_highlights(Config.diff.highlights)
end,
})
@@ -591,12 +537,8 @@ function M.setup(user_config)
pattern = "AvanteConflictDetected",
callback = function()
local bufnr = api.nvim_get_current_buf()
if config.disable_diagnostics then
vim.diagnostic.disable(bufnr)
end
if config.default_mappings then
setup_buffer_mappings(bufnr)
end
vim.diagnostic.enable(not vim.diagnostic.is_enabled(), { bufnr = bufnr })
setup_buffer_mappings(bufnr)
end,
})
@@ -605,12 +547,8 @@ function M.setup(user_config)
pattern = "AvanteConflictResolved",
callback = function()
local bufnr = api.nvim_get_current_buf()
if config.disable_diagnostics then
vim.diagnostic.enable(bufnr)
end
if config.default_mappings then
clear_buffer_mappings(bufnr)
end
vim.diagnostic.enable(not vim.diagnostic.is_enabled(), { bufnr = bufnr })
clear_buffer_mappings(bufnr)
end,
})
@@ -745,6 +683,10 @@ function M.choose(side)
end)
end
end, 50)
if Config.diff.autojump then
M.find_next(side)
vim.cmd([[normal! zz]])
end
return
end
local position = get_current_position(bufnr)
@@ -775,6 +717,10 @@ function M.choose(side)
api.nvim_buf_del_extmark(0, NAMESPACE, position.marks.ancestor.label)
end
parse_buffer(bufnr)
if Config.diff.autojump then
M.find_next(side)
vim.cmd([[normal! zz]])
end
end
function M.conflict_count(bufnr)