mirror of
https://github.com/nix-community/home-manager
synced 2025-01-01 14:49:48 +01:00
f06a43dca0
Starship has an advanced, experimental feature where fancy stuff in the prompt can be replaced with something more simple after the command is ran. This is very helpful for copy and pasting shell history somewhere else. docs: https://starship.rs/advanced-config/#transientprompt-and-transientrightprompt-in-fish Fish is currently the only shell as far as I can tell that both home-manager and starship support for this feature. Since the function has to be called after starship is loaded, this seems like the best place to put it. format
144 lines
4.3 KiB
Nix
144 lines
4.3 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.programs.starship;
|
|
|
|
tomlFormat = pkgs.formats.toml { };
|
|
|
|
starshipCmd = "${config.home.profileDirectory}/bin/starship";
|
|
|
|
in {
|
|
meta.maintainers = [ maintainers.marsam ];
|
|
|
|
options.programs.starship = {
|
|
enable = mkEnableOption "starship";
|
|
|
|
package = mkOption {
|
|
type = types.package;
|
|
default = pkgs.starship;
|
|
defaultText = literalExpression "pkgs.starship";
|
|
description = "The package to use for the starship binary.";
|
|
};
|
|
|
|
settings = mkOption {
|
|
type = with types;
|
|
let
|
|
prim = either bool (either int str);
|
|
primOrPrimAttrs = either prim (attrsOf prim);
|
|
entry = either prim (listOf primOrPrimAttrs);
|
|
entryOrAttrsOf = t: either entry (attrsOf t);
|
|
entries = entryOrAttrsOf (entryOrAttrsOf entry);
|
|
in attrsOf entries // { description = "Starship configuration"; };
|
|
default = { };
|
|
example = literalExpression ''
|
|
{
|
|
add_newline = false;
|
|
format = lib.concatStrings [
|
|
"$line_break"
|
|
"$package"
|
|
"$line_break"
|
|
"$character"
|
|
];
|
|
scan_timeout = 10;
|
|
character = {
|
|
success_symbol = "➜";
|
|
error_symbol = "➜";
|
|
};
|
|
}
|
|
'';
|
|
description = ''
|
|
Configuration written to
|
|
<filename>$XDG_CONFIG_HOME/starship.toml</filename>.
|
|
</para><para>
|
|
See <link xlink:href="https://starship.rs/config/" /> for the full list
|
|
of options.
|
|
'';
|
|
};
|
|
|
|
enableBashIntegration = mkEnableOption "Bash integration" // {
|
|
default = true;
|
|
};
|
|
|
|
enableZshIntegration = mkEnableOption "Zsh integration" // {
|
|
default = true;
|
|
};
|
|
|
|
enableFishIntegration = mkEnableOption "Fish integration" // {
|
|
default = true;
|
|
};
|
|
|
|
enableIonIntegration = mkEnableOption "Ion integration" // {
|
|
default = true;
|
|
};
|
|
|
|
enableNushellIntegration = mkEnableOption "Nushell integration" // {
|
|
default = true;
|
|
};
|
|
|
|
enableTransience = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = ''
|
|
The TransientPrompt feature of Starship replaces previous prompts with a
|
|
custom string. This is only a valid option for the Fish shell.
|
|
|
|
For documentation on how to change the default replacement string and
|
|
for more information visit
|
|
https://starship.rs/advanced-config/#transientprompt-and-transientrightprompt-in-cmd
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
home.packages = [ cfg.package ];
|
|
|
|
xdg.configFile."starship.toml" = mkIf (cfg.settings != { }) {
|
|
source = tomlFormat.generate "starship-config" cfg.settings;
|
|
};
|
|
|
|
programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
|
|
if [[ $TERM != "dumb" && (-z $INSIDE_EMACS || $INSIDE_EMACS == "vterm") ]]; then
|
|
eval "$(${starshipCmd} init bash --print-full-init)"
|
|
fi
|
|
'';
|
|
|
|
programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
|
|
if [[ $TERM != "dumb" && (-z $INSIDE_EMACS || $INSIDE_EMACS == "vterm") ]]; then
|
|
eval "$(${starshipCmd} init zsh)"
|
|
fi
|
|
'';
|
|
|
|
programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
|
|
if test "$TERM" != "dumb" -a \( -z "$INSIDE_EMACS" -o "$INSIDE_EMACS" = "vterm" \)
|
|
eval (${starshipCmd} init fish)
|
|
${lib.optionalString cfg.enableTransience "enable_transience"}
|
|
end
|
|
'';
|
|
|
|
programs.ion.initExtra = mkIf cfg.enableIonIntegration ''
|
|
if test $TERM != "dumb" && not exists -s INSIDE_EMACS || test $INSIDE_EMACS = "vterm"
|
|
eval $(${starshipCmd} init ion)
|
|
end
|
|
'';
|
|
|
|
programs.nushell = mkIf cfg.enableNushellIntegration {
|
|
# Unfortunately nushell doesn't allow conditionally sourcing nor
|
|
# conditionally setting (global) environment variables, which is why the
|
|
# check for terminal compatibility (as seen above for the other shells) is
|
|
# not done here.
|
|
extraEnv = ''
|
|
let starship_cache = "${config.xdg.cacheHome}/starship"
|
|
if not ($starship_cache | path exists) {
|
|
mkdir $starship_cache
|
|
}
|
|
${starshipCmd} init nu | save --force ${config.xdg.cacheHome}/starship/init.nu
|
|
'';
|
|
extraConfig = ''
|
|
source ${config.xdg.cacheHome}/starship/init.nu
|
|
'';
|
|
};
|
|
};
|
|
}
|