2020-10-29 08:50:26 +00:00
|
|
|
{ lib
|
2022-06-19 13:18:16 +01:00
|
|
|
, buildLuarocksPackage
|
|
|
|
, callPackage
|
2020-10-29 08:50:26 +00:00
|
|
|
, vimUtils
|
|
|
|
, nodejs
|
|
|
|
, neovim-unwrapped
|
|
|
|
, bundlerEnv
|
|
|
|
, ruby
|
|
|
|
, python3Packages
|
|
|
|
, writeText
|
|
|
|
, wrapNeovimUnstable
|
|
|
|
}:
|
|
|
|
let
|
|
|
|
# returns everything needed for the caller to wrap its own neovim:
|
|
|
|
# - the generated content of the future init.vim
|
|
|
|
# - the arguments to wrap neovim with
|
|
|
|
# The caller is responsible for writing the init.vim and adding it to the wrapped
|
|
|
|
# arguments (["-u" writeText "init.vim" GENERATEDRC)]).
|
|
|
|
# This makes it possible to write the config anywhere: on a per-project basis
|
|
|
|
# .nvimrc or in $XDG_CONFIG_HOME/nvim/init.vim to avoid sideeffects.
|
|
|
|
# Indeed, note that wrapping with `-u init.vim` has sideeffects like .nvimrc wont be loaded
|
|
|
|
# anymore, $MYVIMRC wont be set etc
|
|
|
|
makeNeovimConfig =
|
|
|
|
{
|
|
|
|
withPython2 ? false
|
|
|
|
/* the function you would have passed to python.withPackages */
|
|
|
|
, extraPython2Packages ? (_: [ ])
|
2020-11-02 20:59:00 +00:00
|
|
|
, withPython3 ? true
|
2020-10-29 08:50:26 +00:00
|
|
|
/* the function you would have passed to python3.withPackages */
|
|
|
|
, extraPython3Packages ? (_: [ ])
|
|
|
|
, withNodeJs ? false
|
|
|
|
, withRuby ? true
|
2021-08-31 18:28:57 +01:00
|
|
|
/* the function you would have passed to lua.withPackages */
|
|
|
|
, extraLuaPackages ? (_: [ ])
|
2020-10-29 08:50:26 +00:00
|
|
|
|
2021-05-21 11:48:43 +01:00
|
|
|
# expects a list of plugin configuration
|
|
|
|
# expects { plugin=far-vim; config = "let g:far#source='rg'"; optional = false; }
|
|
|
|
, plugins ? []
|
|
|
|
# forwarded to configure.customRC
|
|
|
|
, customRC ? ""
|
2020-10-29 08:50:26 +00:00
|
|
|
# same values as in vimUtils.vimrcContent
|
|
|
|
, configure ? { }
|
|
|
|
|
|
|
|
# for forward compability, when adding new environments, haskell etc.
|
|
|
|
, ...
|
2020-11-03 08:26:59 +00:00
|
|
|
}@args:
|
2020-10-29 08:50:26 +00:00
|
|
|
let
|
|
|
|
rubyEnv = bundlerEnv {
|
|
|
|
name = "neovim-ruby-env";
|
|
|
|
gemdir = ./ruby_provider;
|
|
|
|
postBuild = ''
|
|
|
|
ln -sf ${ruby}/bin/* $out/bin
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2021-05-21 11:48:43 +01:00
|
|
|
# transform all plugins into an attrset
|
|
|
|
pluginsNormalized = map (x: if x ? plugin then { optional = false; } // x else { plugin = x; optional = false;}) plugins;
|
|
|
|
|
|
|
|
|
|
|
|
configurePatched = configure // {
|
2021-05-29 15:36:39 +01:00
|
|
|
customRC = pluginRc + customRC + (configure.customRC or "");
|
2021-05-21 11:48:43 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
# A function to get the configuration string (if any) from an element of 'plugins'
|
|
|
|
pluginConfig = p:
|
|
|
|
if (p.config or "") != "" then ''
|
|
|
|
" ${p.plugin.pname or p.plugin.name} {{{
|
|
|
|
${p.config}
|
|
|
|
" }}}
|
|
|
|
'' else "";
|
|
|
|
|
|
|
|
pluginRc = lib.concatMapStrings pluginConfig pluginsNormalized;
|
|
|
|
|
|
|
|
requiredPlugins = vimUtils.requiredPlugins configurePatched;
|
2020-10-29 08:50:26 +00:00
|
|
|
getDeps = attrname: map (plugin: plugin.${attrname} or (_: [ ]));
|
|
|
|
|
|
|
|
pluginPython3Packages = getDeps "python3Dependencies" requiredPlugins;
|
|
|
|
python3Env = python3Packages.python.withPackages (ps:
|
|
|
|
[ ps.pynvim ]
|
|
|
|
++ (extraPython3Packages ps)
|
|
|
|
++ (lib.concatMap (f: f ps) pluginPython3Packages));
|
|
|
|
|
2021-09-11 23:01:49 +01:00
|
|
|
luaEnv = neovim-unwrapped.lua.withPackages(extraLuaPackages);
|
2020-10-29 08:50:26 +00:00
|
|
|
|
|
|
|
# Mapping a boolean argument to a key that tells us whether to add or not to
|
|
|
|
# add to nvim's 'embedded rc' this:
|
|
|
|
# let g:<key>_host_prog=$out/bin/nvim-<key>
|
|
|
|
# Or this:
|
2021-05-05 15:54:42 +01:00
|
|
|
# let g:loaded_${prog}_provider=0
|
2020-10-29 08:50:26 +00:00
|
|
|
# While the latter tells nvim that this provider is not available
|
|
|
|
hostprog_check_table = {
|
|
|
|
node = withNodeJs;
|
2021-05-05 15:54:42 +01:00
|
|
|
python = false;
|
2020-10-29 08:50:26 +00:00
|
|
|
python3 = withPython3;
|
|
|
|
ruby = withRuby;
|
|
|
|
};
|
|
|
|
## Here we calculate all of the arguments to the 1st call of `makeWrapper`
|
|
|
|
# We start with the executable itself NOTE we call this variable "initial"
|
|
|
|
# because if configure != {} we need to call makeWrapper twice, in order to
|
|
|
|
# avoid double wrapping, see comment near finalMakeWrapperArgs
|
|
|
|
makeWrapperArgs =
|
|
|
|
let
|
|
|
|
binPath = lib.makeBinPath (lib.optionals withRuby [ rubyEnv ] ++ lib.optionals withNodeJs [ nodejs ]);
|
|
|
|
|
|
|
|
flags = lib.concatLists (lib.mapAttrsToList (
|
|
|
|
prog: withProg: [
|
|
|
|
"--cmd" (genProviderSettings prog withProg)
|
|
|
|
]
|
|
|
|
)
|
|
|
|
hostprog_check_table);
|
|
|
|
in
|
|
|
|
[
|
2022-05-10 15:10:12 +01:00
|
|
|
"--inherit-argv0" "--add-flags" (lib.escapeShellArgs flags)
|
2020-10-29 08:50:26 +00:00
|
|
|
] ++ lib.optionals withRuby [
|
|
|
|
"--set" "GEM_HOME" "${rubyEnv}/${rubyEnv.ruby.gemPath}"
|
|
|
|
] ++ lib.optionals (binPath != "") [
|
|
|
|
"--suffix" "PATH" ":" binPath
|
2021-08-31 18:28:57 +01:00
|
|
|
] ++ lib.optionals (luaEnv != null) [
|
2021-09-11 23:01:49 +01:00
|
|
|
"--prefix" "LUA_PATH" ";" (neovim-unwrapped.lua.pkgs.lib.genLuaPathAbsStr luaEnv)
|
|
|
|
"--prefix" "LUA_CPATH" ";" (neovim-unwrapped.lua.pkgs.lib.genLuaCPathAbsStr luaEnv)
|
2020-10-29 08:50:26 +00:00
|
|
|
];
|
|
|
|
|
2021-05-21 11:48:43 +01:00
|
|
|
|
|
|
|
manifestRc = vimUtils.vimrcContent (configurePatched // { customRC = ""; }) ;
|
|
|
|
neovimRcContent = vimUtils.vimrcContent configurePatched;
|
2020-10-29 08:50:26 +00:00
|
|
|
in
|
2021-05-01 01:29:59 +01:00
|
|
|
assert withPython2 -> throw "Python2 support has been removed from neovim, please remove withPython2 and extraPython2Packages.";
|
|
|
|
|
2021-05-21 11:48:43 +01:00
|
|
|
builtins.removeAttrs args ["plugins"] // {
|
2020-10-29 08:50:26 +00:00
|
|
|
wrapperArgs = makeWrapperArgs;
|
|
|
|
inherit neovimRcContent;
|
|
|
|
inherit manifestRc;
|
|
|
|
inherit python3Env;
|
2021-08-31 18:28:57 +01:00
|
|
|
inherit luaEnv;
|
2020-11-02 20:59:00 +00:00
|
|
|
inherit withNodeJs;
|
|
|
|
} // lib.optionalAttrs withRuby {
|
|
|
|
inherit rubyEnv;
|
2020-10-29 08:50:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
genProviderSettings = prog: withProg:
|
|
|
|
if withProg then
|
|
|
|
"let g:${prog}_host_prog='${placeholder "out"}/bin/nvim-${prog}'"
|
|
|
|
else
|
2021-05-05 15:54:42 +01:00
|
|
|
"let g:loaded_${prog}_provider=0"
|
2020-10-29 08:50:26 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
# to keep backwards compatibility
|
|
|
|
legacyWrapper = neovim: {
|
2020-10-31 13:24:52 +00:00
|
|
|
extraMakeWrapperArgs ? ""
|
2021-05-01 01:29:59 +01:00
|
|
|
, withPython ? false
|
2020-10-29 08:50:26 +00:00
|
|
|
/* the function you would have passed to python.withPackages */
|
|
|
|
, extraPythonPackages ? (_: [])
|
|
|
|
/* the function you would have passed to python.withPackages */
|
|
|
|
, withPython3 ? true, extraPython3Packages ? (_: [])
|
2021-08-31 18:28:57 +01:00
|
|
|
/* the function you would have passed to lua.withPackages */
|
|
|
|
, extraLuaPackages ? (_: [])
|
2020-10-29 08:50:26 +00:00
|
|
|
, withNodeJs ? false
|
|
|
|
, withRuby ? true
|
|
|
|
, vimAlias ? false
|
|
|
|
, viAlias ? false
|
|
|
|
, configure ? {}
|
2021-05-28 22:44:43 +01:00
|
|
|
, extraName ? ""
|
2020-10-29 08:50:26 +00:00
|
|
|
}:
|
|
|
|
let
|
|
|
|
/* for compatibility with passing extraPythonPackages as a list; added 2018-07-11 */
|
|
|
|
compatFun = funOrList: (if builtins.isList funOrList then
|
|
|
|
(_: lib.warn "passing a list as extraPythonPackages to the neovim wrapper is deprecated, pass a function as to python.withPackages instead" funOrList)
|
|
|
|
else funOrList);
|
|
|
|
|
|
|
|
res = makeNeovimConfig {
|
|
|
|
inherit withPython3;
|
|
|
|
extraPython3Packages = compatFun extraPython3Packages;
|
2021-08-31 18:28:57 +01:00
|
|
|
inherit extraLuaPackages;
|
2020-11-03 08:26:59 +00:00
|
|
|
inherit withNodeJs withRuby viAlias vimAlias;
|
2020-10-29 08:50:26 +00:00
|
|
|
inherit configure;
|
2021-05-28 22:44:43 +01:00
|
|
|
inherit extraName;
|
2020-10-29 08:50:26 +00:00
|
|
|
};
|
|
|
|
in
|
2021-05-01 01:29:59 +01:00
|
|
|
assert withPython -> throw "Python2 support has been removed from neovim, please remove withPython and extraPythonPackages.";
|
|
|
|
|
2020-10-29 08:50:26 +00:00
|
|
|
wrapNeovimUnstable neovim (res // {
|
2021-12-03 15:37:52 +00:00
|
|
|
wrapperArgs = lib.escapeShellArgs res.wrapperArgs + " " + extraMakeWrapperArgs;
|
2021-05-29 15:36:39 +01:00
|
|
|
wrapRc = (configure != {});
|
2020-10-29 08:50:26 +00:00
|
|
|
});
|
|
|
|
in
|
|
|
|
{
|
|
|
|
inherit makeNeovimConfig;
|
|
|
|
inherit legacyWrapper;
|
2022-06-19 13:18:16 +01:00
|
|
|
|
|
|
|
buildNeovimPluginFrom2Nix = callPackage ./build-neovim-plugin.nix {
|
|
|
|
inherit (vimUtils) buildVimPluginFrom2Nix toVimPlugin;
|
|
|
|
inherit buildLuarocksPackage;
|
|
|
|
};
|
2020-10-29 08:50:26 +00:00
|
|
|
}
|