tangled
alpha
login
or
join now
bwc9876.dev
/
nixos-config
1
fork
atom
Flake for my NixOS devices
1
fork
atom
overview
issues
pulls
pipelines
Neovim improvements
bwc9876.dev
1 month ago
e99f6362
37fa66af
verified
This commit was signed with the committer's
known signature
.
bwc9876.dev
SSH Key Fingerprint:
SHA256:DanMEP/RNlSC7pAVbnXO6wzQV00rqyKj053tz4uH5gQ=
+342
-453
4 changed files
expand all
collapse all
unified
split
flake.lock
homeModules
dev.nix
nvim.nix
nixosModules
network.nix
+24
-24
flake.lock
···
31
]
32
},
33
"locked": {
34
-
"lastModified": 1767967164,
35
-
"narHash": "sha256-Cx4VETh9dGoQYDtWhre7g66d7SAr+h1h6f+SSHxVrck=",
36
"owner": "catppuccin",
37
"repo": "nix",
38
-
"rev": "e973584280e3b0e1d5b5a1a5e9948dc222c54af7",
39
"type": "github"
40
},
41
"original": {
···
362
]
363
},
364
"locked": {
365
-
"lastModified": 1768397254,
366
-
"narHash": "sha256-hhvxV6RUxagnwE7WEYbm7vRaR0MtdNn2Brm3rqPNj4E=",
367
"owner": "nix-community",
368
"repo": "home-manager",
369
-
"rev": "a0a505f803cb74a2bd386a1604973107f7e6c19b",
370
"type": "github"
371
},
372
"original": {
···
469
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
470
},
471
"locked": {
472
-
"lastModified": 1768400089,
473
-
"narHash": "sha256-w/jvQHJplvsHjxtv9kYsUDfc+CW/FMIuc0PIgsmGL0s=",
474
"owner": "sodiboo",
475
"repo": "niri-flake",
476
-
"rev": "904cf223bd25b5b40fc8a4254e542507674f0333",
477
"type": "github"
478
},
479
"original": {
···
502
"niri-unstable": {
503
"flake": false,
504
"locked": {
505
-
"lastModified": 1768196703,
506
-
"narHash": "sha256-mttBQdVnVFO3mn+M+oqCsZZOtS2HvXYy+VaHxb8YuMw=",
507
"owner": "YaLTeR",
508
"repo": "niri",
509
-
"rev": "3672e79369d72297abda8878245ea4ec327062c6",
510
"type": "github"
511
},
512
"original": {
···
537
},
538
"nixos-hardware": {
539
"locked": {
540
-
"lastModified": 1768397375,
541
-
"narHash": "sha256-7QqbFi3ERvKjEdAzEYPv7iSGwpUKSrQW5wPLMFq45AQ=",
542
"owner": "NixOS",
543
"repo": "nixos-hardware",
544
-
"rev": "efe2094529d69a3f54892771b6be8ee4a0ebef0f",
545
"type": "github"
546
},
547
"original": {
···
552
},
553
"nixpkgs": {
554
"locked": {
555
-
"lastModified": 1768127708,
556
-
"narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
557
"owner": "NixOS",
558
"repo": "nixpkgs",
559
-
"rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
560
"type": "github"
561
},
562
"original": {
···
568
},
569
"nixpkgs-stable": {
570
"locked": {
571
-
"lastModified": 1768323494,
572
-
"narHash": "sha256-yBXJLE6WCtrGo7LKiB6NOt6nisBEEkguC/lq/rP3zRQ=",
573
"owner": "NixOS",
574
"repo": "nixpkgs",
575
-
"rev": "2c3e5ec5df46d3aeee2a1da0bfedd74e21f4bf3a",
576
"type": "github"
577
},
578
"original": {
···
591
"systems": "systems"
592
},
593
"locked": {
594
-
"lastModified": 1767906546,
595
-
"narHash": "sha256-AoSWS8+P+7hQ/jIdv0wBjgH1MvnerdWBFXO4GV3JoQs=",
596
"owner": "nix-community",
597
"repo": "nixvim",
598
-
"rev": "7eb8f36f085b85a2aeff929aff52d0f6aa14e000",
599
"type": "github"
600
},
601
"original": {
···
31
]
32
},
33
"locked": {
34
+
"lastModified": 1768575137,
35
+
"narHash": "sha256-e0SsKnkSnq+UwZNS9ZyPJjTjabzq9TRc1hqeDnvOF1Q=",
36
"owner": "catppuccin",
37
"repo": "nix",
38
+
"rev": "48e67b4ad22072f1ae30b0ed8e1cb020cf06c611",
39
"type": "github"
40
},
41
"original": {
···
362
]
363
},
364
"locked": {
365
+
"lastModified": 1768707181,
366
+
"narHash": "sha256-GdwFfnwdUgABFpc4sAmX7GYx8eQs6cEjOPo6nBJ0YaI=",
367
"owner": "nix-community",
368
"repo": "home-manager",
369
+
"rev": "83bcb17377f0242376a327e742e9404e9a528647",
370
"type": "github"
371
},
372
"original": {
···
469
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
470
},
471
"locked": {
472
+
"lastModified": 1768684335,
473
+
"narHash": "sha256-YLjGGcSNE2lK+TUqDFEX6IBjPZNjLaoxAXji3mmZbvs=",
474
"owner": "sodiboo",
475
"repo": "niri-flake",
476
+
"rev": "c133a45b02dba5fd229532067d6a22d5209436d6",
477
"type": "github"
478
},
479
"original": {
···
502
"niri-unstable": {
503
"flake": false,
504
"locked": {
505
+
"lastModified": 1768678265,
506
+
"narHash": "sha256-Ub8eed4DsfIDWyg30xEe+8bSxL/z5Af/gCjmvJ0V/Hs=",
507
"owner": "YaLTeR",
508
"repo": "niri",
509
+
"rev": "d7184a04b904e07113f4623610775ae78d32394c",
510
"type": "github"
511
},
512
"original": {
···
537
},
538
"nixos-hardware": {
539
"locked": {
540
+
"lastModified": 1768736227,
541
+
"narHash": "sha256-qgGq7CfrYKc3IBYQ7qp0Z/ZXndQVC5Bj0N8HW9mS2rM=",
542
"owner": "NixOS",
543
"repo": "nixos-hardware",
544
+
"rev": "d447553bcbc6a178618d37e61648b19e744370df",
545
"type": "github"
546
},
547
"original": {
···
552
},
553
"nixpkgs": {
554
"locked": {
555
+
"lastModified": 1768564909,
556
+
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
557
"owner": "NixOS",
558
"repo": "nixpkgs",
559
+
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
560
"type": "github"
561
},
562
"original": {
···
568
},
569
"nixpkgs-stable": {
570
"locked": {
571
+
"lastModified": 1768621446,
572
+
"narHash": "sha256-6YwHV1cjv6arXdF/PQc365h1j+Qje3Pydk501Rm4Q+4=",
573
"owner": "NixOS",
574
"repo": "nixpkgs",
575
+
"rev": "72ac591e737060deab2b86d6952babd1f896d7c5",
576
"type": "github"
577
},
578
"original": {
···
591
"systems": "systems"
592
},
593
"locked": {
594
+
"lastModified": 1768486009,
595
+
"narHash": "sha256-I7ymDe6UQooHy9I9wrafKCCDnRbox/EMWAgJgpm7fGs=",
596
"owner": "nix-community",
597
"repo": "nixvim",
598
+
"rev": "03a638205b5cb04ba9c2ed6c604e137b15f07fa1",
599
"type": "github"
600
},
601
"original": {
+1
-1
homeModules/dev.nix
···
102
])
103
++ (lib.optionals conf.python [
104
python3
105
-
poetry
106
pipenv
107
uv
108
ruff
···
102
])
103
++ (lib.optionals conf.python [
104
python3
105
+
# poetry
106
pipenv
107
uv
108
ruff
+308
-421
homeModules/nvim.nix
···
18
19
home.sessionVariables.EDITOR = "nvim";
20
21
-
programs.neovide = lib.mkIf config.cow.gdi.enable {
22
-
enable = true;
23
-
settings = {
24
-
fork = true;
25
-
font = {
26
-
normal = [{family = "monospace";}];
27
-
size = 18.0;
28
-
};
29
-
title-hidden = false;
30
-
};
31
-
};
32
33
-
programs.nixvim = {
34
enable = true;
35
enableMan = false;
36
defaultEditor = true;
···
38
vimAlias = true;
39
40
nixpkgs.pkgs = pkgs;
41
-
clipboard.providers.wl-copy.enable = config.cow.gdi.enable;
42
43
-
globals.mapleader = " ";
0
0
0
0
0
0
0
0
0
0
0
44
45
colorschemes.catppuccin = lib.mkIf config.cow.cat.enable {
46
enable = true;
···
50
no_bold = false;
51
no_italics = false;
52
term_colors = true;
53
-
# transparent_background = true;
54
integrations = {
55
alpha = true;
56
dropbar.enabled = true;
···
92
};
93
};
94
0
0
95
extraConfigLua = ''
96
vim.diagnostic.config({
97
signs = {
···
101
},
102
},
103
})
104
-
vim.g.neovide_cursor_vfx_mode = "pixiedust"
105
-
106
-
-- require("satellite").setup({})
107
'';
108
109
-
autoGroups = {
110
-
restore_cursor = {};
111
-
open_neotree = {};
112
-
};
113
-
114
-
filetype.extension = {
115
-
mdx = "mdx";
116
-
};
117
-
118
opts = {
119
number = true;
120
relativenumber = true;
···
124
tabstop = 2;
125
shiftwidth = 2;
126
breakindent = true;
127
-
fillchars.__raw = ''[[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]]'';
128
foldcolumn = "1";
129
-
foldlevel = 10;
130
-
foldlevelstart = 10;
131
foldenable = true;
132
mouse = "";
133
};
0
0
0
0
0
0
0
0
0
0
134
135
autoCmd = [
136
{
···
150
end
151
'';
152
}
153
-
{
154
-
group = "open_neotree";
155
-
event = ["BufRead"];
156
-
pattern = "*";
157
-
once = true;
158
-
callback.__raw = ''
159
-
function()
160
-
if
161
-
vim.bo.filetype ~= "alpha"
162
-
and (not vim.g.neotree_opened)
163
-
then
164
-
vim.cmd "Neotree show"
165
-
vim.g.neotree_opened = true
166
-
end
167
-
end
168
-
'';
169
-
}
170
];
171
172
-
performance = {
173
-
byteCompileLua = {
174
-
enable = true;
175
-
nvimRuntime = true;
176
-
plugins = true;
177
-
};
178
-
combinePlugins = {
179
-
enable = true;
180
-
};
181
};
0
0
0
0
182
183
keymaps = let
184
-
prefixMap = pre: maps:
185
builtins.map (k: {
186
-
action = "<cmd>${k.action}<cr>";
187
-
key = "${pre}${k.key}";
0
0
0
0
188
options = k.options;
189
})
190
-
maps;
191
in
192
lib.lists.flatten (
193
builtins.map (g:
194
-
if builtins.hasAttr "group" g
195
-
then prefixMap g.prefix g.keys
196
else g) [
197
{
198
action = ''"+p'';
···
210
options.desc = "Cut to system clipboard";
211
}
212
{
213
-
action = ''<cmd>Format<cr>'';
214
key = "<C-S-I>";
215
options.desc = "Format Buffer";
216
}
···
229
options.desc = "Previous Tab";
230
}
231
{
232
-
action = "Neotree toggle";
233
key = "t";
234
options.desc = "Toggle Neotree";
235
}
···
269
{
270
group = "LSP Actions";
271
prefix = "<C-.>";
0
272
keys = [
273
{
274
-
action = "Lspsaga code_action code_action";
275
key = "a";
276
options.desc = "Code Actions";
277
}
278
{
279
-
action = "Lspsaga rename";
280
key = "r";
281
options.desc = "LSP Rename";
282
}
283
{
284
-
action = "Lspsaga diagnostic_jump_next";
285
key = "e";
286
options.desc = "Next Diagnostic";
287
}
288
{
289
-
action = "Lspsaga diagnostic_jump_previous";
290
key = "E";
291
options.desc = "Previous Diagnostic";
292
}
293
{
294
-
action = "Lspsaga goto_definition";
295
key = "d";
296
options.desc = "Jump to Definition";
297
}
298
{
299
-
action = "Lspsaga peek_definition";
300
key = "D";
301
options.desc = "Peek Definition";
302
}
303
{
304
-
action = "Lspsaga finder ref";
305
key = "fr";
306
options.desc = "Find References";
307
}
308
{
309
-
action = "Lspsaga finder imp";
310
key = "fi";
311
options.desc = "Find Implementations";
312
}
313
{
314
-
action = "Lspsaga finder def";
315
key = "fd";
316
options.desc = "Find Definitions";
317
}
318
{
319
-
action = "Lspsaga finder";
320
key = "ff";
321
options.desc = "Finder";
322
}
323
{
324
-
action = "Lspsaga hover_doc";
325
key = "h";
326
options.desc = "Hover Doc";
327
}
328
];
329
}
330
{
331
-
action = "<cmd>Telescope<cr>";
332
-
key = "<leader><leader>";
333
-
options.desc = "Telescope Launch";
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
334
}
335
{
336
action.__raw = "[[<C-\\><C-n><C-w>]]";
···
352
extraPlugins = with pkgs.vimPlugins;
353
(lib.optional config.cow.dev.web {plugin = pkgs.nvim-mdx;})
354
++ [
355
-
{plugin = satellite-nvim;}
356
-
{plugin = flatten-nvim;}
357
-
{plugin = tiny-devicons-auto-colors-nvim;}
358
];
359
360
plugins = {
0
0
0
361
telescope = {
362
enable = true;
363
settings.defaults = {
···
368
ui-select.enable = true;
369
undo.enable = true;
370
};
371
-
keymaps = lib.fix (self: {
372
-
"<leader>u" = {
373
-
action = "undo";
374
-
options.desc = "Undo Tree";
375
-
};
376
-
"<leader>c" = {
377
-
action = "commands";
378
-
options.desc = "Browse Commands";
379
-
};
380
-
"<leader>w" = {
381
-
action = "spell_suggest";
382
-
options.desc = "Spell Suggest";
383
-
};
384
-
"<leader>s" = {
385
-
action = "lsp_document_symbols";
386
-
options.desc = "LSP Symbols";
387
-
};
388
-
"<leader>t" = {
389
-
action = "treesitter";
390
-
options.desc = "Treesitter Symbols";
391
-
};
392
-
"<leader>f" = {
393
-
action = "find_files";
394
-
options.desc = "Files";
395
-
};
396
-
"<leader>gs" = {
397
-
action = "git_status";
398
-
options.desc = "Git Status";
399
-
};
400
-
"<leader>gb" = {
401
-
action = "git_branches";
402
-
options.desc = "Git Branches";
403
-
};
404
-
"<leader>gc" = {
405
-
action = "git_commits";
406
-
options.desc = "Git Commits";
407
-
};
408
-
"<leader>r" = {
409
-
action = "oldfiles";
410
-
options.desc = "Recent Files";
411
-
};
412
-
"<leader>l" = self."<C-S-F>";
413
-
"<C-S-F>" = {
414
-
action = "live_grep";
415
-
options.desc = "Live Grep";
416
-
};
417
-
});
418
};
419
420
-
alpha = {
421
-
enable = true;
422
-
settings.opts = {
423
-
position = "center";
424
-
};
425
-
settings.layout = let
426
-
o = {
427
-
position = "center";
428
-
};
429
-
txt = s: {
430
-
type = "text";
431
-
val = s;
432
-
opts =
433
-
{
434
-
hl = "Keyword";
435
-
}
436
-
// o;
437
-
};
438
-
grp = g: {
439
-
type = "group";
440
-
val = g;
441
-
opts.spacing = 1;
442
-
};
443
-
btn = {
444
-
val,
445
-
onClick,
446
-
...
447
-
}: {
448
-
type = "button";
449
-
inherit val;
450
-
opts = o;
451
-
on_press.__raw = "function() vim.cmd[[${onClick}]] end";
452
-
};
453
-
cmd = {
454
-
command,
455
-
width,
456
-
height,
457
-
}: {
458
-
type = "terminal";
459
-
inherit command width height;
460
-
opts = o;
461
-
};
462
-
pad = {
463
-
type = "padding";
464
-
val = 2;
465
-
};
466
-
in
467
-
[
468
-
pad
469
-
pad
470
-
]
471
-
++ (lib.intersperse pad [
472
-
(cmd {
473
-
command = ''
474
-
${pkgs.toilet}/bin/toilet " NIXVIM " -f mono12 -F border | ${pkgs.lolcat}/bin/lolcat -f
475
-
'';
476
-
# Hardcoding to prevent IFD
477
-
width = 83; # (builtins.stringLength (lib.trim (builtins.elemAt (lib.splitString "\n" bannerText) 1))) - 3;
478
-
height = 12; # (builtins.length (lib.splitString "\n" bannerText)) - 1;
479
-
})
480
-
(grp [
481
-
(btn {
482
-
val = " Terminal";
483
-
onClick = "ToggleTerm";
484
-
})
485
-
(btn {
486
-
val = " Quit";
487
-
onClick = "q";
488
-
})
489
-
])
490
-
(grp [
491
-
(txt " Neovim Version ${pkgs.neovim.version}")
492
-
(txt " NixVim Rev ${builtins.substring 0 5 inputs.nixvim.rev}")
493
-
])
494
-
])
495
-
++ [pad];
496
-
};
497
-
498
-
trouble = {
499
-
enable = true;
500
-
};
501
-
502
-
toggleterm = {
503
-
enable = true;
504
-
luaConfig.post = ''
505
-
local flatten = require('flatten')
506
-
507
-
---@type Terminal?
508
-
local saved_terminal
509
-
510
-
flatten.setup({
511
-
hooks = {
512
-
should_block = function(argv)
513
-
return vim.tbl_contains(argv, "-b")
514
-
end,
515
-
pre_open = function()
516
-
local term = require("toggleterm.terminal")
517
-
local termid = term.get_focused_id()
518
-
saved_terminal = term.get(termid)
519
-
end,
520
-
post_open = function(opts)
521
-
if saved_terminal then
522
-
saved_terminal:close()
523
-
else
524
-
vim.api.nvim_set_current_win(opts.winnr)
525
-
end
526
-
527
-
if opts.filetype == "gitcommit" or opts.filetype == "gitrebase" then
528
-
vim.api.nvim_create_autocmd("BufWritePost", {
529
-
buffer = opts.bufnr,
530
-
once = true,
531
-
callback = vim.schedule_wrap(function()
532
-
require('bufdelete').bufdelete(opts.bufnr, true)
533
-
end),
534
-
})
535
-
end
536
-
end,
537
-
block_end = function()
538
-
vim.schedule(function()
539
-
if saved_terminal then
540
-
saved_terminal:open()
541
-
saved_terminal = nil
542
-
end
543
-
end)
544
-
end,
545
-
},
546
-
window = {
547
-
open = "alternate",
548
-
},
549
-
})
550
-
'';
551
-
settings = {
552
-
size = 20;
553
-
open_mapping = "[[<C-x>]]";
554
-
direction = "horizontal";
555
-
start_in_insert = true;
556
-
insert_mappings = true;
557
-
terminal_mappings = true;
558
-
};
559
-
};
560
-
561
-
treesitter = {
562
-
enable = true;
563
-
luaConfig.post = lib.mkIf config.cow.dev.web ''
564
-
require('mdx').setup()
565
-
'';
566
-
settings = {
567
-
highlight.enable = true;
568
-
};
569
-
};
570
-
571
illuminate.enable = true;
0
572
cursorline.enable = true;
573
574
-
# neocord = {
575
-
# enable = true;
576
-
# settings.logo = "https://raw.githubusercontent.com/IogaMaster/neovim/main/.github/assets/nixvim-dark.webp";
577
-
# };
578
-
579
bufdelete.enable = true;
580
0
581
bufferline = {
582
enable = true;
583
-
settings.highlights.__raw = ''
584
require("catppuccin.special.bufferline").get_theme()
585
'';
586
settings.options = {
···
591
{
592
filetype = "neo-tree";
593
highlight = "String";
594
-
text = " Neovim";
595
text_align = "center";
596
# separator = true;
597
}
598
];
599
separator_style = "slant";
600
-
close_command.__raw = ''require('bufdelete').bufdelete'';
601
hover = {
602
enabled = true;
603
delay = 150;
···
614
};
615
};
616
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
617
statuscol = {
618
enable = true;
619
settings.segments = let
···
661
];
662
};
663
664
-
dropbar = {
665
-
enable = true;
666
-
settings = {
667
-
bar.padding.right = 5;
668
-
bar.padding.left = 1;
669
-
};
670
-
};
671
-
672
-
nvim-ufo = {
673
-
enable = true;
674
-
};
675
-
676
-
# gitgutter = {
677
-
# enable = true;
678
-
# settings = {
679
-
#
680
-
# };
681
-
# };
682
-
683
lualine = {
684
enable = true;
685
settings = {
···
689
];
690
691
options = {
692
-
theme = "catppuccin";
693
disabled_filetypes = ["neo-tree"];
694
ignore_focus = ["neo-tree"];
695
};
696
};
697
};
698
699
-
nix-develop = {
700
-
enable = true;
701
-
package = pkgs.vimPlugins.nix-develop-nvim.overrideAttrs (
702
-
prev: next: {
703
-
src = pkgs.fetchFromGitHub {
704
-
owner = "Bwc9876";
705
-
repo = "nix-develop.nvim";
706
-
rev = "089cd52191ccbb3726594e21cd96567af6088dd5";
707
-
sha256 = "sha256-EIEJk8/IAuG+UICUJ2F8QakgRpFrQ1ezDSJ79NAVuD8=";
708
-
};
709
-
}
710
-
);
711
-
};
712
713
-
neo-tree = {
0
714
enable = true;
715
-
settings = {
716
-
hide_root_node = false;
717
-
add_blank_line_at_top = true;
718
-
default_component_configs = {
719
-
container.right_padding = 2;
720
-
name.trailing_slash = true;
721
-
indent = {
722
-
indent_size = 2;
723
-
with_expanders = true;
724
-
};
725
};
726
-
window.width = 40;
727
-
auto_clean_after_session_restore = true;
728
-
close_if_last_window = true;
729
-
filesystem.components.name.__raw = ''
730
-
function(config, node, state)
731
-
local components = require('neo-tree.sources.common.components')
732
-
local name = components.name(config, node, state)
733
-
if node:get_depth() == 1 then
734
-
name.text = vim.fs.basename(vim.loop.cwd() or "") .. "/"
735
-
end
736
-
return name
737
-
end
738
-
'';
739
};
740
};
741
742
-
image = {
743
-
luaConfig = {
744
-
pre = "if not vim.g.neovide then";
745
-
post = "end";
746
-
};
747
-
enable = true;
748
-
};
749
-
web-devicons.enable = true;
750
-
751
-
indent-o-matic.enable = true;
752
-
intellitab.enable = true;
753
-
754
which-key = {
755
enable = true;
756
settings = {
···
760
};
761
};
762
763
-
fidget = {
0
764
enable = true;
765
-
settings.notification = {
766
-
override_vim_notify = true;
767
-
window = {
768
-
y_padding = 2;
769
-
x_padding = 2;
770
-
zindex = 50;
771
-
align = "top";
772
-
winblend = 0;
773
-
};
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
774
};
775
};
776
777
-
# none-ls = {
778
-
# enable = true;
779
-
# sources.formatting = {
780
-
# prettier = {
781
-
# enable = true;
782
-
# disableTsServerFormatter = true;
783
-
# };
784
-
# yamlfmt.enable = true;
785
-
# typstyle.enable = true;
786
-
# markdownlint.enable = true;
787
-
# };
788
-
# sources.diagnostics = {
789
-
# markdownlint.enable = true;
790
-
# };
791
-
# };
792
793
-
cmp = {
0
794
enable = true;
0
0
0
795
settings = {
796
-
sources = map (name: {inherit name;}) [
797
-
"nvim_lsp"
798
-
"nvim_lsp_signature_help"
799
-
"path"
800
-
"buffer"
801
-
];
802
-
mapping = {
803
-
"<Esc>" = "cmp.mapping.abort()";
804
-
"<Tab>" = "cmp.mapping.confirm({ select = true })";
805
-
"<Up>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
806
-
"<Down>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
807
-
};
808
};
809
};
810
811
-
cmp-nvim-lsp.enable = true;
812
-
cmp-nvim-lsp-document-symbol.enable = true;
813
-
cmp-spell.enable = true;
814
-
815
-
rainbow-delimiters.enable = true;
816
-
preview.enable = true;
817
-
818
-
# jupytext.enable = true;
819
-
820
-
# Broken
821
-
# hex = {
822
-
# enable = true;
823
-
# settings = {
824
-
# assemble_cmd = "xxd -r";
825
-
# dump_cmd = "xxd -g 1 -u";
826
-
# };
827
-
# };
828
-
829
conform-nvim = {
830
enable = true;
831
settings.default_format_opts = {
···
847
'';
848
};
849
0
850
lspconfig.enable = true;
851
0
852
lspsaga = {
853
enable = true;
854
settings = {
···
873
};
874
};
875
876
-
crates.enable = true;
0
877
878
-
numbertoggle.enable = true;
879
880
-
# rustaceanvim.enable = true;
881
-
vim-css-color.enable = true;
0
0
0
0
0
882
};
883
884
-
lsp = {
885
inlayHints.enable = true;
886
887
servers = let
···
902
# ghcPackage = pkgs.haskell.compiler.ghc912;
903
package = pkgs.haskell.packages.ghc912.haskell-language-server;
904
};
905
-
sqls.enable = web;
906
mdx_analyzer = lib.mkIf web {
907
enable = true;
908
package = pkgs.mdx-language-server;
909
};
910
-
# denols.enable = true;
911
ts_ls.enable = web;
912
html.enable = web;
913
marksman.enable = web;
···
916
yamlls.enable = web;
917
ruff.enable = python;
918
csharp_ls.enable = dotnet;
919
-
svelte.enable = web;
920
nil_ls.enable = true;
921
bashls.enable = true;
922
nushell.enable = config.cow.nushell.enable;
···
929
};
930
lemminx.enable = web;
931
eslint.enable = web;
932
-
just.enable = true;
933
};
934
};
935
};
···
18
19
home.sessionVariables.EDITOR = "nvim";
20
21
+
programs.nixvim = {
22
+
# Meta
0
0
0
0
0
0
0
0
0
23
0
24
enable = true;
25
enableMan = false;
26
defaultEditor = true;
···
28
vimAlias = true;
29
30
nixpkgs.pkgs = pkgs;
0
31
32
+
performance = {
33
+
byteCompileLua = {
34
+
enable = true;
35
+
nvimRuntime = true;
36
+
plugins = true;
37
+
};
38
+
combinePlugins = {
39
+
enable = true;
40
+
};
41
+
};
42
+
43
+
# Theming
44
45
colorschemes.catppuccin = lib.mkIf config.cow.cat.enable {
46
enable = true;
···
50
no_bold = false;
51
no_italics = false;
52
term_colors = true;
0
53
integrations = {
54
alpha = true;
55
dropbar.enabled = true;
···
91
};
92
};
93
94
+
# Misc. Global Options
95
+
96
extraConfigLua = ''
97
vim.diagnostic.config({
98
signs = {
···
102
},
103
},
104
})
0
0
0
105
'';
106
0
0
0
0
0
0
0
0
0
107
opts = {
108
number = true;
109
relativenumber = true;
···
113
tabstop = 2;
114
shiftwidth = 2;
115
breakindent = true;
116
+
fillchars.__raw = "[[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]]";
117
foldcolumn = "1";
118
+
foldlevel = 100;
119
+
foldlevelstart = 100;
120
foldenable = true;
121
mouse = "";
122
};
123
+
124
+
# Allow system clipboard copying if graphical env is enabled
125
+
clipboard.providers.wl-copy.enable = lib.mkDefault config.cow.gdi.enable;
126
+
127
+
# Associate .mdx extension to mdx buffer type
128
+
filetype.extension = {
129
+
mdx = "mdx";
130
+
};
131
+
132
+
# Auto Run Commands
133
134
autoCmd = [
135
{
···
149
end
150
'';
151
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
152
];
153
154
+
autoGroups = {
155
+
# Try to restore cursor to the last position it was at last time this file was opened
156
+
restore_cursor = {};
0
0
0
0
0
0
157
};
158
+
159
+
# Keybinds
160
+
161
+
# globals.mapleader = " ";
162
163
keymaps = let
164
+
prefixMap = group:
165
builtins.map (k: {
166
+
action = "<cmd>${
167
+
if group ? "cmdPrefix"
168
+
then group.cmdPrefix + " "
169
+
else ""
170
+
}${k.action}<cr>";
171
+
key = "${group.prefix}${k.key}";
172
options = k.options;
173
})
174
+
group.keys;
175
in
176
lib.lists.flatten (
177
builtins.map (g:
178
+
if g ? "group"
179
+
then prefixMap g
180
else g) [
181
{
182
action = ''"+p'';
···
194
options.desc = "Cut to system clipboard";
195
}
196
{
197
+
action = "<cmd>Format<cr>";
198
key = "<C-S-I>";
199
options.desc = "Format Buffer";
200
}
···
213
options.desc = "Previous Tab";
214
}
215
{
216
+
action = "Neotree toggle reveal";
217
key = "t";
218
options.desc = "Toggle Neotree";
219
}
···
253
{
254
group = "LSP Actions";
255
prefix = "<C-.>";
256
+
cmdPrefix = "Lspsaga";
257
keys = [
258
{
259
+
action = "code_action code_action";
260
key = "a";
261
options.desc = "Code Actions";
262
}
263
{
264
+
action = "rename";
265
key = "r";
266
options.desc = "LSP Rename";
267
}
268
{
269
+
action = "diagnostic_jump_next";
270
key = "e";
271
options.desc = "Next Diagnostic";
272
}
273
{
274
+
action = "diagnostic_jump_previous";
275
key = "E";
276
options.desc = "Previous Diagnostic";
277
}
278
{
279
+
action = "goto_definition";
280
key = "d";
281
options.desc = "Jump to Definition";
282
}
283
{
284
+
action = "peek_definition";
285
key = "D";
286
options.desc = "Peek Definition";
287
}
288
{
289
+
action = "finder ref";
290
key = "fr";
291
options.desc = "Find References";
292
}
293
{
294
+
action = "finder imp";
295
key = "fi";
296
options.desc = "Find Implementations";
297
}
298
{
299
+
action = "finder def";
300
key = "fd";
301
options.desc = "Find Definitions";
302
}
303
{
304
+
action = "finder";
305
key = "ff";
306
options.desc = "Finder";
307
}
308
{
309
+
action = "hover_doc";
310
key = "h";
311
options.desc = "Hover Doc";
312
}
313
];
314
}
315
{
316
+
group = "Telescope";
317
+
prefix = " ";
318
+
cmdPrefix = "Telescope";
319
+
keys = [
320
+
{
321
+
key = "u";
322
+
action = "undo";
323
+
options.desc = "Undo Tree";
324
+
}
325
+
{
326
+
key = "c";
327
+
action = "commands";
328
+
options.desc = "Browse Commands";
329
+
}
330
+
{
331
+
key = "w";
332
+
action = "spell_suggest";
333
+
options.desc = "Spell Suggest";
334
+
}
335
+
{
336
+
key = "s";
337
+
action = "lsp_document_symbols";
338
+
options.desc = "LSP Symbols";
339
+
}
340
+
{
341
+
key = "t";
342
+
action = "treesitter";
343
+
options.desc = "Treesitter Symbols";
344
+
}
345
+
{
346
+
key = "f";
347
+
action = "find_files";
348
+
options.desc = "Files";
349
+
}
350
+
{
351
+
key = "gs";
352
+
action = "git_status";
353
+
options.desc = "Git Status";
354
+
}
355
+
{
356
+
key = "gb";
357
+
action = "git_branches";
358
+
options.desc = "Git Branches";
359
+
}
360
+
{
361
+
key = "gc";
362
+
action = "git_commits";
363
+
options.desc = "Git Commits";
364
+
}
365
+
{
366
+
key = "r";
367
+
action = "oldfiles";
368
+
options.desc = "Recent Files";
369
+
}
370
+
{
371
+
key = "f";
372
+
action = "live_grep";
373
+
options.desc = "Live Grep";
374
+
}
375
+
];
376
}
377
{
378
action.__raw = "[[<C-\\><C-n><C-w>]]";
···
394
extraPlugins = with pkgs.vimPlugins;
395
(lib.optional config.cow.dev.web {plugin = pkgs.nvim-mdx;})
396
++ [
397
+
{plugin = flatten-nvim;} # Opens neovim invocations in terminal windows in the current Neovim session
398
+
{plugin = satellite-nvim;} # Scrollbar
399
+
{plugin = tiny-devicons-auto-colors-nvim;} # Color language icons
400
];
401
402
plugins = {
403
+
# Navigation
404
+
405
+
# Interactive Fuzzy Search w/ various providers
406
telescope = {
407
enable = true;
408
settings.defaults = {
···
413
ui-select.enable = true;
414
undo.enable = true;
415
};
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
416
};
417
418
+
# Highlight current row
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
419
illuminate.enable = true;
420
+
# Underline matching token in buffer
421
cursorline.enable = true;
422
423
+
# Nicer bdelete
0
0
0
0
424
bufdelete.enable = true;
425
426
+
# Tab bar
427
bufferline = {
428
enable = true;
429
+
settings.highlights.__raw = lib.mkIf config.cow.cat.enable ''
430
require("catppuccin.special.bufferline").get_theme()
431
'';
432
settings.options = {
···
437
{
438
filetype = "neo-tree";
439
highlight = "String";
440
+
text = "Files";
441
text_align = "center";
442
# separator = true;
443
}
444
];
445
separator_style = "slant";
0
446
hover = {
447
enabled = true;
448
delay = 150;
···
459
};
460
};
461
462
+
# Tree file manager
463
+
neo-tree = {
464
+
enable = true;
465
+
settings = {
466
+
hide_root_node = false;
467
+
follow_current_file.enabled = true;
468
+
add_blank_line_at_top = true;
469
+
default_component_configs = {
470
+
container.right_padding = 2;
471
+
name.trailing_slash = true;
472
+
indent = {
473
+
indent_size = 2;
474
+
with_expanders = true;
475
+
};
476
+
};
477
+
window.width = 40;
478
+
auto_clean_after_session_restore = true;
479
+
close_if_last_window = true;
480
+
filesystem.components.name.__raw = ''
481
+
function(config, node, state)
482
+
local components = require('neo-tree.sources.common.components')
483
+
local name = components.name(config, node, state)
484
+
if node:get_depth() == 1 then
485
+
name.text = vim.fs.basename(vim.loop.cwd() or "") .. "/"
486
+
end
487
+
return name
488
+
end
489
+
'';
490
+
};
491
+
};
492
+
493
+
# In-buffer UI/tweaks
494
+
495
+
# Toggle relativenumber off when inserting
496
+
numbertoggle.enable = true;
497
+
498
+
# Folding implementation
499
+
nvim-ufo.enable = true;
500
+
501
+
# Nicer indenting
502
+
indent-o-matic.enable = true;
503
+
intellitab.enable = true;
504
+
505
+
# Image Previews
506
+
image.enable = true;
507
+
508
+
# Completions
509
+
cmp = {
510
+
enable = true;
511
+
settings = {
512
+
sources = map (name: {inherit name;}) [
513
+
"nvim_lsp"
514
+
"nvim_lsp_signature_help"
515
+
"path"
516
+
"buffer"
517
+
];
518
+
mapping = {
519
+
"<Esc>" = "cmp.mapping.abort()";
520
+
"<Tab>" = "cmp.mapping.confirm({ select = true })";
521
+
"<Up>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
522
+
"<Down>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
523
+
};
524
+
};
525
+
};
526
+
527
+
# LSP Completion providers
528
+
cmp-nvim-lsp.enable = true;
529
+
cmp-nvim-lsp-document-symbol.enable = true;
530
+
531
+
# Common Spellings
532
+
cmp-spell.enable = true;
533
+
534
+
# Color-coded matching symbols
535
+
rainbow-delimiters.enable = true;
536
+
537
+
# dropbar = {
538
+
# enable = true;
539
+
# settings = {
540
+
# bar.padding.right = 5;
541
+
# bar.padding.left = 1;
542
+
# };
543
+
# };
544
+
545
+
# Line number column + LSP + folding + etc.
546
statuscol = {
547
enable = true;
548
settings.segments = let
···
590
];
591
};
592
593
+
# Informational bottom line
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
594
lualine = {
595
enable = true;
596
settings = {
···
600
];
601
602
options = {
603
+
theme = lib.mkIf config.cow.cat.enable "catppuccin";
604
disabled_filetypes = ["neo-tree"];
605
ignore_focus = ["neo-tree"];
606
};
607
};
608
};
609
610
+
# New Windows
0
0
0
0
0
0
0
0
0
0
0
0
611
612
+
# Nice notifications and progress indicator
613
+
fidget = {
614
enable = true;
615
+
settings.notification = {
616
+
override_vim_notify = true;
617
+
window = {
618
+
y_padding = 2;
619
+
x_padding = 2;
620
+
zindex = 50;
621
+
align = "top";
622
+
winblend = 0;
0
0
623
};
0
0
0
0
0
0
0
0
0
0
0
0
0
624
};
625
};
626
627
+
# Interactive keybind helper
0
0
0
0
0
0
0
0
0
0
0
628
which-key = {
629
enable = true;
630
settings = {
···
634
};
635
};
636
637
+
# Toggle a Terminal Window
638
+
toggleterm = {
639
enable = true;
640
+
luaConfig.post = ''
641
+
local flatten = require('flatten')
642
+
643
+
---@type Terminal?
644
+
local saved_terminal
645
+
646
+
flatten.setup({
647
+
hooks = {
648
+
should_block = function(argv)
649
+
return vim.tbl_contains(argv, "-b")
650
+
end,
651
+
pre_open = function()
652
+
local term = require("toggleterm.terminal")
653
+
local termid = term.get_focused_id()
654
+
saved_terminal = term.get(termid)
655
+
end,
656
+
post_open = function(opts)
657
+
if saved_terminal then
658
+
saved_terminal:close()
659
+
else
660
+
vim.api.nvim_set_current_win(opts.winnr)
661
+
end
662
+
663
+
if opts.filetype == "gitcommit" or opts.filetype == "gitrebase" then
664
+
vim.api.nvim_create_autocmd("BufWritePost", {
665
+
buffer = opts.bufnr,
666
+
once = true,
667
+
callback = vim.schedule_wrap(function()
668
+
require('bufdelete').bufdelete(opts.bufnr, true)
669
+
end),
670
+
})
671
+
end
672
+
end,
673
+
block_end = function()
674
+
vim.schedule(function()
675
+
if saved_terminal then
676
+
saved_terminal:open()
677
+
saved_terminal = nil
678
+
end
679
+
end)
680
+
end,
681
+
},
682
+
window = {
683
+
open = "alternate",
684
+
},
685
+
})
686
+
'';
687
+
settings = {
688
+
size = 20;
689
+
open_mapping = "[[<C-x>]]";
690
+
direction = "horizontal";
691
+
start_in_insert = true;
692
+
insert_mappings = true;
693
+
terminal_mappings = true;
694
};
695
};
696
697
+
# Language Integration and LSPs
0
0
0
0
0
0
0
0
0
0
0
0
0
0
698
699
+
# Provider for syntax highlighting, symbols, etc. when not using an LSP
700
+
treesitter = {
701
enable = true;
702
+
luaConfig.post = lib.mkIf config.cow.dev.web ''
703
+
require('mdx').setup()
704
+
'';
705
settings = {
706
+
highlight.enable = true;
0
0
0
0
0
0
0
0
0
0
0
707
};
708
};
709
710
+
# Formatting code using multiple providers
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
711
conform-nvim = {
712
enable = true;
713
settings.default_format_opts = {
···
729
'';
730
};
731
732
+
# Common buffer type associations to activate LSPs
733
lspconfig.enable = true;
734
735
+
# UI for many LSP features
736
lspsaga = {
737
enable = true;
738
settings = {
···
757
};
758
};
759
760
+
# Get latest version of deps in a Cargo.toml as inline hints
761
+
crates.enable = lib.mkDefault config.cow.dev.rust;
762
763
+
# Misc. UI
764
765
+
# UI and provider for diagnostics
766
+
trouble = {
767
+
enable = true;
768
+
};
769
+
770
+
# Icons used in many places for languages
771
+
web-devicons.enable = true;
772
};
773
774
+
lsp = lib.mkDefault {
775
inlayHints.enable = true;
776
777
servers = let
···
792
# ghcPackage = pkgs.haskell.compiler.ghc912;
793
package = pkgs.haskell.packages.ghc912.haskell-language-server;
794
};
0
795
mdx_analyzer = lib.mkIf web {
796
enable = true;
797
package = pkgs.mdx-language-server;
798
};
0
799
ts_ls.enable = web;
800
html.enable = web;
801
marksman.enable = web;
···
804
yamlls.enable = web;
805
ruff.enable = python;
806
csharp_ls.enable = dotnet;
0
807
nil_ls.enable = true;
808
bashls.enable = true;
809
nushell.enable = config.cow.nushell.enable;
···
816
};
817
lemminx.enable = web;
818
eslint.enable = web;
819
+
just.enable = config.cow.utils.enable;
820
};
821
};
822
};
+9
-7
nixosModules/network.nix
···
46
services = lib.mkDefault {
47
resolved = {
48
enable = true;
49
-
llmnr = "false";
50
-
fallbackDns = [
51
-
"2606:4700:4700::1111"
52
-
"2606:4700:4700::1001"
53
-
"1.1.1.1"
54
-
"1.0.0.1"
55
-
];
0
0
56
};
57
timesyncd.servers = map (x: "time-${x}-g.nist.gov") [
58
"a"
···
46
services = lib.mkDefault {
47
resolved = {
48
enable = true;
49
+
settings.Resolve = {
50
+
LLMNR = "false";
51
+
FallbackDNS = [
52
+
"2606:4700:4700::1111"
53
+
"2606:4700:4700::1001"
54
+
"1.1.1.1"
55
+
"1.0.0.1"
56
+
];
57
+
};
58
};
59
timesyncd.servers = map (x: "time-${x}-g.nist.gov") [
60
"a"