-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathdiff_tab.lua
More file actions
66 lines (62 loc) · 2.15 KB
/
diff_tab.lua
File metadata and controls
66 lines (62 loc) · 2.15 KB
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
local M = {}
M.__diff_tab = nil
function M.close_diff_tab()
if M.__diff_tab and vim.api.nvim_tabpage_is_valid(M.__diff_tab) then
pcall(vim.api.nvim_del_augroup_by_name, 'OpencodeDiffCleanup' .. M.__diff_tab)
local windows = vim.api.nvim_tabpage_list_wins(M.__diff_tab)
local buffers = {}
for _, win in ipairs(windows) do
local buf = vim.api.nvim_win_get_buf(win)
table.insert(buffers, buf)
end
vim.api.nvim_set_current_tabpage(M.__diff_tab)
pcall(vim.cmd, 'tabclose')
for _, buf in ipairs(buffers) do
if vim.api.nvim_buf_is_valid(buf) then
local visible = false
for _, win in ipairs(vim.api.nvim_list_wins()) do
if vim.api.nvim_win_get_buf(win) == buf then
visible = true
break
end
end
if not visible then
pcall(vim.api.nvim_buf_delete, buf, { force = true })
end
end
end
end
M.__diff_tab = nil
end
function M.open_diff_tab(file_path, snapshot_path, file_type)
M.close_diff_tab()
local is_local_file = vim.startswith(file_path, vim.fn.getcwd() .. '/')
file_type = file_type or vim.fn.fnamemodify(file_path, ':e')
vim.cmd('tabnew')
M.__diff_tab = vim.api.nvim_get_current_tabpage()
if snapshot_path then
vim.cmd('edit ' .. vim.fn.fnameescape(snapshot_path))
vim.cmd('setlocal readonly buftype=nofile nomodifiable')
vim.cmd('setlocal filetype=' .. file_type)
vim.cmd('diffthis')
vim.cmd('vsplit ' .. vim.fn.fnameescape(file_path))
vim.cmd('diffthis')
if not is_local_file then
vim.cmd('setlocal readonly buftype=nofile nomodifiable')
vim.cmd('setlocal filetype=' .. file_type)
end
else
vim.cmd('edit ' .. vim.fn.fnameescape(file_path))
vim.cmd('setlocal filetype=' .. file_type)
end
local augroup = vim.api.nvim_create_augroup('OpencodeGitDiffCleanup' .. M.__diff_tab, { clear = true })
local tab_windows = vim.api.nvim_tabpage_list_wins(M.__diff_tab)
vim.api.nvim_create_autocmd('WinClosed', {
group = augroup,
pattern = tostring(tab_windows[1]) .. ',' .. tostring(tab_windows[2]),
callback = function()
M.close_diff_tab()
end,
})
end
return M