summary refs log tree commit diff
path: root/.vim/lua/internal/commit-preview.lua
blob: 512b3fbaaf980fc778e515a94fc1ec41cba1391f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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