@@ -255,6 +255,58 @@ require('lazy').setup({
255255 topdelete = { text = ' ‾' },
256256 changedelete = { text = ' ~' },
257257 },
258+ on_attach = function (bufnr )
259+ local gs = package.loaded .gitsigns
260+
261+ local function map (mode , l , r , opts )
262+ opts = opts or {}
263+ opts .buffer = bufnr
264+ vim .keymap .set (mode , l , r , opts )
265+ end
266+
267+ -- Navigation
268+ map ({ ' n' , ' v' }, ' ]c' , function ()
269+ if vim .wo .diff then
270+ return ' ]c'
271+ end
272+ vim .schedule (gs .next_hunk )
273+ return ' <Ignore>'
274+ end , { expr = true , desc = ' Jump to next git [c]hange' })
275+
276+ map ({ ' n' , ' v' }, ' [c' , function ()
277+ if vim .wo .diff then
278+ return ' [c'
279+ end
280+ vim .schedule (gs .prev_hunk )
281+ return ' <Ignore>'
282+ end , { expr = true , desc = ' Jump to previous git [c]hange' })
283+
284+ -- Actions
285+ -- visual mode
286+ map (' v' , ' <leader>hs' , function ()
287+ gs .stage_hunk { vim .fn .line ' .' , vim .fn .line ' v' }
288+ end , { desc = ' stage git hunk' })
289+ map (' v' , ' <leader>hr' , function ()
290+ gs .reset_hunk { vim .fn .line ' .' , vim .fn .line ' v' }
291+ end , { desc = ' reset git hunk' })
292+ -- normal mode
293+ map (' n' , ' <leader>hs' , gs .stage_hunk , { desc = ' git [s]tage hunk' })
294+ map (' n' , ' <leader>hr' , gs .reset_hunk , { desc = ' git [r]eset hunk' })
295+ map (' n' , ' <leader>hS' , gs .stage_buffer , { desc = ' git [S]tage buffer' })
296+ map (' n' , ' <leader>hu' , gs .undo_stage_hunk , { desc = ' git [u]ndo stage hunk' })
297+ map (' n' , ' <leader>hR' , gs .reset_buffer , { desc = ' git [R]eset buffer' })
298+ map (' n' , ' <leader>hp' , gs .preview_hunk , { desc = ' git [p]review hunk' })
299+ map (' n' , ' <leader>hb' , function ()
300+ gs .blame_line { full = false }
301+ end , { desc = ' git [b]lame line' })
302+ map (' n' , ' <leader>hd' , gs .diffthis , { desc = ' git [d]iff against index' })
303+ map (' n' , ' <leader>hD' , function ()
304+ gs .diffthis ' @'
305+ end , { desc = ' git [D]iff against last commit' })
306+ -- Toggles
307+ map (' n' , ' <leader>tb' , gs .toggle_current_line_blame , { desc = ' [T]oggle git show [b]lame line' })
308+ map (' n' , ' <leader>td' , gs .toggle_deleted , { desc = ' [T]oggle git show [d]eleted' })
309+ end ,
258310 },
259311 },
260312
@@ -286,7 +338,13 @@ require('lazy').setup({
286338 [' <leader>r' ] = { name = ' [R]ename' , _ = ' which_key_ignore' },
287339 [' <leader>s' ] = { name = ' [S]earch' , _ = ' which_key_ignore' },
288340 [' <leader>w' ] = { name = ' [W]orkspace' , _ = ' which_key_ignore' },
341+ [' <leader>h' ] = { name = ' Git [H]unk' , _ = ' which_key_ignore' },
342+ [' <leader>t' ] = { name = ' [T]oggle' , _ = ' which_key_ignore' },
289343 }
344+ -- visual mode
345+ require (' which-key' ).register ({
346+ [' <leader>h' ] = { ' Git [H]unk' },
347+ }, { mode = ' v' })
290348 end ,
291349 },
292350
0 commit comments