Deep buffer integration for Git
| Hunk Actions | Line Blame |
|---|---|
Signs
Hunk Actions
Blame
Diff
Show hunks Quickfix/Location List
Text Object
- Select hunks as a text object.
- Can use
vim.keymap.set({'o', 'x'}, 'ih', '<Cmd>Gitsigns select_hunk<CR>')
Status Line Integration
Use b:gitsigns_status or b:gitsigns_status_dict. b:gitsigns_status is
formatted using config.status_formatter. b:gitsigns_status_dict is a
dictionary with the keys added, removed, changed and head.
Example:
set statusline+=%{get(b:,'gitsigns_status','')}For the current branch use the variable b:gitsigns_head.
Show different revisions of buffers
- Use
:Gitsigns show <REVISION>to:editthe current buffer at<REVISION>
- Neovim >= 0.9.0
Tip
If your version of Neovim is too old, then you can use a past release.
Warning
If you are running a development version of Neovim (aka master), then
breakage may occur if your build is behind latest.
- Newish version of git. Older versions may not work with some features.
Install using your package manager of choice. No setup required.
Optional configuration can be passed to the setup function. Here is an example with most of the default settings:
require('gitsigns').setup {
signs = {
add = { text = 'β' },
change = { text = 'β' },
delete = { text = '_' },
topdelete = { text = 'βΎ' },
changedelete = { text = '~' },
untracked = { text = 'β' },
},
signs_staged = {
add = { text = 'β' },
change = { text = 'β' },
delete = { text = '_' },
topdelete = { text = 'βΎ' },
changedelete = { text = '~' },
untracked = { text = 'β' },
},
signs_staged_enable = true,
signcolumn = true, -- Toggle with `:Gitsigns toggle_signs`
numhl = false, -- Toggle with `:Gitsigns toggle_numhl`
linehl = false, -- Toggle with `:Gitsigns toggle_linehl`
word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff`
watch_gitdir = {
follow_files = true
},
auto_attach = true,
attach_to_untracked = false,
current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame`
current_line_blame_opts = {
virt_text = true,
virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align'
delay = 1000,
ignore_whitespace = false,
virt_text_priority = 100,
use_focus = true,
},
current_line_blame_formatter = '<author>, <author_time:%R> - <summary>',
sign_priority = 6,
update_debounce = 100,
status_formatter = nil, -- Use default
max_file_length = 40000, -- Disable if file is longer than this (in lines)
preview_config = {
-- Options passed to nvim_open_win
style = 'minimal',
relative = 'cursor',
row = 0,
col = 1
},
}For information on configuring Neovim via lua please see nvim-lua-guide.
Gitsigns provides an on_attach callback which can be used to setup buffer mappings.
Here is a suggested example:
require('gitsigns').setup{
...
on_attach = function(bufnr)
local gitsigns = require('gitsigns')
local function map(mode, l, r, opts)
opts = opts or {}
opts.buffer = bufnr
vim.keymap.set(mode, l, r, opts)
end
-- Navigation
map('n', ']c', function()
if vim.wo.diff then
vim.cmd.normal({']c', bang = true})
else
gitsigns.nav_hunk('next')
end
end)
map('n', '[c', function()
if vim.wo.diff then
vim.cmd.normal({'[c', bang = true})
else
gitsigns.nav_hunk('prev')
end
end)
-- Actions
map('n', '<leader>hs', gitsigns.stage_hunk)
map('n', '<leader>hr', gitsigns.reset_hunk)
map('v', '<leader>hs', function()
gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') })
end)
map('v', '<leader>hr', function()
gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') })
end)
map('n', '<leader>hS', gitsigns.stage_buffer)
map('n', '<leader>hR', gitsigns.reset_buffer)
map('n', '<leader>hp', gitsigns.preview_hunk)
map('n', '<leader>hi', gitsigns.preview_hunk_inline)
map('n', '<leader>hb', function()
gitsigns.blame_line({ full = true })
end)
map('n', '<leader>hd', gitsigns.diffthis)
map('n', '<leader>hD', function()
gitsigns.diffthis('~')
end)
map('n', '<leader>hQ', function() gitsigns.setqflist('all') end)
map('n', '<leader>hq', gitsigns.setqflist)
-- Toggles
map('n', '<leader>tb', gitsigns.toggle_current_line_blame)
map('n', '<leader>tw', gitsigns.toggle_word_diff)
-- Text object
map({'o', 'x'}, 'ih', gitsigns.select_hunk)
end
}When viewing revisions of a file (via :0Gclog for example), Gitsigns will attach to the fugitive buffer with the base set to the commit immediately before the commit of that revision.
This means the signs placed in the buffer reflect the changes introduced by that revision of the file.
If installed and enabled (via config.trouble; defaults to true if installed), :Gitsigns setqflist or :Gitsigns setloclist will open Trouble instead of Neovim's built-in quickfix or location list windows.
Implement every feature in vim-fugitive
This plugin is actively developed and by one of the most well regarded vim plugin developers. Gitsigns will only implement features of this plugin if: it is simple, or, the technologies leveraged by Gitsigns (LuaJIT, Libuv, Neovim's API, etc) can provide a better experience.
There aren't any active developers of this plugin who use other kinds of VCS, so adding support for them isn't feasible. However a well written PR with a commitment of future support could change this.