aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/home/.config/nvim/lua/plugins/git.lua
blob: b052c330083dcf40e5f984ebbef8733f96b8667c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
require("git-conflict").setup({
  disable_diagnostics = true,
  default_mappings = {
    next = "]x",
    prev = "[x",
  },
})

require("neogit").setup({
  disable_commit_confirmation = true,
  kind = "split",
  console_timeout = 5000,
  auto_show_console = false,
})

vim.keymap.set("n", "<leader>go", function()
  require("neogit").open()
end, { desc = "neo[G]it [O]pen" })

require("gitlinker").setup({
  callbacks = {
    ["git.sommerfeld.dev"] = function(url_data)
      local url = require("gitlinker.hosts").get_base_https_url(url_data)
      url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev
      if url_data.lstart then
        url = url .. "#n" .. url_data.lstart
      end
      return url
    end,
  },
})

vim.keymap.set("n", "<leader>gy", function()
  require("gitlinker").get_buf_range_url("n")
end)
vim.keymap.set("v", "<leader>gy", function()
  require("gitlinker").get_buf_range_url("v")
end)

require("gitsigns").setup({
  signs = {
    change = { show_count = true },
    delete = { show_count = true },
    topdelete = { show_count = true },
    changedelete = { show_count = true },
  },
  numhl = true,
  on_attach = function(bufnr)
    local gs = require("gitsigns")
    local function map(mode, l, r, desc)
      vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc })
    end
    local function nmap(l, r, desc)
      map("n", l, r, desc)
    end
    local function vmap(l, r, desc)
      map("v", l, r, desc)
    end
    -- Navigation
    nmap("]c", function()
      if vim.wo.diff then
        vim.cmd.normal({ "]c", bang = true })
      else
        gs.nav_hunk("next")
      end
    end, "Jump to next git [c]hange")

    nmap("[c", function()
      if vim.wo.diff then
        vim.cmd.normal({ "[c", bang = true })
      else
        gs.nav_hunk("prev")
      end
    end, "Jump to previous git [c]hange")

    -- Actions
    nmap("<leader>hs", gs.stage_hunk, "git [s]tage hunk")
    nmap("<leader>hr", gs.reset_hunk, "git [r]eset hunk")
    vmap("<leader>hs", function()
      gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") })
    end, "git [s]tage hunk")
    vmap("<leader>hr", function()
      gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") })
    end, "git [r]eset hunk")
    nmap("<leader>hS", gs.stage_buffer, "git [S]tage buffer")
    nmap("<leader>hR", gs.reset_buffer, "git [R]eset buffer")
    nmap("<leader>hp", gs.preview_hunk, "git [p]review hunk")
    nmap("<leader>hb", function()
      gs.blame_line({ full = true })
    end, "git [b]lame line")
    nmap(
      "<leader>tb",
      gs.toggle_current_line_blame,
      "[T]oggle git show [b]lame line"
    )
    nmap("<leader>hd", gs.diffthis, "git [d]iff against index")
    nmap("<leader>hD", function()
      gs.diffthis("~")
    end, "git [D]iff against last commit")
    nmap("<leader>hc", gs.change_base, "git [C]hange base to index")
    nmap("<leader>hC", function()
      gs.change_base("~")
    end, "git [C]hange base to HEAD")
    nmap(
      "<leader>tgd",
      gs.preview_hunk_inline,
      "[T]oggle [G]it show [D]eleted"
    )
    nmap("<leader>tgw", gs.toggle_word_diff, "[T]oggle [G]it [W]ord diff")
    nmap(
      "<leader>tgl",
      gs.toggle_linehl,
      "[T]oggle [G]it [L]ine highlighting"
    )
    -- Text object
    map(
      { "o", "x" },
      "ih",
      ":<C-U>Gitsigns select_hunk<CR>",
      "git [H]unk text object"
    )
  end,
})