refactor(git): unify diff/object dispatch, codify naming, add :Gdiffsplit
This commit is contained in:
+42
-47
@@ -1,4 +1,10 @@
|
||||
local cmd = require("git.cmd")
|
||||
local commit = require("git.commit")
|
||||
local diff = require("git.diff")
|
||||
local log = require("git.log")
|
||||
local object = require("git.object")
|
||||
local repo = require("git.repo")
|
||||
local sidebar = require("git.sidebar")
|
||||
|
||||
local HIGHLIGHTS = {
|
||||
GitDeleted = "Removed",
|
||||
@@ -25,38 +31,6 @@ function M.head(path)
|
||||
return repo.head(path)
|
||||
end
|
||||
|
||||
---@class ow.Git.NewScratchOpts
|
||||
---@field name string?
|
||||
---@field bufhidden ("hide"|"wipe")? defaults to "hide"
|
||||
---@field split (false|"above"|"below"|"left"|"right")? defaults to splitbelow-aware horizontal. `false` places the buffer in the current window (drops a `'` mark first so the user can jump back).
|
||||
|
||||
---Create a fresh non-modifiable scratch buffer and place it. Default split
|
||||
---direction is horizontal, honouring `splitbelow`. Caller flips
|
||||
---`modifiable`, fills the buffer, and sets `filetype` once content lands.
|
||||
---@param opts ow.Git.NewScratchOpts?
|
||||
---@return integer buf
|
||||
---@return integer win
|
||||
function M.new_scratch(opts)
|
||||
opts = opts or {}
|
||||
local buf = vim.api.nvim_create_buf(false, true)
|
||||
vim.bo[buf].buftype = "nofile"
|
||||
vim.bo[buf].bufhidden = opts.bufhidden or "hide"
|
||||
vim.bo[buf].swapfile = false
|
||||
vim.bo[buf].modifiable = false
|
||||
vim.bo[buf].modified = false
|
||||
if opts.name then
|
||||
pcall(vim.api.nvim_buf_set_name, buf, opts.name)
|
||||
end
|
||||
if opts.split == false then
|
||||
vim.cmd.normal({ "m'", bang = true })
|
||||
vim.api.nvim_set_current_buf(buf)
|
||||
return buf, vim.api.nvim_get_current_win()
|
||||
end
|
||||
local split = opts.split or (vim.o.splitbelow and "below" or "above")
|
||||
local win = vim.api.nvim_open_win(buf, true, { split = split })
|
||||
return buf, win
|
||||
end
|
||||
|
||||
function M.setup()
|
||||
for name, link in pairs(HIGHLIGHTS) do
|
||||
vim.api.nvim_set_hl(0, name, { link = link, default = true })
|
||||
@@ -73,7 +47,7 @@ function M.setup()
|
||||
pattern = "git://*",
|
||||
group = group,
|
||||
callback = function(args)
|
||||
require("git.diff").read_uri(args.buf)
|
||||
object.read_uri(args.buf)
|
||||
end,
|
||||
})
|
||||
vim.api.nvim_create_autocmd(
|
||||
@@ -104,34 +78,55 @@ function M.setup()
|
||||
end,
|
||||
})
|
||||
|
||||
vim.keymap.set("n", "<leader>gg", function()
|
||||
require("git.sidebar").toggle()
|
||||
end, { desc = "Toggle git status sidebar" })
|
||||
vim.keymap.set("n", "<leader>gl", function()
|
||||
require("git.log").show()
|
||||
end, { desc = "Show git log" })
|
||||
vim.keymap.set(
|
||||
"n",
|
||||
"<leader>gg",
|
||||
sidebar.toggle,
|
||||
{ desc = "Toggle git status sidebar" }
|
||||
)
|
||||
vim.keymap.set("n", "<leader>gl", log.show, { desc = "Show git log" })
|
||||
vim.keymap.set("n", "<leader>gd", function()
|
||||
require("git.diff").split({ ref = "", vertical = true })
|
||||
diff.split({ revspec = "", vertical = true })
|
||||
end, { desc = "Diff index vs worktree (vsplit)" })
|
||||
vim.keymap.set("n", "<leader>gD", function()
|
||||
require("git.diff").split({ ref = "HEAD", vertical = true })
|
||||
diff.split({ revspec = "HEAD", vertical = true })
|
||||
end, { desc = "Diff HEAD vs worktree (vsplit)" })
|
||||
vim.keymap.set("n", "<leader>gh", function()
|
||||
require("git.diff").split({ ref = "", vertical = false })
|
||||
diff.split({ revspec = "", vertical = false })
|
||||
end, { desc = "Diff index vs worktree (split)" })
|
||||
vim.keymap.set("n", "<leader>gH", function()
|
||||
require("git.diff").split({ ref = "HEAD", vertical = false })
|
||||
diff.split({ revspec = "HEAD", vertical = false })
|
||||
end, { desc = "Diff HEAD vs worktree (split)" })
|
||||
vim.keymap.set("n", "<leader>gc", function()
|
||||
require("git.commit").commit()
|
||||
commit.commit()
|
||||
end, { desc = "Git commit" })
|
||||
vim.keymap.set("n", "<leader>ga", function()
|
||||
require("git.commit").commit({ amend = true })
|
||||
commit.commit({ amend = true })
|
||||
end, { desc = "Git commit --amend" })
|
||||
vim.keymap.set("n", "<leader>gp", function()
|
||||
require("git.cmd").run({ "push" })
|
||||
cmd.run({ "push" })
|
||||
end, { desc = "Git push" })
|
||||
require("git.cmd").setup()
|
||||
|
||||
local function diff_split_cmd(vertical)
|
||||
return function(opts)
|
||||
diff.split({
|
||||
revspec = opts.args,
|
||||
vertical = vertical,
|
||||
})
|
||||
end
|
||||
end
|
||||
vim.api.nvim_create_user_command(
|
||||
"Gdiffsplit",
|
||||
diff_split_cmd(true),
|
||||
{ nargs = "?", desc = "Diff against <revspec> (vsplit)" }
|
||||
)
|
||||
vim.api.nvim_create_user_command(
|
||||
"Ghdiffsplit",
|
||||
diff_split_cmd(false),
|
||||
{ nargs = "?", desc = "Diff against <revspec> (split)" }
|
||||
)
|
||||
|
||||
cmd.setup()
|
||||
end
|
||||
|
||||
return M
|
||||
|
||||
Reference in New Issue
Block a user