summary refs log tree commit diff
path: root/.vim
diff options
context:
space:
mode:
Diffstat (limited to '.vim')
-rw-r--r--.vim/after/ftplugin/gitrebase.lua57
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'} }