diff --git a/modules/modules.nix b/modules/modules.nix index ee37a0e7..6e05c592 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -48,6 +48,7 @@ # The neovim wrapper, used to build a wrapped neovim package # using the configuration passed in `neovim` and `plugins` modules. wrapper = map (p: ./wrapper + "/${p}") [ + "build" "environment" "rc" "warnings" diff --git a/modules/wrapper/build/config.nix b/modules/wrapper/build/config.nix new file mode 100644 index 00000000..85c87dd6 --- /dev/null +++ b/modules/wrapper/build/config.nix @@ -0,0 +1,111 @@ +{ + inputs, + lib, + config, + pkgs, + ... +} +: let + inherit (pkgs) vimPlugins; + inherit (lib.strings) isString; + inherit (lib.lists) filter map; + + # alias to the internal configuration + vimOptions = config.vim; + + noBuildPlug = {pname, ...} @ attrs: let + src = inputs."plugin-${attrs.pname}"; + in + { + version = src.shortRev or src.shortDirtyRev or "dirty"; + outPath = src; + passthru.vimPlugin = false; + } + // attrs; + + # build a vim plugin with the given name and arguments + # if the plugin is nvim-treesitter, warn the user to use buildTreesitterPlug + # instead + buildPlug = attrs: let + src = inputs."plugin-${attrs.pname}"; + in + pkgs.vimUtils.buildVimPlugin ( + { + version = src.shortRev or src.shortDirtyRev or "dirty"; + inherit src; + } + // attrs + ); + + buildTreesitterPlug = grammars: vimPlugins.nvim-treesitter.withPlugins (_: grammars); + + pluginBuilders = { + nvim-treesitter = buildTreesitterPlug vimOptions.treesitter.grammars; + flutter-tools-patched = buildPlug { + pname = "flutter-tools"; + patches = [../patches/flutter-tools.patch]; + }; + }; + + buildConfigPlugins = plugins: + map ( + plug: + if (isString plug) + then pluginBuilders.${plug} or (noBuildPlug {pname = plug;}) + else plug + ) (filter (f: f != null) plugins); + + # built (or "normalized") plugins that are modified + builtStartPlugins = buildConfigPlugins vimOptions.startPlugins; + builtOptPlugins = map (package: package // {optional = true;}) (buildConfigPlugins vimOptions.optPlugins); + + # additional Lua and Python3 packages, mapped to their respective functions + # to conform to the format mnw expects. end user should + # only ever need to pass a list of packages, which are modified + # here + extraLuaPackages = ps: map (x: ps.${x}) vimOptions.luaPackages; + extraPython3Packages = ps: map (x: ps.${x}) vimOptions.python3Packages; + + # Wrap the user's desired (unwrapped) Neovim package with arguments that'll be used to + # generate a wrapped Neovim package. + neovim-wrapped = inputs.mnw.lib.wrap pkgs { + neovim = vimOptions.package; + plugins = builtStartPlugins ++ builtOptPlugins; + appName = "nvf"; + extraBinPath = vimOptions.extraPackages; + initLua = vimOptions.builtLuaConfigRC; + luaFiles = vimOptions.extraLuaFiles; + + inherit (vimOptions) viAlias vimAlias withRuby withNodeJs withPython3; + inherit extraLuaPackages extraPython3Packages; + }; + + dummyInit = pkgs.writeText "nvf-init.lua" vimOptions.builtLuaConfigRC; + # Additional helper scripts for printing and displaying nvf configuration + # in your commandline. + printConfig = pkgs.writers.writeDashBin "nvf-print-config" "cat ${dummyInit}"; + printConfigPath = pkgs.writers.writeDashBin "nvf-print-config-path" "echo -n ${dummyInit}"; + + # Expose wrapped neovim-package for userspace + # or module consumption. + neovim = pkgs.symlinkJoin { + name = "nvf-with-helpers"; + paths = [neovim-wrapped printConfig printConfigPath]; + postBuild = "echo Helpers added"; + + # Allow evaluating vimOptions, i.e., config.vim from the packages' passthru + # attribute. For example, packages.x86_64-linux.neovim.passthru.neovimConfig + # will return the configuration in full. + passthru.neovimConfig = vimOptions; + + meta = + neovim-wrapped.meta + // { + description = "Wrapped Neovim package with helper scripts to print the config (path)"; + }; + }; +in { + config.vim.build = { + finalPackage = neovim; + }; +} diff --git a/modules/wrapper/build/default.nix b/modules/wrapper/build/default.nix new file mode 100644 index 00000000..88af7381 --- /dev/null +++ b/modules/wrapper/build/default.nix @@ -0,0 +1,3 @@ +{ + imports = [./options.nix ./config.nix]; +} diff --git a/modules/wrapper/build/options.nix b/modules/wrapper/build/options.nix new file mode 100644 index 00000000..fa1db61e --- /dev/null +++ b/modules/wrapper/build/options.nix @@ -0,0 +1,12 @@ +{lib, ...}: let + inherit (lib.types) package; + inherit (lib.options) mkOption; +in { + options.vim.build = { + finalPackage = mkOption { + type = package; + readOnly = true; + description = "final output package"; + }; + }; +}