feat(git): add in-house hunks module, replace gitsigns.nvim

This commit is contained in:
2026-05-20 06:10:17 +02:00
parent d979c961a2
commit f4181b89fc
13 changed files with 1055 additions and 75 deletions
+47 -13
View File
@@ -34,6 +34,12 @@ local DEFAULT_HIGHLIGHTS = {
GitUnmergedBothModified = "GitUnmerged",
GitUnmergedDeletedByThem = "GitUnmerged",
GitUnmergedDeletedByUs = "GitUnmerged",
GitHunkAdd = "Added",
GitHunkChange = "Changed",
GitHunkDelete = "Removed",
GitHunkAddLine = "DiffAdd",
GitHunkDeleteLine = "DiffDelete",
}
for name, link in pairs(DEFAULT_HIGHLIGHTS) do
vim.api.nvim_set_hl(0, name, { link = link, default = true })
@@ -45,6 +51,7 @@ vim.api.nvim_create_autocmd({ "BufReadPost", "BufNewFile" }, {
group = group,
callback = function(args)
require("git.core.repo").track(args.buf)
require("git.hunks").attach(args.buf)
end,
})
vim.api.nvim_create_autocmd({ "BufWritePost", "FileChangedShellPost" }, {
@@ -64,6 +71,7 @@ vim.api.nvim_create_autocmd({ "ShellCmdPost", "TermLeave", "FocusGained" }, {
vim.api.nvim_create_autocmd({ "BufDelete", "BufWipeout" }, {
group = group,
callback = function(args)
require("git.hunks").detach(args.buf)
require("git.core.repo").unbind(args.buf)
end,
})
@@ -138,7 +146,7 @@ vim.api.nvim_create_user_command("Gdiffsplit", function(opts)
mods = { vertical = false }
rev_idx = 2
end
require("git.diff").split({ target = fargs[rev_idx], mods = mods })
require("git.diffsplit").open({ target = fargs[rev_idx], mods = mods })
end, {
nargs = "*",
complete = function(arg_lead, cmd_line, _)
@@ -199,24 +207,24 @@ vim.keymap.set("n", "<Plug>(git-edit)", function()
})
end, { silent = true, desc = "Edit a git object" })
vim.keymap.set("n", "<Plug>(git-diff-vertical)", function()
require("git.diff").split({ mods = { vertical = true } })
end, { silent = true, desc = "Diff against index (vertical)" })
vim.keymap.set("n", "<Plug>(git-diff-horizontal)", function()
require("git.diff").split({ mods = { vertical = false } })
end, { silent = true, desc = "Diff against index (horizontal)" })
vim.keymap.set("n", "<Plug>(git-diff-vertical-head)", function()
require("git.diff").split({
vim.keymap.set("n", "<Plug>(git-diffsplit-vertical)", function()
require("git.diffsplit").open({ mods = { vertical = true } })
end, { silent = true, desc = "Open a diff split against index (vertical)" })
vim.keymap.set("n", "<Plug>(git-diffsplit-horizontal)", function()
require("git.diffsplit").open({ mods = { vertical = false } })
end, { silent = true, desc = "Open a diff split against index (horizontal)" })
vim.keymap.set("n", "<Plug>(git-diffsplit-vertical-head)", function()
require("git.diffsplit").open({
target = "HEAD",
mods = { vertical = true },
})
end, { silent = true, desc = "Diff against HEAD (vertical)" })
vim.keymap.set("n", "<Plug>(git-diff-horizontal-head)", function()
require("git.diff").split({
end, { silent = true, desc = "Open a diff split against HEAD (vertical)" })
vim.keymap.set("n", "<Plug>(git-diffsplit-horizontal-head)", function()
require("git.diffsplit").open({
target = "HEAD",
mods = { vertical = false },
})
end, { silent = true, desc = "Diff against HEAD (horizontal)" })
end, { silent = true, desc = "Open a diff split against HEAD (horizontal)" })
vim.keymap.set("n", "<Plug>(git-status-open)", function()
require("git.status_view").open()
@@ -245,3 +253,29 @@ if vim.g.git_statusline ~= false then
end,
})
end
vim.keymap.set({ "n", "x" }, "<Plug>(git-hunk-next)", function()
require("git.hunks").nav("next")
end, { silent = true, desc = "Jump to next git hunk" })
vim.keymap.set({ "n", "x" }, "<Plug>(git-hunk-prev)", function()
require("git.hunks").nav("prev")
end, { silent = true, desc = "Jump to previous git hunk" })
vim.keymap.set("n", "<Plug>(git-hunk-stage)", function()
require("git.hunks").stage_hunk()
end, { silent = true, desc = "Stage hunk under cursor" })
vim.keymap.set("n", "<Plug>(git-hunk-reset)", function()
require("git.hunks").reset_hunk()
end, { silent = true, desc = "Reset hunk under cursor" })
vim.keymap.set("n", "<Plug>(git-hunk-preview)", function()
require("git.hunks").preview_hunk()
end, { silent = true, desc = "Preview hunk under cursor" })
vim.keymap.set("n", "<Plug>(git-hunk-select)", function()
require("git.hunks").select_hunk()
end, { silent = true, desc = "Select hunk under cursor" })
vim.keymap.set("n", "<Plug>(git-overlay-toggle)", function()
require("git.hunks").toggle_overlay()
end, { silent = true, desc = "Toggle the git diff overlay" })
vim.api.nvim_create_user_command("GitDiffOverlay", function()
require("git.hunks").toggle_overlay()
end, { desc = "Toggle the git diff overlay in the current buffer" })