@@ -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