local commit_preview = function() local commit = vim.api.nvim_get_current_line():match([[ ([0-9a-f]+) ]]) local result = require('internal.job').jobstart({ command = 'git', args = { 'show', 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_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, desc = 'commit preview' }) vim.keymap.set('n', 'c', commit_preview, { buffer = 0, desc = 'commit preview' })