summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2025-04-02 21:15:49 +0200
committerMinijackson <minijackson@riseup.net>2025-04-02 21:16:30 +0200
commitb8d00f600dc00bbf2e472c13eb62291a163d49c4 (patch)
tree41b90efdefd11f61246d35bf249292d5ed7b7811 /common
parentfe753afb412dadb3c7d46edb9bea8ac3652704c6 (diff)
downloadnixos-config-reborn-b8d00f600dc00bbf2e472c13eb62291a163d49c4.tar.gz
nixos-config-reborn-b8d00f600dc00bbf2e472c13eb62291a163d49c4.zip
nixvim: set some keymaps with snacks
Diffstat (limited to 'common')
-rw-r--r--common/nixvim.nix554
1 files changed, 268 insertions, 286 deletions
diff --git a/common/nixvim.nix b/common/nixvim.nix
index 9809736..659896d 100644
--- a/common/nixvim.nix
+++ b/common/nixvim.nix
@@ -67,270 +67,226 @@ inputs:
67 67
68 diagnostics.virtual_lines = true; 68 diagnostics.virtual_lines = true;
69 69
70 keymaps = 70 keymaps = [
71 let 71 {
72 toggle = key: option: { 72 key = "-";
73 mode = "n"; 73 action.__raw = "require('oil').open";
74 key = "yo${key}"; 74 options.desc = "Open parent directory";
75 action = "<Cmd>setlocal ${option}! ${option}?<CR>"; 75 }
76 options.desc = "Toggle ${option}"; 76
77 # Git
78
79 {
80 key = "<leader>gg";
81 action = "<cmd>Neogit<cr>";
82 options.desc = "Open Neogit";
83 }
84
85 {
86 key = "<leader>gd";
87 action = "<cmd>DiffviewOpen<cr>";
88 options.desc = "Open Diffview";
89 }
90
91 # GitSigns
92
93 # TODO: noremap? buffer local? silent?
94 {
95 key = "<leader>gs";
96 action.__raw = "require('gitsigns').stage_hunk";
97 options.desc = "Stage hunk";
98 }
99
100 {
101 key = "<leader>gr";
102 action.__raw = "require('gitsigns').reset_hunk";
103 options.desc = "Reset hunk";
104 }
105
106 # TODO: visual stage/reset
107
108 {
109 key = "<leader>gS";
110 action.__raw = "require('gitsigns').stage_buffer";
111 options.desc = "Stage buffer";
112 }
113
114 {
115 key = "<leader>gR";
116 action.__raw = "require('gitsigns').reset_buffer";
117 options.desc = "Stage buffer";
118 }
119
120 {
121 key = "<leader>gu";
122 action.__raw = "require('gitsigns').undo_stage_hunk";
123 options.desc = "Undo stage hunk";
124 }
125
126 {
127 key = "<leader>gp";
128 action.__raw = "require('gitsigns').preview_hunk_inline";
129 options.desc = "Preview hunk";
130 }
131
132 {
133 key = "<leader>gb";
134 action.__raw = "function() require('gitsigns').blame_line { full = true } end";
135 options.desc = "Blame line";
136 }
137
138 {
139 key = "]g";
140 action.__raw = ''
141 function()
142 if vim.wo.diff then return ']c' end
143 vim.schedule(function() package.loaded.gitsigns.next_hunk() end)
144 return '<Ignore>'
145 end
146 '';
147 options = {
148 expr = true;
149 desc = "Next hunk";
77 }; 150 };
78 in 151 }
79 [ 152
80 { 153 {
81 key = "-"; 154 key = "[g";
82 action.__raw = "require('oil').open"; 155 action.__raw = ''
83 options.desc = "Open parent directory"; 156 function()
84 } 157 if vim.wo.diff then return '[c' end
85 158 vim.schedule(function() package.loaded.gitsigns.prev_hunk() end)
86 # Git 159 return '<Ignore>'
87 160 end
88 { 161 '';
89 key = "<leader>gg"; 162 options = {
90 action = "<cmd>Neogit<cr>"; 163 expr = true;
91 options.desc = "Open Neogit"; 164 desc = "Next hunk";
92 } 165 };
93 166 }
94 { 167
95 key = "<leader>gd"; 168 # Leap
96 action = "<cmd>DiffviewOpen<cr>"; 169
97 options.desc = "Open Diffview"; 170 {
98 } 171 key = "<Space>";
99 172 mode = [
100 # GitSigns 173 "n"
101 174 "x"
102 # TODO: noremap? buffer local? silent? 175 "o"
103 { 176 ];
104 key = "<leader>gs"; 177 action = "<Plug>(leap-forward)";
105 action.__raw = "require('gitsigns').stage_hunk"; 178 options.desc = "Leap forward to";
106 options.desc = "Stage hunk"; 179 }
107 } 180
108 181 {
109 { 182 key = "<C-Space>";
110 key = "<leader>gr"; 183 mode = [
111 action.__raw = "require('gitsigns').reset_hunk"; 184 "n"
112 options.desc = "Reset hunk"; 185 "x"
113 } 186 "o"
114 187 ];
115 # TODO: visual stage/reset 188 action = "<Plug>(leap-backward)";
116 189 options.desc = "Leap backward to";
117 { 190 }
118 key = "<leader>gS"; 191
119 action.__raw = "require('gitsigns').stage_buffer"; 192 {
120 options.desc = "Stage buffer"; 193 key = "g<Space>";
121 } 194 mode = [
122 195 "n"
123 { 196 "x"
124 key = "<leader>gR"; 197 "o"
125 action.__raw = "require('gitsigns').reset_buffer"; 198 ];
126 options.desc = "Stage buffer"; 199 action = "<Plug>(leap-from-window)";
127 } 200 options.desc = "Leap from window";
128 201 }
129 { 202
130 key = "<leader>gu"; 203 {
131 action.__raw = "require('gitsigns').undo_stage_hunk"; 204 key = "gnn";
132 options.desc = "Undo stage hunk"; 205 mode = [
133 } 206 "n"
134 207 "x"
135 { 208 "o"
136 key = "<leader>gp"; 209 ];
137 action.__raw = "require('gitsigns').preview_hunk_inline"; 210 action.__raw = ''
138 options.desc = "Preview hunk"; 211 function()
139 } 212 require('leap.treesitter').select()
140 213 end
141 { 214 '';
142 key = "<leader>gb"; 215 options.desc = "Start incremental selection";
143 action.__raw = "function() require('gitsigns').blame_line { full = true } end"; 216 }
144 options.desc = "Blame line"; 217
145 } 218 {
146 219 key = "gnN";
147 { 220 mode = [
148 key = "]g"; 221 "n"
149 action.__raw = '' 222 "x"
150 function() 223 "o"
151 if vim.wo.diff then return ']c' end 224 ];
152 vim.schedule(function() package.loaded.gitsigns.next_hunk() end) 225 action = "V<cmd>lua require('leap.treesitter').select()<cr>";
153 return '<Ignore>' 226 options.desc = "Start linewise incremental selection";
154 end 227 }
155 ''; 228
156 options = { 229 {
157 expr = true; 230 mode = "n";
158 desc = "Next hunk"; 231 key = "yod";
159 }; 232 action.__raw = ''
160 } 233 function()
161 234 if vim.wo.diff then
162 { 235 vim.cmd.diffoff()
163 key = "[g"; 236 print('diffoff')
164 action.__raw = '' 237 else
165 function() 238 vim.cmd.diffthis()
166 if vim.wo.diff then return '[c' end 239 print('diffthis')
167 vim.schedule(function() package.loaded.gitsigns.prev_hunk() end)
168 return '<Ignore>'
169 end
170 '';
171 options = {
172 expr = true;
173 desc = "Next hunk";
174 };
175 }
176
177 # Leap
178
179 {
180 key = "<Space>";
181 mode = [
182 "n"
183 "x"
184 "o"
185 ];
186 action = "<Plug>(leap-forward)";
187 options.desc = "Leap forward to";
188 }
189
190 {
191 key = "<C-Space>";
192 mode = [
193 "n"
194 "x"
195 "o"
196 ];
197 action = "<Plug>(leap-backward)";
198 options.desc = "Leap backward to";
199 }
200
201 {
202 key = "g<Space>";
203 mode = [
204 "n"
205 "x"
206 "o"
207 ];
208 action = "<Plug>(leap-from-window)";
209 options.desc = "Leap from window";
210 }
211
212 {
213 key = "gnn";
214 mode = [
215 "n"
216 "x"
217 "o"
218 ];
219 action.__raw = ''
220 function()
221 require('leap.treesitter').select()
222 end
223 '';
224 options.desc = "Start incremental selection";
225 }
226
227 {
228 key = "gnN";
229 mode = [
230 "n"
231 "x"
232 "o"
233 ];
234 action = "V<cmd>lua require('leap.treesitter').select()<cr>";
235 options.desc = "Start linewise incremental selection";
236 }
237
238 # Toggle options
239 (toggle "c" "cursorline")
240 (toggle "C" "cursorcolumn")
241 (toggle "h" "hlsearch")
242 (toggle "i" "ignorecase")
243 (toggle "l" "list")
244 (toggle "n" "number")
245 (toggle "r" "relativenumber")
246 (toggle "s" "spell")
247 (toggle "w" "wrap")
248
249 {
250 mode = "n";
251 key = "yod";
252 action.__raw = ''
253 function()
254 if vim.wo.diff then
255 vim.cmd.diffoff()
256 print('diffoff')
257 else
258 vim.cmd.diffthis()
259 print('diffthis')
260 end
261 end
262 '';
263 options.desc = "Toggle diff";
264 }
265
266 # Trouble
267
268 {
269 key = "<leader>xx";
270 mode = "n";
271 action = "<cmd>Trouble diagnostics toggle<cr>";
272 options.desc = "Diagnostics (Trouble)";
273 }
274
275 {
276 key = "<leader>xX";
277 mode = "n";
278 action = "<cmd>Trouble diagnostics toggle filter.buf=0<cr>";
279 options.desc = "Buffer Diagnostics (Trouble)";
280 }
281
282 {
283 key = "<leader>cs";
284 mode = "n";
285 action = "<cmd>Trouble symbols toggle focus=false<cr>";
286 options.desc = "Symbols (Trouble)";
287 }
288
289 {
290 key = "<leader>cl";
291 mode = "n";
292 action = "<cmd>Trouble lsp toggle focus=false win.position=right<cr>";
293 options.desc = "LSP Definitions / references / ... (Trouble)";
294 }
295
296 {
297 key = "<leader>xL";
298 mode = "n";
299 action = "<cmd>Trouble loclist toggle<cr>";
300 options.desc = "Location List (Trouble)";
301 }
302
303 {
304 key = "<leader>xQ";
305 mode = "n";
306 action = "<cmd>Trouble qflist toggle<cr>";
307 options.desc = "Quickfix List (Trouble)";
308 }
309
310 {
311 key = "<leader>sd";
312 action = ''
313 function()
314 local new_config = not vim.diagnostic.config().virtual_lines
315 vim.diagnostic.config({ virtual_lines = new_config })
316 end
317 '';
318 mode = "n";
319 lua = true;
320 options.desc = "LSP toggle inline diagnostics";
321 }
322 {
323 key = "<leader>sT";
324 action = ''
325 function()
326 vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
327 end 240 end
328 ''; 241 end
329 mode = "n"; 242 '';
330 lua = true; 243 options.desc = "Toggle diff";
331 options.desc = "LSP toggle inline text"; 244 }
332 } 245
333 ]; 246 # Trouble
247
248 {
249 key = "<leader>xx";
250 mode = "n";
251 action = "<cmd>Trouble diagnostics toggle<cr>";
252 options.desc = "Diagnostics (Trouble)";
253 }
254
255 {
256 key = "<leader>xX";
257 mode = "n";
258 action = "<cmd>Trouble diagnostics toggle filter.buf=0<cr>";
259 options.desc = "Buffer Diagnostics (Trouble)";
260 }
261
262 {
263 key = "<leader>cs";
264 mode = "n";
265 action = "<cmd>Trouble symbols toggle focus=false<cr>";
266 options.desc = "Symbols (Trouble)";
267 }
268
269 {
270 key = "<leader>cl";
271 mode = "n";
272 action = "<cmd>Trouble lsp toggle focus=false win.position=right<cr>";
273 options.desc = "LSP Definitions / references / ... (Trouble)";
274 }
275
276 {
277 key = "<leader>xL";
278 mode = "n";
279 action = "<cmd>Trouble loclist toggle<cr>";
280 options.desc = "Location List (Trouble)";
281 }
282
283 {
284 key = "<leader>xQ";
285 mode = "n";
286 action = "<cmd>Trouble qflist toggle<cr>";
287 options.desc = "Quickfix List (Trouble)";
288 }
289 ];
334 290
335 # TODO: 291 # TODO:
336 extraPlugins = with pkgs.unstable.vimPlugins; [ 292 extraPlugins = with pkgs.unstable.vimPlugins; [
@@ -428,30 +384,6 @@ inputs:
428 }; 384 };
429 align = { }; 385 align = { };
430 bracketed = { }; 386 bracketed = { };
431 clue = {
432 triggers = [
433 {
434 mode = "n";
435 keys = "yo";
436 }
437 {
438 mode = "n";
439 keys = "[";
440 }
441 {
442 mode = "n";
443 keys = "]";
444 }
445 {
446 mode = "n";
447 keys = "<leader>";
448 }
449 {
450 mode = "n";
451 keys = "gr";
452 }
453 ];
454 };
455 trailspace = { }; 387 trailspace = { };
456 }; 388 };
457 }; 389 };
@@ -676,9 +608,59 @@ inputs:
676 }; 608 };
677 609
678 web-devicons.enable = true; 610 web-devicons.enable = true;
611
612 which-key = {
613 enable = true;
614 settings.spec = [
615 {
616 __unkeyed = "<leader>f";
617 group = "Find";
618 }
619 {
620 __unkeyed = "<leader>g";
621 group = "Git";
622 }
623 {
624 __unkeyed = "<leader>s";
625 group = "LSP";
626 }
627 {
628 __unkeyed = "<leader>o";
629 group = "Orgmode";
630 }
631 {
632 __unkeyed = "<leader>n";
633 group = "Notes";
634 }
635 {
636 __unkeyed = "<leader>x";
637 group = "Trouble";
638 }
639 ];
640 };
679 }; 641 };
680 642
681 extraConfigLua = '' 643 extraConfigLua = ''
644 -- Toggle options
645 for _, x in ipairs({
646 {"c", "cursorline"},
647 {"C", "cursorcolumn"},
648 {"h", "hlsearch"},
649 {"i", "ignorecase"},
650 {"l", "list"},
651 {"r", "relativenumber"},
652 {"s", "spell"},
653 {"w", "wrap"},
654 }) do
655 Snacks.toggle.option(x[2]):map("yo" .. x[1])
656 end
657
658 Snacks.toggle.line_number():map("yon")
659 Snacks.toggle.indent():map("yoI")
660 Snacks.toggle.diagnostics():map("<leader>sd")
661 Snacks.toggle.inlay_hints():map("<leader>sT")
662 Snacks.toggle.words():map("<leader>sw")
663
682 vim.api.nvim_create_autocmd("TextYankPost", { 664 vim.api.nvim_create_autocmd("TextYankPost", {
683 desc = "Highlight yanked text", 665 desc = "Highlight yanked text",
684 callback = function() 666 callback = function()