/ plugins / default.nix
default.nix
  1  {
  2    inputs,
  3    lib,
  4    pkgs,
  5    stdenv,
  6    symlinkJoin,
  7    ...
  8  }:
  9  let
 10    inherit (builtins) readFile isPath;
 11    inherit (stdenv) mkDerivation;
 12  
 13    mkPlugin' =
 14      name:
 15      mkPlugin {
 16        inherit name;
 17        src = inputs.${name};
 18        module = null;
 19        config = "";
 20      };
 21  
 22    simplePlugins = [
 23      (mkPlugin' "aiken-neovim")
 24      (mkPlugin' "colorful-menu")
 25      (mkPlugin' "comment")
 26      (mkPlugin' "dressing")
 27      (mkPlugin' "friendly-snippets")
 28      (mkPlugin' "lspkind")
 29      (mkPlugin' "nio")
 30      (mkPlugin' "noice")
 31      (mkPlugin' "nui")
 32      (mkPlugin' "nvim-treesitter-endwise")
 33      (mkPlugin' "nvim-treesitter-just")
 34      (mkPlugin' "plenary")
 35      (mkPlugin' "which-key")
 36    ];
 37  
 38    mkPlugin =
 39      args@{
 40        inputs ? [ ],
 41        name,
 42        src,
 43        config ? "",
 44        depends ? [ ],
 45        ...
 46      }:
 47      let
 48        plugin = mkDerivation {
 49          inherit src;
 50          name = "nightvim-${name}";
 51          version = src.shortRev or "dev-nightvim";
 52  
 53          dontBuild = true;
 54          installPhase = ''
 55            mkdir -p $out/share/nightvim/pack/nightvim/opt/${name}
 56            cp -r . $out/share/nightvim/pack/nightvim/opt/${name}
 57          '';
 58  
 59          passthru.spec = {
 60            inherit
 61              name
 62              src
 63              inputs
 64              depends
 65              ;
 66  
 67            config = if isPath config then readFile config else config;
 68          };
 69        };
 70      in
 71      symlinkJoin {
 72        name = "${args.name}-with-tools";
 73        paths = [ plugin ] ++ inputs;
 74        inherit (plugin) passthru;
 75      };
 76  
 77    importPlugin =
 78      dir:
 79      import dir {
 80        inherit
 81          pkgs
 82          inputs
 83          mkPlugin
 84          lib
 85          ;
 86      };
 87  in
 88  symlinkJoin rec {
 89    name = "nightvim-plugins";
 90  
 91    paths =
 92      let
 93        inherit (builtins) readDir;
 94  
 95        dir = ./.;
 96        entries = readDir dir;
 97  
 98        importPluginPath =
 99          name:
100          let
101            path = dir + "/${name}";
102            type = (readDir dir).${name};
103          in
104          if type == "regular" && lib.hasSuffix ".nix" name && name != "default.nix" then
105            importPlugin (dir + "/${name}")
106          else if type == "directory" then
107            importPlugin path
108          else
109            null;
110  
111        # Filter out non-plugin entries and import all valid plugins
112        plugins = lib.filter (x: x != null) (map importPluginPath (builtins.attrNames entries));
113      in
114      plugins ++ simplePlugins;
115  
116    passthru.specs = map (p: p.spec) paths;
117  }