diff options
Diffstat (limited to '.vim/after/ftplugin')
| -rw-r--r-- | .vim/after/ftplugin/gitrebase.lua | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/.vim/after/ftplugin/gitrebase.lua b/.vim/after/ftplugin/gitrebase.lua new file mode 100644 index 0000000..0e7ba20 --- /dev/null +++ b/.vim/after/ftplugin/gitrebase.lua @@ -0,0 +1,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'} } |