Skip to content

Instantly share code, notes, and snippets.

@dstein64
Last active June 3, 2023 03:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dstein64/b5d9431ebeacae1fb963efc3f2c94cf4 to your computer and use it in GitHub Desktop.
Save dstein64/b5d9431ebeacae1fb963efc3f2c94cf4 to your computer and use it in GitHub Desktop.
Sample code showing how to add gitsigns support to nvim-scrollview
local api = vim.api
local scrollview = require('scrollview')
local group = 'gitsigns'
local add = scrollview.register_sign_spec({
group = group,
highlight = 'GitSignsAdd',
symbol = ' ',
}).name
local change = scrollview.register_sign_spec({
group = group,
highlight = 'GitSignsChange',
symbol = ' ',
}).name
local delete = scrollview.register_sign_spec({
group = group,
highlight = 'GitSignsDelete',
symbol = ' ',
}).name
scrollview.set_sign_group_state(group, enable)
api.nvim_create_autocmd('User', {
pattern = 'ScrollViewRefresh',
callback = function()
if not scrollview.is_sign_group_active(group) then return end
local success, gitsigns = pcall(require, 'gitsigns')
if not success then return end
for _, winid in ipairs(scrollview.get_sign_eligible_windows()) do
local bufnr = api.nvim_win_get_buf(winid)
local hunks = gitsigns.get_hunks(bufnr) or {}
local lines_add = {}
local lines_change = {}
local lines_delete = {}
for _, hunk in ipairs(hunks) do
if hunk.type == 'add' then
-- Don't show if the entire column would be covered.
if hunk.added.count < api.nvim_buf_line_count(bufnr) then
for line = hunk.added.start, hunk.added.start + hunk.added.count - 1 do
table.insert(lines_add, line)
end
end
elseif hunk.type == 'change' then
for line = hunk.added.start, hunk.added.start + hunk.added.count - 1 do
table.insert(lines_change, line)
end
elseif hunk.type == 'delete' then
table.insert(lines_delete, hunk.added.start)
end
end
vim.b[bufnr][add] = lines_add
vim.b[bufnr][change] = lines_change
vim.b[bufnr][delete] = lines_delete
end
end
})
api.nvim_create_autocmd('User', {
pattern = 'GitSignsUpdate',
callback = function()
if not scrollview.is_sign_group_active(group) then return end
vim.cmd('silent! ScrollViewRefresh')
end
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment