summary refs log tree commit diff
path: root/.vim/lua/internal/commit-preview.lua
diff options
context:
space:
mode:
Diffstat (limited to '.vim/lua/internal/commit-preview.lua')
-rw-r--r--.vim/lua/internal/commit-preview.lua67
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