diff options
Diffstat (limited to 'common/nixvim.nix')
-rw-r--r-- | common/nixvim.nix | 554 |
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() |