1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
local M = {}
function M.under_cursor()
require('internal.cursor').word(require('internal.commit-preview').commit_preview)
end
function M.commit_preview(commit, on_attach)
if not commit then return end
local result = require('internal.job')
.jobstart({
command = 'git',
args = { 'show', '--stat', '--patch', commit },
format_title = function(_, _)
return 'git-show'
end,
populate_quickfix = false,
})
:wait()
:result()
-- create buffer
local bufnr = vim.api.nvim_create_buf(false, true)
assert(bufnr, 'Failed to create buffer')
vim.api.nvim_buf_set_name(bufnr, commit)
vim.api.nvim_set_option_value('filetype', 'commitpreview', { buf = bufnr })
-- add lines
vim.api.nvim_set_option_value('modifiable', true, { buf = bufnr })
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, result)
vim.api.nvim_set_option_value('modifiable', false, { buf = bufnr })
-- create window
local winpos = 'belowright'
local winheight = #result <= 25 and #result or 25
vim.cmd(string.format('%s %dsplit', winpos, winheight)) -- open split
local winid = vim.api.nvim_get_current_win()
vim.api.nvim_win_set_buf(winid, bufnr)
vim.cmd('wincmd p')
vim.keymap.set('n', 'gd', M.under_cursor, { buffer = bufnr })
vim.keymap.set('n', 'q', function() vim.api.nvim_win_close(winid, true) end, { buffer = bufnr })
if on_attach then on_attach(bufnr, winid) end
-- close on CursorMoved (anywhere but git-show-buf)
-- local old_cursor = vim.api.nvim_win_get_cursor(beforewin)
-- local group = vim.api.nvim_create_augroup('gitcommit_win_' .. winid, {})
-- vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
-- group = group,
-- callback = function()
-- local cursor = vim.api.nvim_win_get_cursor(0)
-- if
-- (old_cursor[1] ~= cursor[1] or old_cursor[2] ~= cursor[2])
-- and vim.api.nvim_get_current_win() ~= winid
-- then
-- close()
-- return
-- end
-- old_cursor = cursor
-- end,
-- })
-- focus
vim.api.nvim_set_current_win(winid)
end
return M
|