feat(git): show staged hunks in the gutter with a stage toggle
This commit is contained in:
+38
-3
@@ -41,12 +41,47 @@ local DEFAULT_HIGHLIGHTS = {
|
||||
GitHunkAddLine = "DiffAdd",
|
||||
GitHunkDeleteLine = "DiffDelete",
|
||||
}
|
||||
for name, link in pairs(DEFAULT_HIGHLIGHTS) do
|
||||
vim.api.nvim_set_hl(0, name, { link = link, default = true })
|
||||
local STAGED_HUNK_HL = {
|
||||
GitHunkStagedAdded = "GitHunkAdded",
|
||||
GitHunkStagedChanged = "GitHunkChanged",
|
||||
GitHunkStagedRemoved = "GitHunkRemoved",
|
||||
}
|
||||
|
||||
local function blend(a, b, t)
|
||||
local function mix(shift)
|
||||
local x = bit.band(bit.rshift(a, shift), 0xff)
|
||||
local y = bit.band(bit.rshift(b, shift), 0xff)
|
||||
return bit.lshift(math.floor(x + (y - x) * t + 0.5), shift)
|
||||
end
|
||||
return mix(16) + mix(8) + mix(0)
|
||||
end
|
||||
|
||||
local function apply_highlights()
|
||||
for name, link in pairs(DEFAULT_HIGHLIGHTS) do
|
||||
vim.api.nvim_set_hl(0, name, { link = link, default = true })
|
||||
end
|
||||
local bg = vim.api.nvim_get_hl(0, { name = "Normal" }).bg or 0x000000
|
||||
for name, base in pairs(STAGED_HUNK_HL) do
|
||||
local src = vim.api.nvim_get_hl(0, { name = base, link = false })
|
||||
local hl = {}
|
||||
if src.fg then
|
||||
hl.fg = blend(src.fg, bg, 0.45)
|
||||
end
|
||||
if src.bg then
|
||||
hl.bg = blend(src.bg, bg, 0.45)
|
||||
end
|
||||
vim.api.nvim_set_hl(0, name, hl)
|
||||
end
|
||||
end
|
||||
apply_highlights()
|
||||
|
||||
local group = vim.api.nvim_create_augroup("ow.git", { clear = true })
|
||||
|
||||
vim.api.nvim_create_autocmd("ColorScheme", {
|
||||
group = group,
|
||||
callback = apply_highlights,
|
||||
})
|
||||
|
||||
vim.api.nvim_create_autocmd({ "BufReadPost", "BufNewFile" }, {
|
||||
group = group,
|
||||
callback = function(args)
|
||||
@@ -262,7 +297,7 @@ vim.keymap.set({ "n", "x" }, "<Plug>(git-hunk-prev)", function()
|
||||
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" })
|
||||
end, { silent = true, desc = "Stage or unstage the 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" })
|
||||
|
||||
Reference in New Issue
Block a user