From d1c29486ebf97f13c11bfab9cc4c0e91a2f68ecc Mon Sep 17 00:00:00 2001 From: "Matthieu C." <886074+teto@users.noreply.github.com> Date: Wed, 25 Sep 2024 22:37:00 +0200 Subject: [PATCH 1/2] neovim: link packpath dir in XDG_DATA_HOME See previous attempt at https://github.com/nix-community/home-manager/pull/3717 and its revert at #3817 - link the packpath in expected folder so that even unwrapped neovim can pick home-manager's plugins. Right now the path to plugins (`:h rtp` / `:h packpath`) is set in the neovim wrapper. Not only is this unusual but if you want to run an unwrapped neovim (a neovim GUI or when you hack on neovim for instance), the app doesn't find plugins installed by home-manager. With this change, neovim can discover HM-installed plugins by itself and hopefully we can make neovim configuration less magical and surprising to newcomers. --- modules/programs/neovim.nix | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/programs/neovim.nix b/modules/programs/neovim.nix index af7a1a1f0..3bbb36400 100644 --- a/modules/programs/neovim.nix +++ b/modules/programs/neovim.nix @@ -391,20 +391,19 @@ in { suppressNotVimlConfig = p: if p.type != "viml" then p // { config = null; } else p; - neovimConfig = pkgs.neovimUtils.makeNeovimConfig { + neovimConfig = pkgs.wrapNeovimUnstable cfg.package { inherit (cfg) extraPython3Packages withPython3 withRuby viAlias vimAlias; withNodeJs = cfg.withNodeJs || cfg.coc.enable; plugins = map suppressNotVimlConfig pluginsNormalized; - customRC = cfg.extraConfig; - }; - - wrappedNeovim' = pkgs.wrapNeovimUnstable cfg.package (neovimConfig // { - wrapperArgs = - (lib.escapeShellArgs (neovimConfig.wrapperArgs ++ cfg.extraWrapperArgs)) - + " " + extraMakeWrapperArgs + " " + extraMakeWrapperLuaCArgs + " " + # it gets ignored + neovimRcContent = cfg.extraConfig; + wrapperArgs = (lib.escapeShellArgs (cfg.extraWrapperArgs)) + " " + + extraMakeWrapperArgs + " " + extraMakeWrapperLuaCArgs + " " + extraMakeWrapperLuaArgs; wrapRc = false; - }); + }; + + wrappedNeovim' = neovimConfig; in mkIf cfg.enable { programs.neovim.generatedConfigViml = neovimConfig.neovimRcContent; @@ -423,6 +422,14 @@ in { home.shellAliases = mkIf cfg.vimdiffAlias { vimdiff = "nvim -d"; }; + # link the packpath in expected folder so that even unwrapped neovim can pick + # home-manager's plugins + xdg.dataFile."nvim/site/pack/hm" = let + packpathDirs.hm = neovimConfig.vimPackage; + in { + source = "${pkgs.neovimUtils.packDir packpathDirs}/pack/hm"; + }; + xdg.configFile = let hasLuaConfig = lib.hasAttr "lua" config.programs.neovim.generatedConfigs; in lib.mkMerge ( From accbbb4a04fb653c55ab88a04646b48809896657 Mon Sep 17 00:00:00 2001 From: "Matthieu C." <886074+teto@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:43:17 +0100 Subject: [PATCH 2/2] neovim.tests: neovim-plugin-config make test TEST=neovim-plugin-config - would previously use `-u` which we precisely want to avoid relying on because of side-effects. Likewise, `-es` skips some initialization phase (see `:h startup`). - Instead of several stdout redirections, write to a file directly. - also logs more via -V3$out/log.txt to help debug --- tests/modules/programs/neovim/plugin-config.nix | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/modules/programs/neovim/plugin-config.nix b/tests/modules/programs/neovim/plugin-config.nix index 0e014bc79..5e1d4ea8f 100644 --- a/tests/modules/programs/neovim/plugin-config.nix +++ b/tests/modules/programs/neovim/plugin-config.nix @@ -21,10 +21,9 @@ lib.mkIf config.test.enableBig { _module.args.pkgs = lib.mkForce realPkgs; nmt.script = '' - vimout=$(mktemp) - echo "redir >> /dev/stdout | echo g:hmExtraConfig | echo g:hmPlugins | redir END" \ - | ${pkgs.neovim}/bin/nvim -es -u "$TESTED/home-files/.config/nvim/init.lua" \ - > "$vimout" || true + vimout=$out/nvim-output + export HOME=$TESTED/home-files + ${pkgs.neovim-unwrapped}/bin/nvim -i NONE -V3$out/log.txt +"redir >> $vimout | echo g:hmExtraConfig | echo g:hmPlugins | redir END" +'exit' assertFileContains "$vimout" "HM_EXTRA_CONFIG" assertFileContains "$vimout" "HM_PLUGINS_CONFIG" '';