@@ -126,28 +126,64 @@ require('lazy').setup({
126126        changedelete  =  { text  =  ' ~'  
127127      },
128128      on_attach  =  function (bufnr )
129-         vim .keymap .set (' n' ' <leader>hp' require (' gitsigns' preview_hunk , { buffer  =  bufnr , desc  =  ' Preview git hunk'  
130- 
131-         --  don't override the built-in and fugitive keymaps
132129        local  gs  =  package.loaded .gitsigns 
133-         vim .keymap .set ({ ' n' ' v'  ' ]c' function ()
130+ 
131+         local  function  map (mode , l , r , opts )
132+           opts  =  opts  or  {}
133+           opts .buffer  =  bufnr 
134+           vim .keymap .set (mode , l , r , opts )
135+         end 
136+ 
137+         --  Navigation
138+         map ({ ' n' ' v'  ' ]c' function ()
134139          if  vim .wo .diff  then 
135140            return  ' ]c' 
136141          end 
137142          vim .schedule (function ()
138143            gs .next_hunk ()
139144          end )
140145          return  ' <Ignore>' 
141-         end , { expr  =  true , buffer  =  bufnr , desc  =  ' Jump to next hunk'  
142-         vim .keymap .set ({ ' n' ' v'  ' [c' function ()
146+         end , { expr  =  true , desc  =  ' Jump to next hunk'  
147+ 
148+         map ({ ' n' ' v'  ' [c' function ()
143149          if  vim .wo .diff  then 
144150            return  ' [c' 
145151          end 
146152          vim .schedule (function ()
147153            gs .prev_hunk ()
148154          end )
149155          return  ' <Ignore>' 
150-         end , { expr  =  true , buffer  =  bufnr , desc  =  ' Jump to previous hunk'  
156+         end , { expr  =  true , desc  =  ' Jump to previous hunk'  
157+ 
158+         --  Actions
159+         --  visual mode
160+         map (' v' ' <leader>hs' function ()
161+           gs .stage_hunk  { vim .fn .line  ' .' vim .fn .line  ' v'  
162+         end , { desc  =  ' stage git hunk'  
163+         map (' v' ' <leader>hr' function ()
164+           gs .reset_hunk  { vim .fn .line  ' .' vim .fn .line  ' v'  
165+         end , { desc  =  ' reset git hunk'  
166+         --  normal mode
167+         map (' n' ' <leader>hs' gs .stage_hunk , { desc  =  ' git stage hunk'  
168+         map (' n' ' <leader>hr' gs .reset_hunk , { desc  =  ' git reset hunk'  
169+         map (' n' ' <leader>hS' gs .stage_buffer , { desc  =  ' git Stage buffer'  
170+         map (' n' ' <leader>hu' gs .undo_stage_hunk , { desc  =  ' undo stage hunk'  
171+         map (' n' ' <leader>hR' gs .reset_buffer , { desc  =  ' git Reset buffer'  
172+         map (' n' ' <leader>hp' gs .preview_hunk , { desc  =  ' preview git hunk'  
173+         map (' n' ' <leader>hb' function ()
174+           gs .blame_line  { full  =  false  }
175+         end , { desc  =  ' git blame line'  
176+         map (' n' ' <leader>hd' gs .diffthis , { desc  =  ' git diff against index'  
177+         map (' n' ' <leader>hD' function ()
178+           gs .diffthis  ' ~' 
179+         end , { desc  =  ' git diff against last commit'  
180+ 
181+         --  Toggles
182+         map (' n' ' <leader>tb' gs .toggle_current_line_blame , { desc  =  ' toggle git blame line'  
183+         map (' n' ' <leader>td' gs .toggle_deleted , { desc  =  ' toggle git show deleted'  
184+ 
185+         --  Text object
186+         map ({ ' o' ' x'  ' ih' ' :<C-U>Gitsigns select_hunk<CR>' desc  =  ' select git hunk'  
151187      end ,
152188    },
153189  },
@@ -491,11 +527,18 @@ require('which-key').register {
491527  [' <leader>c' =  { name  =  ' [C]ode' _  =  ' which_key_ignore'  
492528  [' <leader>d' =  { name  =  ' [D]ocument' _  =  ' which_key_ignore'  
493529  [' <leader>g' =  { name  =  ' [G]it' _  =  ' which_key_ignore'  
494-   [' <leader>h' =  { name  =  ' More git ' _  =  ' which_key_ignore'  
530+   [' <leader>h' =  { name  =  ' Git [H]unk ' _  =  ' which_key_ignore'  
495531  [' <leader>r' =  { name  =  ' [R]ename' _  =  ' which_key_ignore'  
496532  [' <leader>s' =  { name  =  ' [S]earch' _  =  ' which_key_ignore'  
533+   [' <leader>t' =  { name  =  ' [T]oggle' _  =  ' which_key_ignore'  
497534  [' <leader>w' =  { name  =  ' [W]orkspace' _  =  ' which_key_ignore'  
498535}
536+ --  register which-key VISUAL mode
537+ --  required for visual <leader>hs (hunk stage) to work
538+ require (' which-key' register ({
539+   [' <leader>' =  { name  =  ' VISUAL <leader>'  
540+   [' <leader>h' =  { ' Git [H]unk'  
541+ }, { mode  =  ' v'  
499542
500543--  mason-lspconfig requires that these setup functions are called in this order
501544--  before setting up the servers.
0 commit comments