Compare commits

..

1 commit

Author SHA1 Message Date
Ching Pei Yang
01744b650f
Merge da26ea78b2 into 46aa168b2d 2024-12-22 20:59:35 +00:00
4 changed files with 63 additions and 19 deletions

View file

@ -42,7 +42,7 @@
};
nixosModules = {
nvf = import ./flake/modules/nixos.nix self.packages lib inputs;
nvf = import ./flake/modules/nixos.nix self.packages lib;
default = self.nixosModules.nvf;
neovim-flake =
lib.warn ''

View file

@ -1,5 +1,5 @@
# NixOS module
packages: lib: inputs: {
packages: lib: {
config,
pkgs,
...
@ -8,19 +8,15 @@ packages: lib: inputs: {
inherit (lib.modules) mkIf mkOverride mkAliasOptionModule;
inherit (lib.lists) optional;
inherit (lib.options) mkOption mkEnableOption literalExpression;
inherit (lib.types) anything bool submoduleWith;
inherit (lib.types) attrsOf anything bool;
inherit (lib.nvim) neovimConfiguration;
inherit (lib.nvim.types) anythingConcatLists;
cfg = config.programs.nvf;
nvfModule = submoduleWith {
description = "Nvf module";
class = "nvf";
specialArgs = {
inherit pkgs lib inputs;
};
modules = [
{imports = import ../../modules/modules.nix {inherit pkgs lib;};}
];
neovimConfigured = neovimConfiguration {
inherit pkgs;
modules = [cfg.settings];
};
in {
imports = [
@ -59,7 +55,7 @@ in {
};
settings = mkOption {
type = nvfModule;
type = attrsOf anythingConcatLists;
default = {};
description = "Attribute set of nvf preferences.";
example = literalExpression ''
@ -82,7 +78,7 @@ in {
};
config = mkIf cfg.enable {
programs.nvf.finalPackage = config.programs.nvf.settings.vim.build.finalPackage;
programs.nvf.finalPackage = neovimConfigured.neovim;
environment = {
variables.EDITOR = mkIf cfg.defaultEditor (mkOverride 900 "nvim");

View file

@ -1,9 +1,57 @@
{lib}: let
inherit (lib.options) mergeEqualOption;
inherit (lib.strings) isString;
inherit (lib.types) listOf mkOptionType;
inherit (builtins) stringLength match;
inherit (lib.options) showOption showFiles getFiles mergeOneOption mergeEqualOption;
inherit (lib.strings) isString isStringLike;
inherit (lib.types) anything attrsOf listOf mkOptionType;
inherit (lib.nvim.types) anythingConcatLists;
inherit (builtins) typeOf isAttrs any head concatLists stringLength match;
in {
# HACK: Does this break anything in our case?
# A modified version of the nixpkgs anything type that concatenates lists
# This isn't the default because the order in which the lists are concatenated depends on the order in which the modules are imported,
# which makes it non-deterministic
anythingConcatLists =
anything
// {
merge = loc: defs: let
getType = value:
if isAttrs value && isStringLike value
then "stringCoercibleSet"
else typeOf value;
# Throw an error if not all defs have the same type
checkType = getType (head defs).value;
commonType =
if any (def: getType def.value != checkType) defs
then throw "The option `${showOption loc}' has conflicting option types in ${showFiles (getFiles defs)}"
else checkType;
mergeFunctions = {
# Recursively merge attribute sets
set = (attrsOf anythingConcatLists).merge;
# Overridden behavior for lists, that concatenates lists
list = _: defs: concatLists (map (e: e.value) defs);
# This means it's a package, only accept a single definition
stringCoercibleSet = mergeOneOption;
# This works by passing the argument to the functions,
# and merging their returns values instead
lambda = loc: defs: arg:
anythingConcatLists.merge
(loc ++ ["<function body>"])
(map (def: {
inherit (def) file;
value = def.value arg;
})
defs);
};
in
# Merge the defs with the correct function from above, if available
# otherwise only allow equal values
(mergeFunctions.${commonType} or mergeEqualOption) loc defs;
};
mergelessListOf = elemType: let
super = listOf elemType;
in

View file

@ -11,5 +11,5 @@ in {
inherit (typesDag) dagOf;
inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType;
inherit (typesLanguage) diagnostics mkGrammarOption;
inherit (customTypes) char hexColor mergelessListOf;
inherit (customTypes) anythingConcatLists char hexColor mergelessListOf;
}