require('gitsigns').setup {
  status_formatter    = nil,
  sign_priority       = 6,
  update_debounce     = 100,
  max_file_length     = 10000,
  signcolumn          = true,
  numhl               = false,
  linehl              = false,
  word_diff           = false,
  attach_to_untracked = false,
  current_line_blame  = false,
  watch_gitdir = {
    interval     = 1000,
    follow_files = true
  },
  preview_config = {
    -- Options passed to nvim_open_win
    border   = 'single',
    style    = 'minimal',
    relative = 'cursor',
    row      = 0,
    col      = 1
  },
  yadm = {
    enable = false
  },
  signs = {
    add          = { text = '+' },
    change       = { text = '│' },
    delete       = { text = '-' },
    topdelete    = { text = '‾' },
    changedelete = { text = '~' },
  },
  on_attach = function(bufnr)
    local gs = package.loaded.gitsigns

    local function map(mode, l, r, opts)
      opts = opts or {}
      opts.buffer = bufnr
      vim.keymap.set(mode, l, r, opts)
    end

    map('n', ']c', function()
      if vim.wo.diff then return ']c' end
      vim.schedule(function() gs.next_hunk() end)
      return '<Ignore>'
    end, {expr=true})

    map('n', '[c', function()
      if vim.wo.diff then return '[c' end
      vim.schedule(function() gs.prev_hunk() end)
      return '<Ignore>'
    end, {expr=true})

    map('n', '<Leader>hp', gs.preview_hunk)
    map('n', '<Leader>hP', gs.preview_hunk_inline)
    map('n', '<Leader>hl', gs.setloclist)
    map('n', '<Leader>hq', gs.setqflist)
    map('n', '<Leader>hQ', function() gs.setqflist('attached') end)
    map('n', '<Leader>ht', gs.toggle_signs)
    map('n', '<Leader>hu', gs.undo_stage_hunk)

    map({'n', 'v'}, '<Leader>hs', ':Gitsigns stage_hunk<CR>')
    map({'n', 'v'}, '<Leader>hr', ':Gitsigns reset_hunk<CR>')
    map({'o', 'x'}, 'ih', ':<C-U>Gitsigns select_hunk<CR>')
  end
}
