{ 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 $XDG_CONFIG_HOME/starship.toml. See 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; }; }; config = mkIf cfg.enable { assertions = [{ assertion = cfg.enableNushellIntegration -> versionAtLeast config.programs.nushell.package.version "0.73"; message = '' Nushell integration for starship requires nushell 0.73 or later. ''; }]; 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) 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 ''; }; }; }