From 1ad3516705412f10d76308008a5810d80b499818 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Wed, 3 Jun 2026 21:59:21 -0500 Subject: update nvim configs and add projects dir --- home-manager/neovim.nix | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'home-manager') diff --git a/home-manager/neovim.nix b/home-manager/neovim.nix index 60608f6..5b8447d 100644 --- a/home-manager/neovim.nix +++ b/home-manager/neovim.nix @@ -1,13 +1,13 @@ { lib, config, pkgs, ... }: let cfg = config.programs._neovim; - extraPlugins = cfg.plugins.packages // { - start = (cfg.plugins.packages.start or []) - ++ lib.optionals cfg.plugins.lsp.enable [ cfg.plugins.lsp.pluginPackage ] - ++ lib.optionals cfg.plugins.treesitter.enable [ cfg.plugins.treesitter.pluginPackage ] - ++ lib.optionals cfg.plugins.treesitter.enable cfg.plugins.treesitter.parsers.packages; - }; - pluginDir = pkgs.linkFarm "nvim-site" + pluginDir = let + extraPlugins = cfg.plugins.packages // { + start = (cfg.plugins.packages.start or []) + ++ lib.optionals (cfg.plugins.lsp.enable && cfg.plugins.lsp.lspconfig.enable) [ cfg.plugins.lsp.lspconfig.pluginPackage ] + ++ lib.optionals cfg.plugins.treesitter.enable [ cfg.plugins.treesitter.pluginPackage ]; + }; + in pkgs.linkFarm "nvim-site" (lib.concatLists (lib.mapAttrsToList (stage: plugins: map (plugin: { name = "share/nvim/site/pack/plugins/${stage}/${plugin.name}"; @@ -15,8 +15,19 @@ }) plugins ) extraPlugins)); - extraPackages = cfg.extraPackages - ++ lib.optionals cfg.plugins.lsp.enable cfg.plugins.lsp.languageServers.packages; + extraPackages = pkgs.symlinkJoin { + name = "nvim-extra-packages"; + paths = cfg.extraPackages + ++ lib.optionals cfg.plugins.lsp.enable cfg.plugins.lsp.languageServers.packages; + }; + + parserDir = let + allTSParserPackages = builtins.filter lib.isDerivation + (builtins.attrValues config.plugins.treesitter.parsers.installAllFrom); + in pkgs.symlinkJoin { + name = "nvim-treesitter-parsers"; + paths = if cfg.plugins.treesitter.parsers.installAll then cfg.plugins.treesitter.parsers.packages else allTSParserPackages; + }; finalPackage = pkgs.symlinkJoin { name = "neovim-not-wrapped"; @@ -24,8 +35,13 @@ nativeBuildInputs = [ pkgs.makeWrapper ]; postBuild = '' wrapProgram $out/bin/nvim \ - --prefix PATH : ${pkgs.lib.makeBinPath extraPackages} \ - --prefix XDG_DATA_DIRS : ${pluginDir}/share + --prefix PATH : ${extraPackages} \ + --prefix XDG_DATA_DIRS : ${pluginDir}/share \ + '' + lib.optionalString cfg.plugins.treesitter.enable '' + --add-flags '--cmd "set rtp^=${parserDir}"' \ + --add-flags '--cmd "set rtp^=${cfg.plugins.treesitter.pluginPackage}/runtime"' \ + '' + '' + # blank line here to terminate multiline command string '' + lib.optionalString cfg.viAlias '' ln -s $out/bin/nvim $out/bin/vi '' + lib.optionalString cfg.vimAlias '' @@ -41,7 +57,10 @@ in { plugins = { lsp = { enable = lib.mkEnableOption "install defined language servers into nvim path"; - pluginPackage = lib.mkPackageOption pkgs.vimPlugins "nvim-lspconfig" {}; + lspconfig = { + enable = lib.mkEnableOption "install plugin `lspconfig.pluginPackage`"; + pluginPackage = lib.mkPackageOption pkgs.vimPlugins "nvim-lspconfig" {}; + }; languageServers.packages = lib.mkOption { type = lib.types.listOf lib.types.package; default = [ ]; @@ -51,6 +70,10 @@ in { treesitter = { enable = lib.mkEnableOption "install treesitter and parsers as nvim plugins"; pluginPackage = lib.mkPackageOption pkgs.vimPlugins "nvim-treesitter" {}; + parsers.installAll = lib.mkEnableOption "install all available parsers. overrides `parsers.packages`"; + parsers.installAllFrom = lib.mkPackageOption pkgs.vimPlugins "nvim-treesitter-parsers" { + extraDescription = "parent package from which to install all treesitter parsers"; + }; parsers.packages = lib.mkOption { type = lib.types.listOf lib.types.package; default = [ ]; -- cgit v1.2.3