From 5d96d63e61ecc0b7e21358cc9686fa222b762576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20Tri=C3=B1anes?= Date: Sun, 8 Dec 2024 01:00:45 +0100 Subject: [PATCH] nushell: add settings option --- modules/lib/nushell.nix | 5 +-- modules/programs/nushell.nix | 59 ++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/modules/lib/nushell.nix b/modules/lib/nushell.nix index e831380cd0c3..5ef5ad36d7aa 100644 --- a/modules/lib/nushell.nix +++ b/modules/lib/nushell.nix @@ -1,7 +1,9 @@ { lib }: rec { mkNushellInline = expr: lib.setType "nushell-inline" { inherit expr; }; - toNushell = { indent ? "", multiline ? true, asBindings ? false }@args: + isNushellInline = lib.isType "nushell-inline"; + + toNushell = { indent ? "", multiline ? true, asBindings ? false, }@args: v: let innerIndent = "${indent} "; @@ -18,7 +20,6 @@ asBindings = false; }; concatItems = lib.concatStringsSep introSpace; - isNushellInline = lib.isType "nushell-inline"; generatedBindings = assert lib.assertMsg (badVarNames == [ ]) "Bad Nushell variable names: ${ diff --git a/modules/programs/nushell.nix b/modules/programs/nushell.nix index 5d029e03b7cb..dce2afd45178 100644 --- a/modules/programs/nushell.nix +++ b/modules/programs/nushell.nix @@ -1,7 +1,7 @@ { config, lib, pkgs, ... }: let inherit (lib) types; - inherit (lib.hm.nushell) toNushell; + inherit (lib.hm.nushell) isNushellInline toNushell; cfg = config.programs.nushell; configDir = if pkgs.stdenv.isDarwin && !config.xdg.enable then @@ -40,16 +40,6 @@ in { meta.maintainers = [ lib.maintainers.Philipp-M lib.maintainers.joaquintrinanes ]; - imports = [ - (lib.mkRemovedOptionModule [ "programs" "nushell" "settings" ] '' - Please use - - 'programs.nushell.configFile' and 'programs.nushell.envFile' - - instead. - '') - ]; - options.programs.nushell = { enable = lib.mkEnableOption "nushell"; @@ -128,6 +118,35 @@ in { ''; }; + settings = lib.mkOption { + type = types.attrsOf lib.hm.types.nushellValue; + default = { }; + description = '' + Nushell settings. These will be flattened and assigned one by one to `$env.config` to avoid overwriting the default or existing options. + + For example: + ```nix + { + show_banner = false; + completions.external = { + enable = true; + max_results = 200; + }; + } + ``` + becomes: + ```nushell + $env.config.completions.external.enable = true + $env.config.completions.external.max_results = 200 + $env.config.show_banner = false + ``` + ''; + example = { + show_banner = false; + history.format = "sqlite"; + }; + }; + shellAliases = lib.mkOption { type = types.attrsOf types.str; default = { }; @@ -167,13 +186,29 @@ in { home.file = lib.mkMerge [ (let writeConfig = cfg.configFile != null || cfg.extraConfig != "" - || aliasesStr != ""; + || aliasesStr != "" || cfg.settings != { }; aliasesStr = lib.concatLines (lib.mapAttrsToList (k: v: "alias ${k} = ${v}") cfg.shellAliases); in lib.mkIf writeConfig { "${configDir}/config.nu".text = lib.mkMerge [ (lib.mkIf (cfg.configFile != null) cfg.configFile.text) + (let + flattenSettings = settings: + let + unravel = prefixes: value: + if (lib.isAttrs value && !isNushellInline value) then + lib.flatten + (map (key: unravel (prefixes ++ [ key ]) value.${key}) + (builtins.attrNames value)) + else + lib.nameValuePair (lib.concatStringsSep "." prefixes) value; + in lib.listToAttrs (unravel [ ] settings); + + flattenedSettings = flattenSettings cfg.settings; + in lib.mkIf (cfg.settings != { }) (lib.concatLines (lib.mapAttrsToList + (key: value: "$env.config.${key} = ${toNushell { } value}") + flattenedSettings))) cfg.extraConfig aliasesStr ];