diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 57f57ae83..3dbb01723 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1847,6 +1847,20 @@ in { output. ''; } + + { + time = "2024-12-04T20:00:00+00:00"; + condition = let + sCfg = config.programs.starship; + fCfg = config.programs.fish; + in sCfg.enable && sCfg.enableFishIntegration && fCfg.enable; + message = '' + A new option 'programs.starship.enableInteractive' is available for + the Fish shell that only enables starship if the shell is interactive. + + Some plugins require this to be set to 'false' to function correctly. + ''; + } ]; }; } diff --git a/modules/programs/starship.nix b/modules/programs/starship.nix index 9ccff7fcf..bbfe96989 100644 --- a/modules/programs/starship.nix +++ b/modules/programs/starship.nix @@ -10,6 +10,8 @@ let starshipCmd = "${config.home.profileDirectory}/bin/starship"; + initFish = + if cfg.enableInteractive then "interactiveShellInit" else "shellInitLast"; in { meta.maintainers = [ ]; @@ -71,6 +73,17 @@ in { default = true; }; + enableInteractive = mkOption { + type = types.bool; + default = true; + description = '' + Only enable starship when the shell is interactive. This option is only + valid for the Fish shell. + + Some plugins require this to be set to `false` to function correctly. + ''; + }; + enableTransience = mkOption { type = types.bool; default = false; @@ -104,7 +117,7 @@ in { fi ''; - programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration '' + programs.fish.${initFish} = mkIf cfg.enableFishIntegration '' if test "$TERM" != "dumb" eval (${starshipCmd} init fish) ${lib.optionalString cfg.enableTransience "enable_transience"} diff --git a/tests/modules/programs/starship/default.nix b/tests/modules/programs/starship/default.nix index 6fed13039..024dc8218 100644 --- a/tests/modules/programs/starship/default.nix +++ b/tests/modules/programs/starship/default.nix @@ -2,4 +2,6 @@ starship-settings = ./settings.nix; starship-fish-with-transience = ./fish_with_transience.nix; starship-fish-without-transience = ./fish_without_transience.nix; + starship-fish-with-interactive = ./fish_with_interactive.nix; + starship-fish-without-interactive = ./fish_without_interactive.nix; } diff --git a/tests/modules/programs/starship/fish_with_interactive.nix b/tests/modules/programs/starship/fish_with_interactive.nix new file mode 100644 index 000000000..0ffd6fd4b --- /dev/null +++ b/tests/modules/programs/starship/fish_with_interactive.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + config = { + programs = { + fish.enable = true; + starship.enable = true; + }; + + nmt.script = '' + assertFileExists home-files/.config/fish/config.fish + + export GOT="$(tail -n 5 `_abs home-files/.config/fish/config.fish`)" + export NOT_EXPECTED=" + if test \"\$TERM\" != dumb + /home/hm-user/.nix-profile/bin/starship init fish | source + + end" + + if [[ "$GOT" == "$NOT_EXPECTED" ]]; then + fail "Expected starship init to be inside the 'is-interactive' block but it wasn't." + fi + ''; + }; +} diff --git a/tests/modules/programs/starship/fish_without_interactive.nix b/tests/modules/programs/starship/fish_without_interactive.nix new file mode 100644 index 000000000..eeafb47e1 --- /dev/null +++ b/tests/modules/programs/starship/fish_without_interactive.nix @@ -0,0 +1,43 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + config = { + programs = { + fish.enable = true; + + starship = { + enable = true; + enableInteractive = false; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/fish/config.fish + + export GOT="$(tail -n 5 `_abs home-files/.config/fish/config.fish`)" + export EXPECTED=" + if test \"\$TERM\" != dumb + eval (/home/hm-user/.nix-profile/bin/starship init fish) + + end" + + export MESSAGE=" + ========== + Expected + ========== + $EXPECTED + ========== + Got + ========== + $GOT + ========== + " + + if [[ "$GOT" != "$EXPECTED" ]]; then + fail "$MESSAGE" + fi + ''; + }; +}