starship: add enableInteractive option for fish

Some fish plugins such as https://github.com/acomagu/fish-async-prompt
require that starship be initialized as non-interactive.

When the `programs.starship.enableInteractive` option is enabled,
starship is initialized at the end of the init script, outside the
interactive block.
This commit is contained in:
eljamm 2024-07-24 11:48:42 +01:00
parent af70fc502a
commit 3e1707084f
No known key found for this signature in database
GPG key ID: 7630FDF7C8FB1F3F
5 changed files with 98 additions and 1 deletions

View file

@ -1703,6 +1703,18 @@ in {
one place. See https://github.com/glanceapp/glance for more.
'';
}
{
time = "2024-07-24T11:13:58+00:00";
condition = with config.programs.starship;
enable && enableFishIntegration;
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.
'';
}
];
};
}

View file

@ -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"}

View file

@ -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;
}

View file

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

View file

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