nuScripts: add module
Manage completions, aliases etc. of nu_scripts
This commit is contained in:
parent
3b952efd79
commit
b4f5693750
|
@ -175,6 +175,7 @@ let
|
|||
./programs/noti.nix
|
||||
./programs/notmuch.nix
|
||||
./programs/nushell.nix
|
||||
./programs/nu-scripts.nix
|
||||
./programs/obs-studio.nix
|
||||
./programs/octant.nix
|
||||
./programs/offlineimap.nix
|
||||
|
|
107
modules/programs/nu-scripts.nix
Normal file
107
modules/programs/nu-scripts.nix
Normal file
|
@ -0,0 +1,107 @@
|
|||
{ pkgs, lib, config, ... }:
|
||||
let
|
||||
inherit (lib) mkIf mkEnableOption mkOption types pipe;
|
||||
|
||||
cfg = config.modules.nushell.nuScripts;
|
||||
scripts = "${pkgs.nu_scripts.outPath}/share/nu_scripts/";
|
||||
|
||||
managedIncludeOption = let
|
||||
filterOption = description:
|
||||
mkOption {
|
||||
inherit description;
|
||||
type = with types; nullOr (listOf str);
|
||||
default = null;
|
||||
};
|
||||
in name: {
|
||||
enable = mkEnableOption ''
|
||||
management of ${name}.
|
||||
|
||||
If the include and exclude options are both unset all items will be included.
|
||||
'';
|
||||
|
||||
include = filterOption
|
||||
"${name} to include. Matches infix name of directory/file in nu_scripts";
|
||||
exclude = filterOption
|
||||
"${name} to exclude. Matches infix name of directory/file in nu_scripts";
|
||||
};
|
||||
|
||||
pathCompletions = scripts + "custom-completions/";
|
||||
pathCompletionsAuto = pathCompletions + "auto-generate/completions/";
|
||||
pathModules = scripts + "modules/";
|
||||
pathAliases = scripts + "aliases/";
|
||||
in {
|
||||
meta.maintainers = [ lib.maintainers."1adept" ];
|
||||
|
||||
options.modules.nushell.nuScripts = {
|
||||
enable = mkEnableOption "script management for nu_script scripts";
|
||||
|
||||
completions = managedIncludeOption "completions";
|
||||
completionsAutoGenerated =
|
||||
managedIncludeOption "auto generated completions";
|
||||
modules = managedIncludeOption "modules";
|
||||
aliases = managedIncludeOption "aliases";
|
||||
};
|
||||
|
||||
config = mkIf (cfg.enable && config.modules.nushell.enable) {
|
||||
# Add nu_scripts
|
||||
home.packages = [ pkgs.nu_scripts ];
|
||||
|
||||
programs.nushell.extraConfig = let
|
||||
getFiles = path:
|
||||
{ enable, include ? [ ], exclude ? [ ], ... }:
|
||||
let
|
||||
isNuFile = lib.hasSuffix ".nu";
|
||||
|
||||
# Collect all nu-files in ${path}
|
||||
nuFiles = pipe path [
|
||||
(builtins.readDir)
|
||||
(lib.mapAttrsToList (name: value:
|
||||
if isNuFile name then
|
||||
[ name ]
|
||||
else
|
||||
lib.optional (value == "directory") (pipe (path + "/" + name) [
|
||||
(builtins.readDir)
|
||||
(lib.mapAttrs (name2: value2: "${name}/${name2}"))
|
||||
(lib.attrValues)
|
||||
])))
|
||||
(lib.flatten)
|
||||
(lib.filter isNuFile)
|
||||
];
|
||||
|
||||
inList = list: item: lib.any (lib.flip lib.hasInfix item) list;
|
||||
|
||||
selectedFiles = lib.filter (item:
|
||||
(include == null || inList include item)
|
||||
&& (exclude == null || !inList exclude item)) nuFiles;
|
||||
|
||||
result = map (name: path + name) selectedFiles;
|
||||
in lib.optionals enable result;
|
||||
|
||||
useFiles = files:
|
||||
pipe files [
|
||||
(map (file: "use ${file} *"))
|
||||
(builtins.concatStringsSep "\n")
|
||||
];
|
||||
|
||||
completions = useFiles (getFiles pathCompletions cfg.completions);
|
||||
completionsAuto =
|
||||
useFiles (getFiles pathCompletionsAuto cfg.completionsAutoGenerated);
|
||||
aliases = useFiles (getFiles pathAliases cfg.aliases);
|
||||
modules = useFiles (getFiles pathModules cfg.modules);
|
||||
|
||||
# Mk after main config file. This may be necessary for some scripts to be evaluated
|
||||
in lib.mkAfter ''
|
||||
# Generated with home-manager from github:nushell/nu_scripts
|
||||
# Completions --------------------------------------------
|
||||
${completions}
|
||||
${completionsAuto}
|
||||
# Modules ------------------------------------------------
|
||||
${modules}
|
||||
# Aliases ------------------------------------------------
|
||||
${aliases}
|
||||
# --------------------------------------------------------
|
||||
# Generated END
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in a new issue