diff --git a/pkgs/applications/editors/neovim/utils.nix b/pkgs/applications/editors/neovim/utils.nix index ae814fa9b4e..c753d2cca2c 100644 --- a/pkgs/applications/editors/neovim/utils.nix +++ b/pkgs/applications/editors/neovim/utils.nix @@ -148,6 +148,7 @@ let , vimAlias ? false , viAlias ? false , configure ? {} + , extraName ? "" }: let /* for compatibility with passing extraPythonPackages as a list; added 2018-07-11 */ @@ -160,6 +161,7 @@ let extraPython3Packages = compatFun extraPython3Packages; inherit withNodeJs withRuby viAlias vimAlias; inherit configure; + inherit extraName; }; in assert withPython -> throw "Python2 support has been removed from neovim, please remove withPython and extraPythonPackages."; diff --git a/pkgs/applications/editors/neovim/wrapper.nix b/pkgs/applications/editors/neovim/wrapper.nix index 7fa15efd82c..07a1dad7c09 100644 --- a/pkgs/applications/editors/neovim/wrapper.nix +++ b/pkgs/applications/editors/neovim/wrapper.nix @@ -27,23 +27,24 @@ let # set to false if you want to control where to save the generated config # (e.g., in ~/.config/init.vim or project/.nvimrc) , wrapRc ? true + , neovimRcContent ? "" , ... }@args: let wrapperArgsStr = if isString wrapperArgs then wrapperArgs else lib.escapeShellArgs wrapperArgs; - # If configure != {}, we can't generate the rplugin.vim file with e.g - # NVIM_SYSTEM_RPLUGIN_MANIFEST *and* NVIM_RPLUGIN_MANIFEST env vars set in - # the wrapper. That's why only when configure != {} (tested both here and - # when postBuild is evaluated), we call makeWrapper once to generate a - # wrapper with most arguments we need, excluding those that cause problems to - # generate rplugin.vim, but still required for the final wrapper. - finalMakeWrapperArgs = - [ "${neovim}/bin/nvim" "${placeholder "out"}/bin/nvim" ] - ++ [ "--set" "NVIM_SYSTEM_RPLUGIN_MANIFEST" "${placeholder "out"}/rplugin.vim" ] - ++ optionals wrapRc [ "--add-flags" "-u ${writeText "init.vim" args.neovimRcContent}" ] - ; + # If configure != {}, we can't generate the rplugin.vim file with e.g + # NVIM_SYSTEM_RPLUGIN_MANIFEST *and* NVIM_RPLUGIN_MANIFEST env vars set in + # the wrapper. That's why only when configure != {} (tested both here and + # when postBuild is evaluated), we call makeWrapper once to generate a + # wrapper with most arguments we need, excluding those that cause problems to + # generate rplugin.vim, but still required for the final wrapper. + finalMakeWrapperArgs = + [ "${neovim}/bin/nvim" "${placeholder "out"}/bin/nvim" ] + ++ [ "--set" "NVIM_SYSTEM_RPLUGIN_MANIFEST" "${placeholder "out"}/rplugin.vim" ] + ++ optionals wrapRc [ "--add-flags" "-u ${writeText "init.vim" neovimRcContent}" ] + ; in assert withPython2 -> throw "Python2 support has been removed from the neovim wrapper, please remove withPython2 and python2Env."; @@ -116,7 +117,10 @@ let preferLocalBuild = true; nativeBuildInputs = [ makeWrapper ]; - passthru = { unwrapped = neovim; }; + passthru = { + unwrapped = neovim; + initRc = neovimRcContent; + }; meta = neovim.meta // { # To prevent builds on hydra diff --git a/pkgs/test/vim/default.nix b/pkgs/test/vim/default.nix index c809940fc4c..3bdc3234134 100644 --- a/pkgs/test/vim/default.nix +++ b/pkgs/test/vim/default.nix @@ -1,9 +1,12 @@ { vimUtils, vim_configurable, writeText, neovim, vimPlugins , lib, fetchFromGitHub, neovimUtils, wrapNeovimUnstable , neovim-unwrapped +, fetchFromGitLab +, pkgs }: let inherit (vimUtils) buildVimPluginFrom2Nix; + inherit (neovimUtils) makeNeovimConfig; packages.myVimPackage.start = with vimPlugins; [ vim-nix ]; @@ -16,27 +19,55 @@ let } ]; - nvimConfNix = neovimUtils.makeNeovimConfig { + nvimConfNix = makeNeovimConfig { inherit plugins; customRC = '' " just a comment ''; }; - wrapNeovim = suffix: config: + nvimConfDontWrap = makeNeovimConfig { + inherit plugins; + customRC = '' + " just a comment + ''; + }; + + wrapNeovim2 = suffix: config: wrapNeovimUnstable neovim-unwrapped (config // { extraName = suffix; - wrapRc = true; }); + + nmt = fetchFromGitLab { + owner = "rycee"; + repo = "nmt"; + rev = "d2cc8c1042b1c2511f68f40e2790a8c0e29eeb42"; + sha256 = "1ykcvyx82nhdq167kbnpgwkgjib8ii7c92y3427v986n2s5lsskc"; + }; + + runTest = neovim-drv: buildCommand: + pkgs.runCommandLocal "test-${neovim-drv.name}" ({ + nativeBuildInputs = [ ]; + meta.platforms = neovim-drv.meta.platforms; + }) ('' + source ${nmt}/bash-lib/assertions.sh + vimrc="${writeText "init.vim" neovim-drv.initRc}" + vimrcGeneric="$out/patched.vim" + mkdir $out + ${pkgs.perl}/bin/perl -pe "s|\Q$NIX_STORE\E/[a-z0-9]{32}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" < "$vimrc" > "$vimrcGeneric" + '' + buildCommand); + in -{ + pkgs.recurseIntoAttrs ( +rec { vim_empty_config = vimUtils.vimrcFile { beforePlugins = ""; customRC = ""; }; ### neovim tests ################## - nvim_with_plugins = wrapNeovim "-with-plugins" nvimConfNix; + nvim_with_plugins = wrapNeovim2 "-with-plugins" nvimConfNix; nvim_via_override = neovim.override { + extraName = "-via-override"; configure = { packages.foo.start = [ vimPlugins.ale ]; customRC = '' @@ -45,6 +76,29 @@ in }; }; + + # nixpkgs should detect that no wrapping is necessary + nvimShouldntWrap = wrapNeovim2 "-should-not-wrap" nvimConfNix; + + + # this will generate a neovimRc content but we disable wrapping + nvimDontWrap = wrapNeovim2 "-dont-wrap" (makeNeovimConfig { + wrapRc = false; + customRC = '' + " this shouldn't trigger the creation of an init.vim + ''; + }); + + nvim_dontwrap-test = runTest nvimDontWrap '' + ! grep "-u" ${nvimDontWrap}/bin/nvim + ''; + + nvim_via_override-test = runTest nvim_via_override '' + assertFileContent \ + "$vimrcGeneric" \ + "${./neovim-override.vim}" + ''; + ### vim tests ################## vim_with_vim2nix = vim_configurable.customize { @@ -107,4 +161,4 @@ in test_nvim_with_remote_plugin = neovim.override { configure.pathogen.pluginNames = with vimPlugins; [ deoplete-nvim ]; }; -} +}) diff --git a/pkgs/test/vim/neovim-override.vim b/pkgs/test/vim/neovim-override.vim new file mode 100644 index 00000000000..34a1a8f1f43 --- /dev/null +++ b/pkgs/test/vim/neovim-override.vim @@ -0,0 +1,7 @@ +" configuration generated by NIX +set nocompatible + +set packpath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir +set runtimepath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir + +:help ale