133 lines
3.8 KiB
Lua
133 lines
3.8 KiB
Lua
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",
|
|
GitIgnored = "Comment",
|
|
GitUnstaged = "Changed",
|
|
GitRenamed = "GitStaged",
|
|
GitSha = "Identifier",
|
|
GitStaged = "Constant",
|
|
GitUnmerged = "Todo",
|
|
GitUnpulled = "Removed",
|
|
GitUnpushed = "Added",
|
|
GitUntracked = "Added",
|
|
}
|
|
|
|
local M = {}
|
|
|
|
function M.status()
|
|
return vim.b.git_status or ""
|
|
end
|
|
|
|
---@param path string
|
|
---@return string?
|
|
function M.head(path)
|
|
return repo.head(path)
|
|
end
|
|
|
|
function M.setup()
|
|
for name, link in pairs(HIGHLIGHTS) do
|
|
vim.api.nvim_set_hl(0, name, { link = link, default = true })
|
|
end
|
|
local group = vim.api.nvim_create_augroup("ow.git", { clear = true })
|
|
vim.api.nvim_create_autocmd("BufReadCmd", {
|
|
pattern = "git://*",
|
|
group = group,
|
|
callback = function(args)
|
|
object.read_uri(args.buf)
|
|
end,
|
|
})
|
|
vim.api.nvim_create_autocmd("BufReadCmd", {
|
|
pattern = "gitlog://*",
|
|
group = group,
|
|
callback = function(args)
|
|
log.read_uri(args.buf)
|
|
end,
|
|
})
|
|
vim.api.nvim_create_autocmd(
|
|
{ "BufReadPost", "BufNewFile", "BufWritePost", "FileChangedShellPost" },
|
|
{
|
|
group = group,
|
|
callback = function(args)
|
|
repo.refresh_buf(args.buf)
|
|
end,
|
|
}
|
|
)
|
|
vim.api.nvim_create_autocmd({ "BufDelete", "BufWipeout" }, {
|
|
group = group,
|
|
callback = function(args)
|
|
repo.unregister(args.buf)
|
|
end,
|
|
})
|
|
vim.api.nvim_create_autocmd("FocusGained", {
|
|
group = group,
|
|
callback = function()
|
|
repo.refresh_buf(vim.api.nvim_get_current_buf())
|
|
end,
|
|
})
|
|
vim.api.nvim_create_autocmd("VimLeavePre", {
|
|
group = group,
|
|
callback = function()
|
|
repo.stop_all()
|
|
end,
|
|
})
|
|
|
|
vim.keymap.set(
|
|
"n",
|
|
"<leader>gg",
|
|
sidebar.toggle,
|
|
{ desc = "Toggle git status sidebar" }
|
|
)
|
|
vim.keymap.set("n", "<leader>gl", log.open, { desc = "Show git log" })
|
|
vim.keymap.set("n", "<leader>gd", function()
|
|
diff.split({ revspec = "", vertical = true })
|
|
end, { desc = "Diff index vs worktree (vsplit)" })
|
|
vim.keymap.set("n", "<leader>gD", function()
|
|
diff.split({ revspec = "HEAD", vertical = true })
|
|
end, { desc = "Diff HEAD vs worktree (vsplit)" })
|
|
vim.keymap.set("n", "<leader>gh", function()
|
|
diff.split({ revspec = "", vertical = false })
|
|
end, { desc = "Diff index vs worktree (split)" })
|
|
vim.keymap.set("n", "<leader>gH", function()
|
|
diff.split({ revspec = "HEAD", vertical = false })
|
|
end, { desc = "Diff HEAD vs worktree (split)" })
|
|
vim.keymap.set("n", "<leader>gc", function()
|
|
commit.commit()
|
|
end, { desc = "Git commit" })
|
|
vim.keymap.set("n", "<leader>ga", function()
|
|
commit.commit({ amend = true })
|
|
end, { desc = "Git commit --amend" })
|
|
vim.keymap.set("n", "<leader>gp", function()
|
|
cmd.run({ "push" })
|
|
end, { desc = "Git push" })
|
|
|
|
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
|