feat(git): add status diff tab binding
This commit is contained in:
@@ -6,20 +6,45 @@ local function open_git_status()
|
||||
vim.api.nvim_set_current_win(previous_win)
|
||||
end
|
||||
|
||||
local function get_git_status_win()
|
||||
local current_tabpage = vim.api.nvim_get_current_tabpage()
|
||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(current_tabpage)) do
|
||||
---@param buf integer
|
||||
---@return boolean
|
||||
local function is_git_status_buffer(buf)
|
||||
return vim.fn.getbufvar(buf, "fugitive_type") == "index"
|
||||
end
|
||||
|
||||
---@param tabpage integer?
|
||||
---@return integer?
|
||||
local function get_git_status_win(tabpage)
|
||||
tabpage = tabpage or vim.api.nvim_get_current_tabpage()
|
||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tabpage)) do
|
||||
local buf = vim.api.nvim_win_get_buf(win)
|
||||
local buftype = vim.api.nvim_get_option_value("buftype", { buf = buf })
|
||||
if
|
||||
buftype == "nowrite"
|
||||
and vim.api.nvim_buf_get_name(buf):match("^fugitive://.*%.git//$")
|
||||
then
|
||||
if is_git_status_buffer(buf) then
|
||||
return win
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function git_status_diffsplit()
|
||||
local status_win = vim.api.nvim_get_current_win()
|
||||
local ok, err = pcall(function()
|
||||
vim.api.nvim_win_call(status_win, function()
|
||||
vim.cmd("normal dv")
|
||||
end)
|
||||
end)
|
||||
if not ok then
|
||||
error(err, 0)
|
||||
end
|
||||
end
|
||||
|
||||
---@param args vim.api.keyset.create_autocmd.callback_args
|
||||
local function on_git_status(args)
|
||||
vim.keymap.set("n", "<Tab>", git_status_diffsplit, {
|
||||
buffer = args.buf,
|
||||
desc = "Open file diff without changing focus",
|
||||
silent = true,
|
||||
})
|
||||
end
|
||||
|
||||
local function toggle_git_status()
|
||||
local win = get_git_status_win()
|
||||
if win then
|
||||
@@ -35,6 +60,11 @@ vim.api.nvim_create_user_command(
|
||||
{ desc = "Toggle fugitive git status window" }
|
||||
)
|
||||
|
||||
vim.api.nvim_create_autocmd("User", {
|
||||
pattern = "FugitiveIndex",
|
||||
callback = on_git_status,
|
||||
})
|
||||
|
||||
vim.api.nvim_create_user_command("Glog", function(opts)
|
||||
local mods = opts.mods ~= "" and (opts.mods .. " ") or ""
|
||||
vim.cmd(
|
||||
|
||||
Reference in New Issue
Block a user