summary refs log tree commit diff
path: root/.vim/after/ftplugin/gitrebase.lua
blob: 50684f42738a5112a4be809794cc1ad8f97205b1 (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
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', '<leader>c', commit_preview, { buffer = 0, desc = 'commit preview' })