Flake for my NixOS devices

Neovim improvements

bwc9876.dev e99f6362 37fa66af

verified
+342 -453
+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 = " "; 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 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 }; 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 }; 182 183 keymaps = let 184 - prefixMap = pre: maps: 185 builtins.map (k: { 186 - action = "<cmd>${k.action}<cr>"; 187 - key = "${pre}${k.key}"; 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-.>"; 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"; 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 = { 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; 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 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 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 = { 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 = { 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 - }; 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 = { 794 enable = true; 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 850 lspconfig.enable = true; 851 852 lspsaga = { 853 enable = true; 854 settings = { ··· 873 }; 874 }; 875 876 - crates.enable = true; 877 878 - numbertoggle.enable = true; 879 880 - # rustaceanvim.enable = true; 881 - vim-css-color.enable = true; 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 23 24 enable = true; 25 enableMan = false; 26 defaultEditor = true; ··· 28 vimAlias = true; 29 30 nixpkgs.pkgs = pkgs; 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; 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 }) 105 ''; 106 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 } 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 = {}; 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 }; 416 }; 417 418 + # Highlight current row 419 illuminate.enable = true; 420 + # Underline matching token in buffer 421 cursorline.enable = true; 422 423 + # Nicer bdelete 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"; 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 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 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; 623 }; 624 }; 625 }; 626 627 + # Interactive keybind helper 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 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; 707 }; 708 }; 709 710 + # Formatting code using multiple providers 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 }; 795 mdx_analyzer = lib.mkIf web { 796 enable = true; 797 package = pkgs.mdx-language-server; 798 }; 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; 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 - ]; 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"