103 lines
2.7 KiB
Nix
103 lines
2.7 KiB
Nix
{ viAlias ? false
|
|
, vimAlias ? false
|
|
, extraConfig ? ""
|
|
, extraLuaConfig ? ""
|
|
, wrapNeovim
|
|
, neovim-unwrapped
|
|
, neovimPlugins
|
|
, pkgs
|
|
, lib
|
|
, nix2lua
|
|
, plugins ? { }
|
|
, modules ? { }
|
|
, ...
|
|
}:
|
|
|
|
|
|
let
|
|
plugins' = plugins;
|
|
modules' = modules;
|
|
|
|
mergeAttrs = v:
|
|
if builtins.isList v then
|
|
lib.foldl lib.recursiveUpdate { } (map mergeAttrs v)
|
|
else if v ? _type then
|
|
if v._type == "merge" then mergeAttrs v.contents
|
|
else if v._type == "if" then lib.optionalAttrs v.condition v.content
|
|
else builtins.abort "Unsupported attribute"
|
|
else v;
|
|
in
|
|
let
|
|
plugins = mergeAttrs plugins';
|
|
modules = mergeAttrs modules';
|
|
|
|
vim = import ./lib/vim.nix { inherit nix2lua; };
|
|
|
|
importModule = moduleName:
|
|
import (./modules + "/${moduleName}.nix") { inherit nix2lua pkgs vim lib; };
|
|
allModules = mergeAttrs (lib.mapAttrsToList importModule modules);
|
|
|
|
# Type: excludeOverride :: AttrSet -> AttrSet
|
|
excludeOverride = lib.filterAttrs (n: v: n != "override'");
|
|
# Type: pluginsWithModules :: AttrSet
|
|
pluginsWithModules = mergeAttrs [ (excludeOverride allModules) plugins ];
|
|
|
|
overridedNeovimPlugins =
|
|
if allModules ? override' then neovimPlugins // allModules.override'
|
|
else neovimPlugins;
|
|
|
|
# Type: getPluginByName :: string -> derivation
|
|
getPluginByName = lib.flip lib.getAttr overridedNeovimPlugins;
|
|
# Type: allPlugins :: AttrSet -> [derivation]
|
|
allPlugins = map getPluginByName (lib.attrNames pluginsWithModules);
|
|
|
|
/*
|
|
Type: mkPluginLuaConfig :: string -> a -> string
|
|
*/
|
|
mkPluginLuaConfig = name: cfg:
|
|
with nix2lua.lib;
|
|
"-- Plugin: ${builtins.trace "Plugin: ${name}" name}\n"
|
|
+ (if lib.isString cfg then cfg
|
|
else if lib.isAttrs cfg && cfg ? _type then toLua cfg
|
|
else if lib.isList cfg then toLua (spaceBetween cfg)
|
|
else if lib.isBool cfg then "" # Just skip lua config. Only enable the plugin.
|
|
else abort "[neovim] mkPluginLuaConfig: '${name}' has unsupported type '${builtins.typeOf cfg}'");
|
|
pluginLuaConfigs = lib.mapAttrsToList mkPluginLuaConfig pluginsWithModules;
|
|
|
|
basicLuaConfigs = map builtins.readFile [ ./config/basic.lua ];
|
|
|
|
allLuaConfigs = basicLuaConfigs ++ pluginLuaConfigs;
|
|
|
|
/*
|
|
Type: mkLuaHeredoc :: string -> string
|
|
*/
|
|
mkLuaHeredoc = content: ''
|
|
lua << EOF
|
|
${content}
|
|
EOF
|
|
'';
|
|
|
|
/*
|
|
Type: mkLuaRc :: [string] -> string
|
|
*/
|
|
mkLuaRc = list: lib.concatLines (map mkLuaHeredoc list);
|
|
in
|
|
(wrapNeovim neovim-unwrapped {
|
|
inherit viAlias;
|
|
inherit vimAlias;
|
|
|
|
withPython3 = false;
|
|
withNodeJs = false;
|
|
withRuby = false;
|
|
|
|
configure = {
|
|
customRC = extraConfig + mkLuaRc allLuaConfigs;
|
|
|
|
packages.myVimPackages = { start = allPlugins; };
|
|
};
|
|
}).overrideAttrs (oldAttrs: {
|
|
passthru = oldAttrs.passthru // {
|
|
nix2lua = nix2lua.lib;
|
|
inherit plugins modules;
|
|
};
|
|
})
|