aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/di/direnv/module.nix
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--modules/by-name/di/direnv/module.nix90
1 files changed, 83 insertions, 7 deletions
diff --git a/modules/by-name/di/direnv/module.nix b/modules/by-name/di/direnv/module.nix
index 7c81e671..fc800f35 100644
--- a/modules/by-name/di/direnv/module.nix
+++ b/modules/by-name/di/direnv/module.nix
@@ -10,21 +10,97 @@
{
config,
lib,
+ pkgs,
+ sources,
...
}: let
cfg = config.soispha.programs.direnv;
+ direnvCfg = config.home-manager.users.soispha.programs.direnv;
+
+ inherit (sources) devshells nixpkgs;
+
+ pre-cache = pkgs.runCommand "pre-cache.sh" {} ''
+ cat "${./pre-cache.sh}" > $out
+
+ substituteInPlace $out \
+ --replace-fail "%DEVSHELLS_REPO%" "${devshells}" \
+ --replace-fail "%DEVSHELLS_REPO_REF%" "${devshells.sourceInfo.rev}.${builtins.readFile "${nixpkgs}/.git-revision"}"
+ '';
+
+ landrun-fish = pkgs.writeShellApplication {
+ name = "landrun-fish";
+ text = builtins.readFile ./landrun-fish.sh;
+ inheritPath = true;
+ runtimeInputs = [
+ pkgs.landrun
+ ];
+ };
+
+ direnvPkg = lib.getExe direnvCfg.package;
in {
options.soispha.programs.direnv = {
enable = lib.mkEnableOption "direnv";
};
- config.home-manager.users.soispha.programs.direnv = lib.mkIf cfg.enable {
- enable = true;
- nix-direnv.enable = true;
- config = {
- warn_timeout = 0;
- # strict_env = true;
- # disable_stdin = true;
+ config = lib.mkIf cfg.enable {
+ soispha.programs.fish.integrations.direnv =
+ # fish
+ ''
+ set --global SHOULD_SANDBOX_DIRENV
+
+ function _direnv_export_eval
+ ${direnvPkg} export fish | source
+ end
+
+ function _direnv_hook --on-variable PWD
+ if not set --query IN_DIRENV_SANDBOX;
+ and set --query SHOULD_SANDBOX_DIRENV;
+ and ${direnvPkg} status | grep 'Found RC path' --quiet;
+ and ${direnvPkg} status | grep 'No .envrc or .env loaded' --quiet
+
+ # We found a RC path, but no RC file is loaded. So we can start our shell and
+ # load it.
+ ${lib.getExe landrun-fish} --init-command='_direnv_export_eval'
+
+ # After the user exists (via Ctrl+D), they probably want to change the
+ # directory.
+ ll
+ else
+ _direnv_export_eval
+ end
+ end
+ '';
+
+ home-manager.users.soispha = {
+ programs.direnv = {
+ enable = true;
+
+ package = pkgs.direnv-patched;
+
+ nix-direnv = {
+ enable = true;
+ package = pkgs.nix-direnv.override {nix = config.nix.package;};
+ };
+
+ # Handled by myself (and the script is overridden)
+ enableBashIntegration = true;
+ enableZshIntegration = true;
+ enableFishIntegration = false;
+
+ config = {
+ warn_timeout = 0;
+
+ # NOTE: Something variable is undeclared in the my default loaded stuff :/. <2026-08-18>
+ # strict_env = true;
+
+ # disable_stdin = true;
+ };
+ };
+ xdg.configFile = {
+ "direnv/lib/hm-pre-cache.sh" = {
+ source = pre-cache;
+ };
+ };
};
};
}