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
|
local commit_preview = function()
local commit = vim.api.nvim_get_current_line():match([[ ([0-9a-f]+) ]])
local j = package.loaded.job.jobstart {
command = 'git',
args = { 'show', commit },
format_title = function(_, _) return 'commit preview' end,
populate_quickfix = false,
}
local result = j: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_buf_set_option(bufnr, 'filetype', 'git')
-- add lines
vim.api.nvim_buf_set_option(bufnr, 'modifiable', true)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, result)
vim.api.nvim_buf_set_option(bufnr, 'modifiable', false)
-- create window
local winpos = 'belowright'
local winheight = #result <= 25 and #result or 25
vim.cmd(string.format("%s %dsplit", winpos, winheight))
local winid = vim.api.nvim_get_current_win()
-- vim.cmd(string.format("buffer %d", bufnr))
vim.api.nvim_win_set_buf(winid, bufnr)
vim.cmd("wincmd p")
local close = function()
pcall(vim.api.nvim_win_close, winid, true)
pcall(vim.api.nvim_buf_delete, bufnr, { force = true })
end
-- close with q
vim.keymap.set('n', 'q', close, { buffer = bufnr })
-- close on CursorMoved
local old_cursor = vim.api.nvim_win_get_cursor(0)
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,
})
end
vim.keymap.set('n', 'cp', commit_preview, { buffer = 0 })
vim.keymap.set('n', '<leader>c', commit_preview, { buffer = 0 })
wk_register { ['<leader>c'] = {'preview commit'} }
|