git-conflict.mov
A plugin to visualise and resolve conflicts in neovim. This plugin was inspired by conflict-marker.vim
This plugin is under active development, it should generally work, but you're likely to encounter some bugs during usage.
git
nvim 0.7+
-- packer.nvim
use {'akinsho/git-conflict.nvim', tag = "*", config = function()
require('git-conflict').setup()
end}
-- lazy.nvim
{'akinsho/git-conflict.nvim', version = "*", config = true}
I recommend using the {tag|version} field of your package manager, so your version of this plugin is only updated when a new tag is pushed as main
itself might be unstable.
{
default_mappings = true, -- disable buffer local mapping created by this plugin
default_commands = true, -- disable commands created by this plugin
disable_diagnostics = false, -- This will disable the diagnostics in a buffer whilst it is conflicted
list_opener = 'copen', -- command or function to open the conflicts list
highlights = { -- They must have background color, otherwise the default color will be used
incoming = 'DiffAdd',
current = 'DiffText',
}
}
GitConflictChooseOurs
— Select the current changes.GitConflictChooseTheirs
— Select the incoming changes.GitConflictChooseBoth
— Select both changes.GitConflictChooseNone
— Select none of the changes.GitConflictNextConflict
— Move to the next conflict.GitConflictPrevConflict
— Move to the previous conflict.GitConflictListQf
— Get all conflict to quickfix
You can list conflicts in the quick fix list using the GitConflictListQf
command
quickfix displayed using nvim-pqf
When a conflict is detected by this plugin a User
autocommand is fired
called GitConflictDetected
. When this is resolved another command is
fired called GitConflictResolved
.
Either of these can be used to run logic whilst dealing with conflicts e.g.
vim.api.nvim_create_autocmd('User', {
pattern = 'GitConflictDetected',
callback = function()
vim.notify('Conflict detected in '..vim.fn.expand('<afile>'))
vim.keymap.set('n', 'cww', function()
engage.conflict_buster()
create_buffer_local_mappings()
end)
end
})
This plugin offers default buffer local mappings inside conflicted files. This is primarily because applying these mappings only to relevant buffers
is impossible through global mappings. A user can however disable these by setting default_mappings = false
anyway and create global mappings as shown below.
The default mappings are:
- co — choose ours
- ct — choose theirs
- cb — choose both
- c0 — choose none
- ]x — move to previous conflict
- [x — move to next conflict
If you would rather not use these then you can specify your own mappings.
require'git-conflict'.setup {
default_mappings = {
ours = 'o',
theirs = 't',
none = '0',
both = 'b',
next = 'n',
prev = 'p',
},
}
or alternatively, set default_mappings = false
and apply the mappings yourself
example manual mappings
vim.keymap.set('n', 'co', '<Plug>(git-conflict-ours)')
vim.keymap.set('n', 'ct', '<Plug>(git-conflict-theirs)')
vim.keymap.set('n', 'cb', '<Plug>(git-conflict-both)')
vim.keymap.set('n', 'c0', '<Plug>(git-conflict-none)')
vim.keymap.set('n', '[x', '<Plug>(git-conflict-prev-conflict)')
vim.keymap.set('n', ']x', '<Plug>(git-conflict-next-conflict)')
This plugin exposes an API to extract some of the data it collects for other purposes.
conflict_count({bufnr})
Returns the amount of conflicts in a given buffer.
Parameters:
{bufnr} (number) Specify the buffer for which you want to know the
amount of conflicts (default: current buffer).
Return:
number: The amount of conflicts.
Please read this — This plugin is not intended to do anything other than provide fancy visuals, and some mappings to handle conflict resolution It will not be expanded to become a full git management plugin, there are a zillion plugins that do that already, this won't be one of those.
Open source should be collaborative, if you have an idea for a feature you'd like to see added. Submit a PR rather than a feature request.