From 861948efe977086cde9fe7da1dbeee696321eac2 Mon Sep 17 00:00:00 2001 From: xfy Date: Fri, 5 Jun 2026 13:58:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(git):=20=E6=96=B0=E5=A2=9E=20ghr?= =?UTF-8?q?=20=E9=87=8D=E7=BD=AE=E5=BD=93=E5=89=8D=20hunk=20=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/plugins/git.lua | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lua/plugins/git.lua b/lua/plugins/git.lua index 2a430d3..52c4ab0 100644 --- a/lua/plugins/git.lua +++ b/lua/plugins/git.lua @@ -198,6 +198,39 @@ vim.keymap.set("n", "ghp", preview_hunk, { desc = "预览 hunk" }) -- ghb — 查看当前行 blame vim.keymap.set("n", "ghb", blame_line, { desc = "Blame 当前行" }) +-- ghr — 重置当前 hunk(恢复为 HEAD 版本) +vim.keymap.set("n", "ghr", function() + local hunk, ref_text = get_cursor_hunk() + if not hunk then + vim.notify("光标不在变更区域", vim.log.levels.WARN) + return + end + + local buf = vim.api.nvim_get_current_buf() + local ref_lines = vim.split(ref_text or "", "\n") + + if hunk.type == "add" then + -- 新增型 hunk:删除这些行 + vim.api.nvim_buf_set_lines(buf, hunk.buf_start - 1, hunk.buf_start + hunk.buf_count - 1, false, {}) + elseif hunk.type == "delete" then + -- 删除型 hunk:插入被删除的内容 + local lines_to_insert = {} + for i = hunk.ref_start, hunk.ref_start + hunk.ref_count - 1 do + table.insert(lines_to_insert, ref_lines[i] or "") + end + vim.api.nvim_buf_set_lines(buf, hunk.buf_start - 1, hunk.buf_start - 1, false, lines_to_insert) + else + -- 修改型 hunk:用参考版本替换 + local lines_to_replace = {} + for i = hunk.ref_start, hunk.ref_start + hunk.ref_count - 1 do + table.insert(lines_to_replace, ref_lines[i] or "") + end + vim.api.nvim_buf_set_lines(buf, hunk.buf_start - 1, hunk.buf_start + hunk.buf_count - 1, false, lines_to_replace) + end + + vim.notify("已重置 hunk", vim.log.levels.INFO) +end, { desc = "重置 hunk" }) + -- gg — 在新标签页中打开 Fugitive 全屏 lazy.on_keys("fugitive", "gg", "n", load_fugitive, function() vim.cmd("Git")