Skip to content

Commit

Permalink
direnv: enable nushell integration
Browse files Browse the repository at this point in the history
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 nix-community#3520
  • Loading branch information
autophagy committed Dec 24, 2022
1 parent d7eee20 commit 4faf561
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 0 deletions.
25 changes: 25 additions & 0 deletions modules/programs/direnv.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
"
}))
'');
};
}
1 change: 1 addition & 0 deletions tests/modules/programs/direnv/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
direnv-nix-direnv = ./nix-direnv.nix;
direnv-stdlib = ./stdlib.nix;
direnv-stdlib-and-nix-direnv = ./stdlib-and-nix-direnv.nix;
direnv-nushell = ./nushell.nix;
}
21 changes: 21 additions & 0 deletions tests/modules/programs/direnv/nushell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:

with lib;

{
config = {
programs.nushell.enable = true;
programs.direnv.enable = true;

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)'
'';
};
}

0 comments on commit 4faf561

Please sign in to comment.