From e48030e9a75fe1ed8e09dedd7884f76c12f23915 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sun, 11 Aug 2024 12:02:42 -0400 Subject: [PATCH] fish: expose session variables package This allows fish users to source the `hm-session-vars.fish` if they are not using the generated `config.fish` (which now sources the same file). --- docs/manual/faq/session-variables.md | 5 +++- modules/programs/fish.nix | 28 +++++++++++++++---- tests/modules/programs/fish/default.nix | 1 + .../programs/fish/session-variables.nix | 26 +++++++++++++++++ 4 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 tests/modules/programs/fish/session-variables.nix diff --git a/docs/manual/faq/session-variables.md b/docs/manual/faq/session-variables.md index 5c8586628513..767275addd00 100644 --- a/docs/manual/faq/session-variables.md +++ b/docs/manual/faq/session-variables.md @@ -17,8 +17,11 @@ way. In Bash and Z shell this can be done by adding to your `.profile` and `.zshrc` files, respectively. The `hm-session-vars.sh` file should work in most Bourne-like shells. For fish shell, it is possible to source it using [the foreign-env -plugin](https://github.com/oh-my-fish/plugin-foreign-env) +plugin](https://github.com/oh-my-fish/plugin-foreign-env) or using the builtin +[babelfish](https://github.com/bouk/babelfish)-translated variables: ``` bash fenv source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" > /dev/null +# or +source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.fish" ``` diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix index 02141042d36e..2426b23c878e 100644 --- a/modules/programs/fish.nix +++ b/modules/programs/fish.nix @@ -220,13 +220,16 @@ let passAsFile = [ "text" ]; } "env HOME=$(mktemp -d) fish_indent < $textPath > $out"; + profileDir = "/etc/profile.d"; + translatedSessionVarsFile = "hm-session-vars.fish"; translatedSessionVariables = - pkgs.runCommandLocal "hm-session-vars.fish" { } '' + pkgs.runCommandLocal translatedSessionVarsFile { } '' + mkdir -p $out/${profileDir} (echo "function setup_hm_session_vars;" ${pkgs.buildPackages.babelfish}/bin/babelfish \ - <${config.home.sessionVariablesPackage}/etc/profile.d/hm-session-vars.sh + <${config.home.sessionVariablesPackage}/etc/profile.d/hm-session-vars.sh echo "end" - echo "setup_hm_session_vars") > $out + echo "setup_hm_session_vars") > $out/${profileDir}/${translatedSessionVarsFile} ''; in { @@ -393,11 +396,24 @@ in { . ''; }; + + # TODO: maybe this makes more sense as `programs.fish.sessionVariablesPackage`? + # if `programs.fish.sessionVariables` were added, would that need its own + # separate package, or would they just go in config.fish directly? + home.fishSessionVariablesPackage = mkOption { + type = types.package; + internal = true; + description = '' + The package containing the translated {file}`hm-session-vars.fish` file. + ''; + }; }; config = mkIf cfg.enable (mkMerge [ - { home.packages = [ cfg.package ]; } - + { + home.fishSessionVariablesPackage = translatedSessionVariables; + home.packages = [ cfg.package config.home.fishSessionVariablesPackage ]; + } (mkIf cfg.generateCompletions { # Support completion for `man` by building a cache for `apropos`. programs.man.generateCaches = mkDefault true; @@ -473,7 +489,7 @@ in { set -q __fish_home_manager_config_sourced; and exit set -g __fish_home_manager_config_sourced 1 - source ${translatedSessionVariables} + source ${config.home.fishSessionVariablesPackage}/${profileDir}/${translatedSessionVarsFile} ${cfg.shellInit} diff --git a/tests/modules/programs/fish/default.nix b/tests/modules/programs/fish/default.nix index f81ff971ea35..52d53f81ebc3 100644 --- a/tests/modules/programs/fish/default.nix +++ b/tests/modules/programs/fish/default.nix @@ -4,4 +4,5 @@ fish-functions = ./functions.nix; fish-no-functions = ./no-functions.nix; fish-plugins = ./plugins.nix; + fish-session-variables = ./session-variables.nix; } diff --git a/tests/modules/programs/fish/session-variables.nix b/tests/modules/programs/fish/session-variables.nix new file mode 100644 index 000000000000..bced6d84046d --- /dev/null +++ b/tests/modules/programs/fish/session-variables.nix @@ -0,0 +1,26 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + config = { + home.sessionVariables = { + V1 = "v1"; + V2 = "v2-${config.home.sessionVariables.V1}"; + }; + + programs.fish = { + enable = true; + + # TODO: should there be an equivalent sessionVariables here like bash + zsh? + }; + + nmt.script = '' + assertFileExists home-path/etc/profile.d/hm-session-vars.fish + assertFileRegex home-path/etc/profile.d/hm-session-vars.fish \ + "set -gx V1 'v1'" + assertFileRegex home-path/etc/profile.d/hm-session-vars.fish \ + "set -gx V1 'v1'" + ''; + }; +}