@@ -126,28 +126,64 @@ require('lazy').setup({
126
126
changedelete = { text = ' ~' },
127
127
},
128
128
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
132
129
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 ()
134
139
if vim .wo .diff then
135
140
return ' ]c'
136
141
end
137
142
vim .schedule (function ()
138
143
gs .next_hunk ()
139
144
end )
140
145
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 ()
143
149
if vim .wo .diff then
144
150
return ' [c'
145
151
end
146
152
vim .schedule (function ()
147
153
gs .prev_hunk ()
148
154
end )
149
155
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' })
151
187
end ,
152
188
},
153
189
},
@@ -491,11 +527,18 @@ require('which-key').register {
491
527
[' <leader>c' ] = { name = ' [C]ode' , _ = ' which_key_ignore' },
492
528
[' <leader>d' ] = { name = ' [D]ocument' , _ = ' which_key_ignore' },
493
529
[' <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' },
495
531
[' <leader>r' ] = { name = ' [R]ename' , _ = ' which_key_ignore' },
496
532
[' <leader>s' ] = { name = ' [S]earch' , _ = ' which_key_ignore' },
533
+ [' <leader>t' ] = { name = ' [T]oggle' , _ = ' which_key_ignore' },
497
534
[' <leader>w' ] = { name = ' [W]orkspace' , _ = ' which_key_ignore' },
498
535
}
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' })
499
542
500
543
-- mason-lspconfig requires that these setup functions are called in this order
501
544
-- before setting up the servers.
0 commit comments