Add ability to preview hunks in a floating window

This commit is contained in:
Lewis Russell 2020-11-12 12:26:49 +00:00
parent eff38adedc
commit fd4a16253c
4 changed files with 59 additions and 1 deletions

View File

@ -62,6 +62,7 @@ require('gitsigns').setup {
['n <leader>hs'] = '<cmd>lua require"gitsigns".stage_hunk()<CR>',
['n <leader>hu'] = '<cmd>lua require"gitsigns".undo_stage_hunk()<CR>',
['n <leader>hr'] = '<cmd>lua require"gitsigns".reset_hunk()<CR>',
['n <leader>hp'] = '<cmd>lua require"gitsigns".preview_hunk()<CR>',
},
watch_index = {
interval = 1000
@ -89,7 +90,7 @@ set statusline+=%{get(b:,'gitsigns_status','')}
- [x] Add action for undoing a stage of a hunk
- [x] Add action for ~~undoing~~ reseting a hunk
- [ ] Add action for showing diff (or original text) in a floating window
- [x] Add action for showing diff (or original text) in a floating window
- [ ] Add ability to show staged hunks with different signs (maybe in a different sign column?)
- [x] Add support for repeat.vim
- [ ] Apply buffer updates incrementally

View File

@ -7,6 +7,7 @@ local default_config = require('gitsigns/defaults')
local mk_repeatable = require('gitsigns/repeat').mk_repeatable
local DB = require('gitsigns/debounce')
local apply_mappings = require('gitsigns/mappings')
local popup = require('gitsigns/popup')
local throttle_leading = DB.throttle_leading
local debounce_trailing = DB.debounce_trailing
@ -736,6 +737,24 @@ local function setup(cfg)
vim.cmd('autocmd ExitPre * lua require("gitsigns").detach_all()')
end
function preview_hunk()
local hunk = get_hunk()
if not hunk then
return
end
local winid, bufnr = popup.create(hunk.lines, { relative = 'cursor' })
vim.fn.nvim_buf_set_option(bufnr, 'filetype', 'diff')
vim.fn.nvim_win_set_option(winid, 'number', false)
vim.fn.nvim_win_set_option(winid, 'relativenumber', false)
end
function dump_cache()
print(vim.inspect(cache))
end
return {
update = update,
stage_hunk = mk_repeatable(stage_hunk),
@ -743,7 +762,9 @@ return {
reset_hunk = mk_repeatable(reset_hunk),
next_hunk = next_hunk,
prev_hunk = prev_hunk,
preview_hunk = preview_hunk,
attach = attach,
detach_all = detach_all,
setup = setup,
dump_cache = dump_cache
}

View File

@ -17,6 +17,7 @@ return {
['n <leader>hs'] = '<cmd>lua require"gitsigns".stage_hunk()<CR>',
['n <leader>hu'] = '<cmd>lua require"gitsigns".undo_stage_hunk()<CR>',
['n <leader>hr'] = '<cmd>lua require"gitsigns".reset_hunk()<CR>',
['n <leader>hp'] = '<cmd>lua require"gitsigns".preview_hunk()<CR>',
},
watch_index = {
interval = 1000

35
lua/gitsigns/popup.lua Normal file
View File

@ -0,0 +1,35 @@
local popup = {}
local api = vim.api
function popup.create(what, vim_options)
local bufnr = api.nvim_create_buf(false, true)
assert(bufnr, "Failed to create buffer")
api.nvim_buf_set_lines(bufnr, 0, -1, true, what)
local width = 0
for _, l in pairs(what) do
if #l > width then
width = #l
end
end
local win_id = api.nvim_open_win(bufnr, false, {
relative = vim_options.relative,
row = 0,
col = 0,
height = #what,
width = width
})
vim.lsp.util.close_preview_autocmd({'CursorMoved', 'CursorMovedI'}, win_id)
if vim_options.highlight then
api.nvim_win_set_option(win_id, 'winhl', string.format('Normal:%s', vim_options.highlight))
end
return win_id, bufnr
end
return popup