nvim/.config/nvim/lua/plugins/editor/gitsigns.lua

-- nvim/.config/nvim/lua/plugins/editor/gitsigns.lua

return {
  "lewis6991/gitsigns.nvim",
  event = { "BufReadPre", "BufNewFile" },
  opts = {
    signs = {
      add          = { text = "▎" },
      change       = { text = "▎" },
      delete       = { text = "" },
      topdelete    = { text = "" },
      changedelete = { text = "▎" },
      untracked    = { text = "▎" },
    },
    signcolumn = true,
    numhl      = false,
    current_line_blame = false,
    current_line_blame_opts = { virt_text_pos = "eol", delay = 500 },
    preview_config = { border = "rounded" },
    on_attach = function(bufnr)
      local gs = require("gitsigns")
      local function map(mode, lhs, rhs, desc)
        vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc })
      end

      map("n", "]h", function()
        if vim.wo.diff then return "]h" end
        vim.schedule(gs.next_hunk); return "<Ignore>"
      end, "next hunk")
      map("n", "[h", function()
        if vim.wo.diff then return "[h" end
        vim.schedule(gs.prev_hunk); return "<Ignore>"
      end, "prev hunk")

      map({ "n", "v" }, "<leader>ghs", ":Gitsigns stage_hunk<CR>",  "stage hunk")
      map({ "n", "v" }, "<leader>ghr", ":Gitsigns reset_hunk<CR>",  "reset hunk")
      map("n", "<leader>ghS", gs.stage_buffer,                       "stage buffer")
      map("n", "<leader>ghu", gs.undo_stage_hunk,                    "undo stage")
      map("n", "<leader>ghR", gs.reset_buffer,                       "reset buffer")
      map("n", "<leader>ghp", gs.preview_hunk,                       "preview hunk")
      map("n", "<leader>ghb", function() gs.blame_line({ full = true }) end, "blame line")
      map("n", "<leader>ghB", gs.toggle_current_line_blame,          "toggle line blame")
      map("n", "<leader>ghd", gs.diffthis,                           "diff this")
      map("n", "<leader>ghD", function() gs.diffthis("~") end,       "diff this ~")
      map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>",      "select hunk")
    end,
  },
}