From 16aa27328bad1ed59e08ff3500532c4c5161092a 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 +++++++++++++++---- .../programs/nushell/config-expected.nu | 8 ++- .../programs/nushell/example-settings.nix | 9 ++- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/modules/lib/nushell.nix b/modules/lib/nushell.nix index e831380cd..5ef5ad36d 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 2b936d3fd..1788a9e1f 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 @@ -43,16 +43,6 @@ in { aidalgol ]; - imports = [ - (lib.mkRemovedOptionModule [ "programs" "nushell" "settings" ] '' - Please use - - 'programs.nushell.configFile' and 'programs.nushell.envFile' - - instead. - '') - ]; - options.programs.nushell = { enable = lib.mkEnableOption "nushell"; @@ -140,6 +130,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 = { }; @@ -179,12 +198,28 @@ 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 [ + (let + flattenSettings = let + joinDot = a: b: "${if a == "" then "" else "${a}."}${b}"; + unravel = prefix: value: + if lib.isAttrs value && !isNushellInline value then + lib.concatMap (key: unravel (joinDot prefix key) value.${key}) + (builtins.attrNames value) + else + [ (lib.nameValuePair prefix value) ]; + in unravel ""; + mkLine = { name, value }: '' + $env.config.${name} = ${toNushell { } value} + ''; + settingsLines = + lib.concatMapStrings mkLine (flattenSettings cfg.settings); + in lib.mkIf (cfg.settings != { }) settingsLines) (lib.mkIf (cfg.configFile != null) cfg.configFile.text) cfg.extraConfig aliasesStr diff --git a/tests/modules/programs/nushell/config-expected.nu b/tests/modules/programs/nushell/config-expected.nu index 3ab5d2de1..6d5b09b26 100644 --- a/tests/modules/programs/nushell/config-expected.nu +++ b/tests/modules/programs/nushell/config-expected.nu @@ -1,4 +1,10 @@ -let $config = { +$env.config.display_errors.exit_code = false +$env.config.hooks.pre_execution = [ + ({|| "pre_execution hook"}) +] +$env.config.show_banner = false + +let config = { filesize_metric: false table_mode: rounded use_ls_colors: true diff --git a/tests/modules/programs/nushell/example-settings.nix b/tests/modules/programs/nushell/example-settings.nix index e758000bf..598a7bd85 100644 --- a/tests/modules/programs/nushell/example-settings.nix +++ b/tests/modules/programs/nushell/example-settings.nix @@ -5,7 +5,7 @@ enable = true; configFile.text = '' - let $config = { + let config = { filesize_metric: false table_mode: rounded use_ls_colors: true @@ -30,6 +30,13 @@ "ll" = "ls -a"; }; + settings = { + show_banner = false; + display_errors.exit_code = false; + hooks.pre_execution = + [ (lib.hm.nushell.mkNushellInline ''{|| "pre_execution hook"}'') ]; + }; + environmentVariables = { FOO = "BAR"; LIST_VALUE = [ "foo" "bar" ];