akinsho/git-conflict.nvim

github github
git
star 313
stars
alert-circle 2
open issues
users 3
subscribers
git-branch 11
forks
CREATED

2022-03-13

UPDATED

26 days ago


git-conflict.nvim

https://user-images.githubusercontent.com/22454918/159362564-a66d8c23-f7dc-4d1d-8e88-c5c73a49047e.mov

A plugin to visualise and resolve conflicts in neovim. This plugin was inspired by conflict-marker.vim

Status

This plugin is under active development, it should generally work, but you're likely to encounter some bugs during usage.

Requirements

  • git
  • nvim 0.7+

Installation

use {'akinsho/git-conflict.nvim', tag = "*", config = function()
  require('git-conflict').setup()
end}

I recommend using the tag field of you package manager, so your version of this plugin is only updated when a new tag is pushed as main itself might be unstable.

Configuration

{
  default_mappings = true, -- disable buffer local mapping created by this plugin
  disable_diagnostics = false, -- This will disable the diagnostics in a buffer whilst it is conflicted
  highlights = { -- They must have background color, otherwise the default color will be used
    incoming = 'DiffText',
    current = 'DiffAdd',
  }
}

Commands

  • 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

Listing conflicts

You can list conflicts in the quick fix list using the GitConflictListQf command

quickfix displayed using nvim-pqf

Autocommands

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_autocommand('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
})

Mappings

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 disable default mappings an can then map these yourself.

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)')

Issues

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.

Feature requests

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.