diff options
-rw-r--r-- | pkgs/applications/editors/neovim/wrapper.nix | 1 | ||||
-rw-r--r-- | pkgs/misc/vim-plugins/vim-utils.nix | 159 | ||||
-rw-r--r-- | pkgs/test/default.nix | 2 | ||||
-rw-r--r-- | pkgs/test/vim/default.nix | 72 |
4 files changed, 122 insertions, 112 deletions
diff --git a/pkgs/applications/editors/neovim/wrapper.nix b/pkgs/applications/editors/neovim/wrapper.nix index 41ff62a619fb8..8b42191bde69f 100644 --- a/pkgs/applications/editors/neovim/wrapper.nix +++ b/pkgs/applications/editors/neovim/wrapper.nix @@ -1,5 +1,4 @@ { stdenv, symlinkJoin, lib, makeWrapper -, vimUtils , writeText , bundlerEnv, ruby , nodejs diff --git a/pkgs/misc/vim-plugins/vim-utils.nix b/pkgs/misc/vim-plugins/vim-utils.nix index fd66c48ecb2c7..c55e8aa0a011e 100644 --- a/pkgs/misc/vim-plugins/vim-utils.nix +++ b/pkgs/misc/vim-plugins/vim-utils.nix @@ -1,4 +1,5 @@ -{ lib, stdenv, vim, vimPlugins, vim_configurable, neovim, buildEnv, writeText, writeScriptBin +# tests available at pkgs/test/vim +{ lib, stdenv, vim, vimPlugins, vim_configurable, buildEnv, writeText, writeScriptBin , nix-prefetch-hg, nix-prefetch-git , fetchFromGitHub, runtimeShell }: @@ -183,13 +184,49 @@ let rtpPath = "share/vim-plugins"; + nativeImpl = packages: lib.optionalString (packages != null) + (let + link = (packageName: dir: pluginPath: "ln -sf ${pluginPath}/share/vim-plugins/* $out/pack/${packageName}/${dir}"); + packageLinks = (packageName: {start ? [], opt ? []}: + let + # `nativeImpl` expects packages to be derivations, not strings (as + # opposed to older implementations that have to maintain backwards + # compatibility). Therefore we don't need to deal with "knownPlugins" + # and can simply pass `null`. + depsOfOptionalPlugins = lib.subtractLists opt (findDependenciesRecursively opt); + startWithDeps = findDependenciesRecursively start; + in + [ "mkdir -p $out/pack/${packageName}/start" ] + # To avoid confusion, even dependencies of optional plugins are added + # to `start` (except if they are explicitly listed as optional plugins). + ++ (builtins.map (link packageName "start") (lib.unique (startWithDeps ++ depsOfOptionalPlugins))) + ++ ["mkdir -p $out/pack/${packageName}/opt"] + ++ (builtins.map (link packageName "opt") opt) + ); + packDir = (packages: + stdenv.mkDerivation { + name = "vim-pack-dir"; + src = ./.; + installPhase = lib.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList packageLinks packages)); + preferLocalBuild = true; + } + ); + in + '' + set packpath^=${packDir packages} + set runtimepath^=${packDir packages} + ''); + vimrcContent = { packages ? null, vam ? null, pathogen ? null, plug ? null, - beforePlugins ? "", - customRC ? "" + beforePlugins ? '' + " configuration generated by NIX + set nocompatible + '', + customRC ? null }: let @@ -301,56 +338,16 @@ let call vam#Scripts(l, {}) ''); - nativeImpl = lib.optionalString (packages != null) - (let - link = (packageName: dir: pluginPath: "ln -sf ${pluginPath}/share/vim-plugins/* $out/pack/${packageName}/${dir}"); - packageLinks = (packageName: {start ? [], opt ? []}: - let - # `nativeImpl` expects packages to be derivations, not strings (as - # opposed to older implementations that have to maintain backwards - # compatibility). Therefore we don't need to deal with "knownPlugins" - # and can simply pass `null`. - depsOfOptionalPlugins = lib.subtractLists opt (findDependenciesRecursively opt); - startWithDeps = findDependenciesRecursively start; - in - ["mkdir -p $out/pack/${packageName}/start"] - # To avoid confusion, even dependencies of optional plugins are added - # to `start` (except if they are explicitly listed as optional plugins). - ++ (builtins.map (link packageName "start") (lib.unique (startWithDeps ++ depsOfOptionalPlugins))) - ++ ["mkdir -p $out/pack/${packageName}/opt"] - ++ (builtins.map (link packageName "opt") opt) - ); - packDir = (packages: - stdenv.mkDerivation { - name = "vim-pack-dir"; - src = ./.; - installPhase = lib.concatStringsSep - "\n" - (lib.flatten (lib.mapAttrsToList packageLinks packages)); - preferLocalBuild = true; - } - ); - in - '' - set packpath^=${packDir packages} - set runtimepath^=${packDir packages} - - filetype indent plugin on | syn on - ''); - - in '' - " configuration generated by NIX - set nocompatible - - ${beforePlugins} + entries = [ + beforePlugins + vamImpl pathogenImpl plugImpl + (nativeImpl packages) + customRC + ]; - ${vamImpl} - ${pathogenImpl} - ${plugImpl} - ${nativeImpl} + in + lib.concatStringsSep "\n" (lib.filter (x: x != null && x != "") entries); - ${customRC} - ''; vimrcFile = settings: writeText "vimrc" (vimrcContent settings); in @@ -448,8 +445,6 @@ rec { ''; }; - vim_with_vim2nix = vim_configurable.customize { name = "vim"; vimrcConfig.vam.pluginDictionaries = [ "vim-addon-vim2nix" ]; }; - inherit (import ./build-vim-plugin.nix { inherit lib stdenv rtpPath vim; }) buildVimPlugin buildVimPluginFrom2Nix; # used to figure out which python dependencies etc. neovim needs @@ -475,62 +470,4 @@ rec { nativePlugins = lib.concatMap ({start?[], opt?[], knownPlugins?vimPlugins}: start++opt) nativePluginsConfigs; in nativePlugins ++ nonNativePlugins; - - - # test cases: - test_vim_with_vim_nix_using_vam = vim_configurable.customize { - name = "vim-with-vim-addon-nix-using-vam"; - vimrcConfig.vam.pluginDictionaries = [{name = "vim-nix"; }]; - }; - - test_vim_with_vim_nix_using_pathogen = vim_configurable.customize { - name = "vim-with-vim-addon-nix-using-pathogen"; - vimrcConfig.pathogen.pluginNames = [ "vim-nix" ]; - }; - - test_vim_with_vim_nix_using_plug = vim_configurable.customize { - name = "vim-with-vim-addon-nix-using-plug"; - vimrcConfig.plug.plugins = with vimPlugins; [ vim-nix ]; - }; - - test_vim_with_vim_nix = vim_configurable.customize { - name = "vim-with-vim-addon-nix"; - vimrcConfig.packages.myVimPackage.start = with vimPlugins; [ vim-nix ]; - }; - - # only neovim makes use of `requiredPlugins`, test this here - test_nvim_with_vim_nix_using_pathogen = neovim.override { - configure.pathogen.pluginNames = [ "vim-nix" ]; - }; - - # regression test for https://github.com/NixOS/nixpkgs/issues/53112 - # The user may have specified their own plugins which may not be formatted - # exactly as the generated ones. In particular, they may not have the `pname` - # attribute. - test_vim_with_custom_plugin = vim_configurable.customize { - name = "vim_with_custom_plugin"; - vimrcConfig.vam.knownPlugins = - vimPlugins // ({ - vim-trailing-whitespace = buildVimPluginFrom2Nix { - name = "vim-trailing-whitespace"; - src = fetchFromGitHub { - owner = "bronson"; - repo = "vim-trailing-whitespace"; - rev = "4c596548216b7c19971f8fc94e38ef1a2b55fee6"; - sha256 = "0f1cpnp1nxb4i5hgymjn2yn3k1jwkqmlgw1g02sq270lavp2dzs9"; - }; - # make sure string dependencies are handled - dependencies = [ "vim-nix" ]; - }; - }); - vimrcConfig.vam.pluginDictionaries = [ { names = [ "vim-trailing-whitespace" ]; } ]; - }; - - # system remote plugin manifest should be generated, deoplete should be usable - # without the user having to do `UpdateRemotePlugins`. To test, launch neovim - # and do `:call deoplete#enable()`. It will print an error if the remote - # plugin is not registered. - test_nvim_with_remote_plugin = neovim.override { - configure.pathogen.pluginNames = with vimPlugins; [ deoplete-nvim ]; - }; } diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix index fa93ceb0721e0..b24fc539c93d1 100644 --- a/pkgs/test/default.nix +++ b/pkgs/test/default.nix @@ -41,6 +41,8 @@ with pkgs; rustCustomSysroot = callPackage ./rust-sysroot {}; buildRustCrate = callPackage ../build-support/rust/build-rust-crate/test { }; + vim = callPackage ./vim {}; + nixos-functions = callPackage ./nixos-functions {}; patch-shebangs = callPackage ./patch-shebangs {}; diff --git a/pkgs/test/vim/default.nix b/pkgs/test/vim/default.nix new file mode 100644 index 0000000000000..4ca004a60c340 --- /dev/null +++ b/pkgs/test/vim/default.nix @@ -0,0 +1,72 @@ +{ vimUtils, vim_configurable, neovim, vimPlugins +, lib, fetchFromGitHub, +}: +let + inherit (vimUtils) buildVimPluginFrom2Nix; + + packages.myVimPackage.start = with vimPlugins; [ vim-nix ]; +in +{ + vim_empty_config = vimUtils.vimrcFile { beforePlugins = ""; customRC = ""; }; + + vim_with_vim2nix = vim_configurable.customize { + name = "vim"; vimrcConfig.vam.pluginDictionaries = [ "vim-addon-vim2nix" ]; + }; + + # test cases: + test_vim_with_vim_nix_using_vam = vim_configurable.customize { + name = "vim-with-vim-addon-nix-using-vam"; + vimrcConfig.vam.pluginDictionaries = [{name = "vim-nix"; }]; + }; + + test_vim_with_vim_nix_using_pathogen = vim_configurable.customize { + name = "vim-with-vim-addon-nix-using-pathogen"; + vimrcConfig.pathogen.pluginNames = [ "vim-nix" ]; + }; + + test_vim_with_vim_nix_using_plug = vim_configurable.customize { + name = "vim-with-vim-addon-nix-using-plug"; + vimrcConfig.plug.plugins = with vimPlugins; [ vim-nix ]; + }; + + test_vim_with_vim_nix = vim_configurable.customize { + name = "vim-with-vim-addon-nix"; + vimrcConfig.packages.myVimPackage.start = with vimPlugins; [ vim-nix ]; + }; + + # only neovim makes use of `requiredPlugins`, test this here + test_nvim_with_vim_nix_using_pathogen = neovim.override { + configure.pathogen.pluginNames = [ "vim-nix" ]; + }; + + # regression test for https://github.com/NixOS/nixpkgs/issues/53112 + # The user may have specified their own plugins which may not be formatted + # exactly as the generated ones. In particular, they may not have the `pname` + # attribute. + test_vim_with_custom_plugin = vim_configurable.customize { + name = "vim_with_custom_plugin"; + vimrcConfig.vam.knownPlugins = + vimPlugins // ({ + vim-trailing-whitespace = buildVimPluginFrom2Nix { + name = "vim-trailing-whitespace"; + src = fetchFromGitHub { + owner = "bronson"; + repo = "vim-trailing-whitespace"; + rev = "4c596548216b7c19971f8fc94e38ef1a2b55fee6"; + sha256 = "0f1cpnp1nxb4i5hgymjn2yn3k1jwkqmlgw1g02sq270lavp2dzs9"; + }; + # make sure string dependencies are handled + dependencies = [ "vim-nix" ]; + }; + }); + vimrcConfig.vam.pluginDictionaries = [ { names = [ "vim-trailing-whitespace" ]; } ]; + }; + + # system remote plugin manifest should be generated, deoplete should be usable + # without the user having to do `UpdateRemotePlugins`. To test, launch neovim + # and do `:call deoplete#enable()`. It will print an error if the remote + # plugin is not registered. + test_nvim_with_remote_plugin = neovim.override { + configure.pathogen.pluginNames = with vimPlugins; [ deoplete-nvim ]; + }; +} |