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