@@ -19,4 +19,116 @@ return {
1919 { " <leader>F" , mode = " n" , " <cmd>Fugit2<cr>" , desc = " Git UI (Fugit2)" },
2020 },
2121 },
22+
23+ {
24+ " lewis6991/gitsigns.nvim" ,
25+ opts = {
26+ signs = {
27+ add = { text = " " },
28+ change = { text = " " },
29+ delete = { text = " " },
30+ topdelete = { text = " ‾" },
31+ changedelete = { text = " ~" },
32+ },
33+ on_attach = function (bufnr )
34+ local gitsigns = require (" gitsigns" )
35+
36+ local function map (mode , l , r , opts )
37+ opts = opts or {}
38+ opts .buffer = bufnr
39+ vim .keymap .set (mode , l , r , opts )
40+ end
41+
42+ -- Navigation
43+ map (" n" , " <leader>g]c" , function ()
44+ if vim .wo .diff then
45+ vim .cmd .normal ({ " <leader>g]c" , bang = true })
46+ else
47+ gitsigns .nav_hunk (" next" )
48+ end
49+ end , { desc = " next git change" })
50+
51+ map (" n" , " <leader>g[c" , function ()
52+ if vim .wo .diff then
53+ vim .cmd .normal ({ " <leader>g[c" , bang = true })
54+ else
55+ gitsigns .nav_hunk (" prev" )
56+ end
57+ end , { desc = " previous git change" })
58+
59+ -- Actions
60+ -- visual mode
61+ map (" v" , " <leader>gss" , function ()
62+ gitsigns .stage_hunk ({ vim .fn .line (" ." ), vim .fn .line (" v" ) })
63+ end , { desc = " stage hunk" })
64+
65+ map (" v" , " <leader>grr" , function ()
66+ gitsigns .reset_hunk ({ vim .fn .line (" ." ), vim .fn .line (" v" ) })
67+ end , { desc = " reset hunk" })
68+
69+ -- normal mode
70+ map (" n" , " <leader>gs" , gitsigns .stage_hunk , { desc = " stage hunk" })
71+ map (" n" , " <leader>gr" , gitsigns .reset_hunk , { desc = " reset hunk" })
72+
73+ map (" n" , " <leader>gS" , gitsigns .stage_buffer , { desc = " stage buffer" })
74+ map (" n" , " <leader>gu" , gitsigns .undo_stage_hunk , { desc = " undo stage hunk" })
75+
76+ map (" n" , " <leader>gR" , gitsigns .reset_buffer , { desc = " reset buffer" })
77+ map (" n" , " <leader>gp" , gitsigns .preview_hunk , { desc = " preview hunk" })
78+ map (" n" , " <leader>gb" , gitsigns .blame_line , { desc = " blame line" })
79+
80+ map (" n" , " <leader>gd" , gitsigns .diffthis , { desc = " diff against index" })
81+
82+ map (" n" , " <leader>gD" , function ()
83+ gitsigns .diffthis (" @" )
84+ end , { desc = " diff against last commit" })
85+
86+ -- Toggles
87+
88+ map (" n" , " <leader>gt" , gitsigns .toggle_current_line_blame , { desc = " toggle blame line" })
89+
90+ map (" n" , " <leader>gD" , gitsigns .preview_hunk_inline , { desc = " show deleted inline" })
91+ end ,
92+ },
93+ },
94+
95+ {
96+ " ruifm/gitlinker.nvim" ,
97+ dependencies = " nvim-lua/plenary.nvim" ,
98+ config = function ()
99+ require (" gitlinker" ).setup ({
100+ opts = {
101+ add_current_line_on_normal_mode = true ,
102+ print_url = true ,
103+ action_callback = require (" gitlinker.actions" ).copy_to_clipboard ,
104+ },
105+ mappings = nil ,
106+ })
107+
108+ local linker = require (" gitlinker" )
109+ local actions = require (" gitlinker.actions" )
110+
111+ -- 1. Copy Link (Normal & Visual)
112+ vim .keymap .set (" n" , " <leader>gc" , function ()
113+ linker .get_buf_range_url (" n" )
114+ end , { desc = " Git: Copy link to clipboard" })
115+ vim .keymap .set (" v" , " <leader>gc" , function ()
116+ linker .get_buf_range_url (" v" )
117+ end , { desc = " Git: Copy link to clipboard" })
118+
119+ -- 2. Open in Browser (Normal & Visual)
120+ vim .keymap .set (" n" , " <leader>go" , function ()
121+ linker .get_buf_range_url (" n" , { action_callback = actions .open_in_browser })
122+ end , { desc = " Git: Open in browser" })
123+
124+ vim .keymap .set (" v" , " <leader>go" , function ()
125+ linker .get_buf_range_url (" v" , { action_callback = actions .open_in_browser })
126+ end , { desc = " Git: Open in browser" })
127+
128+ -- 3. Repo Homepage
129+ vim .keymap .set (" n" , " <leader>gg" , function ()
130+ linker .get_repo_url ()
131+ end , { desc = " Git: Copy repo homepage" })
132+ end ,
133+ },
22134}
0 commit comments