Adds signs to the sign column to indicate added, changed, and deleted lines.
Supports different signs for staged changes.
Add counts to signs.
Hunk Actions
Stage/unstage hunks with :Gitsigns stage_hunk.
Reset hunks with :Gitsigns reset_hunk.
Also works on partial hunks in visual mode.
Preview hunks inline with :Gitsigns preview_hunk_inline
Preview hunks in popup with :Gitsigns preview_hunk
Navigate between hunks with :Gitsigns nav_hunk next/prev.
Blame
Show blame of current buffer using :Gitsigns blame.
Show blame information for the current line in popup with :Gitsigns blame_line.
Show blame information for the current line in virtual text.
Enable with setup({ current_line_blame = true }).
Toggle with :Gitsigns toggle_current_line_blame
Diff
Change the revision for the signs with :Gitsigns change_base <REVISION>.
Show the diff of the current buffer with the index or any revision
with :Gitsigns diffthis <REVISION>.
Show intra-line word-diff in the buffer.
Enable with setup({ word_diff = true }).
Toggle with :Gitsigns toggle_word_diff.
Show hunks Quickfix/Location List
Set the quickfix/location list with changes with :Gitsign setqflist/setloclist.
Can show hunks for:
whole repository (target=all)
attached buffers (target=attached)
a specific buffer (target=[integer]).
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 :edit the current buffer at <REVISION>
📋 Requirements
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.
🛠️ Installation & Usage
Install using your package manager of choice.
For recommended setup with all batteries included:
require('gitsigns').setup()
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
border = 'single',
style = 'minimal',
relative = 'cursor',
row = 0,
col = 1
},
}
For information on configuring Neovim via lua please see nvim-lua-guide.
🎹 Keymaps
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>td', gitsigns.toggle_deleted)
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.
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.
Support for other VCS
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.
gitsigns.nvim
Deep buffer integration for Git
👀 Preview
✨ Features
Signs
Adds signs to the sign column to indicate added, changed, and deleted lines.
Supports different signs for staged changes.
Add counts to signs.
Hunk Actions
Stage/unstage hunks with
:Gitsigns stage_hunk
.Reset hunks with
:Gitsigns reset_hunk
.Also works on partial hunks in visual mode.
Preview hunks inline with
:Gitsigns preview_hunk_inline
Preview hunks in popup with
:Gitsigns preview_hunk
Navigate between hunks with
:Gitsigns nav_hunk next/prev
.Blame
Show blame of current buffer using
:Gitsigns blame
.Show blame information for the current line in popup with
:Gitsigns blame_line
.Show blame information for the current line in virtual text.
setup({ current_line_blame = true })
.:Gitsigns toggle_current_line_blame
Diff
Change the revision for the signs with
:Gitsigns change_base <REVISION>
.Show the diff of the current buffer with the index or any revision with
:Gitsigns diffthis <REVISION>
.Show intra-line word-diff in the buffer.
setup({ word_diff = true })
.:Gitsigns toggle_word_diff
.Show hunks Quickfix/Location List
Set the quickfix/location list with changes with
:Gitsign setqflist/setloclist
.Can show hunks for:
target=all
)target=attached
)target=[integer]
).Text Object
vim.keymap.set({'o', 'x'}, 'ih', '<Cmd>Gitsigns select_hunk<CR>')
Status Line Integration
Use
b:gitsigns_status
orb:gitsigns_status_dict
.b:gitsigns_status
is formatted usingconfig.status_formatter
.b:gitsigns_status_dict
is a dictionary with the keysadded
,removed
,changed
andhead
.Example:
For the current branch use the variable
b:gitsigns_head
.Show different revisions of buffers
:Gitsigns show <REVISION>
to:edit
the current buffer at<REVISION>
📋 Requirements
🛠️ Installation & Usage
Install using your package manager of choice.
For recommended setup with all batteries included:
Configuration can be passed to the setup function. Here is an example with most of the default settings:
For information on configuring Neovim via lua please see nvim-lua-guide.
🎹 Keymaps
Gitsigns provides an
on_attach
callback which can be used to setup buffer mappings.Here is a suggested example:
🔗 Plugin Integrations
vim-fugitive
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.trouble.nvim
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.🚫 Non-Goals
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.
Support for other VCS
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.
🔌 Similar plugins