direnv: enable nushell integration

This enables nushell integration by default for direnv, similar to
bash/zsh/fish. The slightly verbose way of setting this is to ensure
that peoples' existing nushell configuration isn't overwritten, only
appended to, as would be the case if we just used the integration
example from the nushell docs:

  https://www.nushell.sh/cookbook/direnv.html

Closes #3520
This commit is contained in:
Mika Naylor 2022-12-24 14:00:20 +01:00 committed by Robert Helgesson
parent 5a570962a9
commit 3ad22341a2
No known key found for this signature in database
GPG Key ID: 36BDAA14C2797E89
3 changed files with 45 additions and 0 deletions

View File

@ -80,6 +80,15 @@ in {
'';
};
enableNushellIntegration = mkOption {
default = true;
type = types.bool;
readOnly = true;
description = ''
Whether to enable Nushell integration.
'';
};
nix-direnv = {
enable = mkEnableOption ''
<link
@ -119,5 +128,21 @@ in {
mkAfter ''
${pkgs.direnv}/bin/direnv hook fish | source
'');
programs.nushell.extraConfig = mkIf cfg.enableNushellIntegration (
# Using mkAfter to make it more likely to appear after other
# manipulations of the prompt.
mkAfter ''
let-env config = ($env | default {} config).config
let-env config = ($env.config | default {} hooks)
let-env config = ($env.config | update hooks ($env.config.hooks | default [] pre_prompt))
let-env config = ($env.config | update hooks.pre_prompt ($env.config.hooks.pre_prompt | append {
code: "
let direnv = (${pkgs.direnv}/bin/direnv export json | from json)
let direnv = if ($direnv | length) == 1 { $direnv } else { {} }
$direnv | load-env
"
}))
'');
};
}

View File

@ -1,6 +1,7 @@
{
direnv-bash = ./bash.nix;
direnv-nix-direnv = ./nix-direnv.nix;
direnv-nushell = ./nushell.nix;
direnv-stdlib = ./stdlib.nix;
direnv-stdlib-and-nix-direnv = ./stdlib-and-nix-direnv.nix;
}

View File

@ -0,0 +1,19 @@
{ pkgs, ... }:
{
programs.nushell.enable = true;
programs.direnv.enable = true;
test.stubs.nushell = { };
nmt.script = let
configFile = if pkgs.stdenv.isDarwin then
"home-files/Library/Application Support/nushell/config.nu"
else
"home-files/.config/nushell/config.nu";
in ''
assertFileExists "${configFile}"
assertFileRegex "${configFile}" \
'let direnv = (/nix/store/.*direnv.*/bin/direnv export json | from json)'
'';
}