diff options
| author | Robert Günzler <r@gnzler.io> | 2024-05-15 09:00:31 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2024-05-15 09:00:31 +0200 |
| commit | 3dbe74f2eef627e2dc19b79fe06753d5dc09003f (patch) | |
| tree | b78d1cdab62cec9ed4bbe35447108547b935ef03 /.vim/lua/internal/commit-preview.lua | |
| parent | 0ab72c1113139c196115c974eadaded449002c32 (diff) | |
update nvim
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '')
| -rw-r--r-- | .vim/lua/internal/commit-preview.lua | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/.vim/lua/internal/commit-preview.lua b/.vim/lua/internal/commit-preview.lua new file mode 100644 index 0000000..512b3fb --- /dev/null +++ b/.vim/lua/internal/commit-preview.lua @@ -0,0 +1,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 |