From 365736b42a4ed13a2a55ab8d10c65ab62ce9671c Mon Sep 17 00:00:00 2001 From: oddlama Date: Sun, 17 Sep 2023 21:52:16 +0200 Subject: [PATCH] feat: add starship module that allows 3-nested maps and use my starship patch --- .../modules/config/shell/starship-module.nix | 154 ++++++++++++++++++ users/modules/config/shell/starship.nix | 38 ++++- users/modules/config/shell/zsh/default.nix | 12 +- 3 files changed, 193 insertions(+), 11 deletions(-) create mode 100644 users/modules/config/shell/starship-module.nix diff --git a/users/modules/config/shell/starship-module.nix b/users/modules/config/shell/starship-module.nix new file mode 100644 index 0000000..48dc247 --- /dev/null +++ b/users/modules/config/shell/starship-module.nix @@ -0,0 +1,154 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.programs.starship; + + tomlFormat = pkgs.formats.toml {}; + + starshipCmd = "${config.home.profileDirectory}/bin/starship"; +in { + meta.maintainers = []; + + 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 (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 + {file}`$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; + }; + + 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" ]]; then + eval "$(${starshipCmd} init bash --print-full-init)" + fi + ''; + + programs.zsh.initExtra = mkIf cfg.enableZshIntegration '' + if [[ $TERM != "dumb" ]]; then + eval "$(${starshipCmd} init zsh)" + fi + ''; + + programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration '' + if test "$TERM" != "dumb" + eval (${starshipCmd} init fish) + ${lib.optionalString cfg.enableTransience "enable_transience"} + end + ''; + + programs.ion.initExtra = mkIf cfg.enableIonIntegration '' + if test $TERM != "dumb" + 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 + ''; + }; + }; +} diff --git a/users/modules/config/shell/starship.nix b/users/modules/config/shell/starship.nix index d263e0d..a7c4071 100644 --- a/users/modules/config/shell/starship.nix +++ b/users/modules/config/shell/starship.nix @@ -1,6 +1,28 @@ -{lib, ...}: { +{ + lib, + pkgs, + ... +}: { + disabledModules = ["programs/starship.nix"]; + imports = [./starship-module.nix]; + programs.starship = { enable = true; + package = let + src = pkgs.fetchFromGitHub { + owner = "oddlama"; + repo = "starship"; + rev = "feat-more-dynamic-username-and-hostname"; + hash = "sha256-me6GC1NTSEfdTdSbhwbmwMlzIhSmcs1PSUFCWu+2LG0="; + }; + in + pkgs.starship.overrideAttrs (_finalAttrs: previousAttrs: { + inherit src; + cargoDeps = previousAttrs.cargoDeps.overrideAttrs (_: { + inherit src; + outputHash = "sha256-L4N55ghbPsBrESRK0vHGDSDytFCnib7ghoMKnWFIZvw="; + }); + }); settings = { add_newline = false; format = lib.concatStrings [ @@ -21,18 +43,18 @@ "($rust )" "$time" ]; - username = { - format = "[$user]($style)"; - style_root = "red"; - style_user = "cyan"; - show_always = true; + format = "[$user]($style) "; + show_if_root = false; + show_if_ssh = false; + style = "yellow"; }; hostname = { format = "[$hostname]($style)[$ssh_symbol](green)"; ssh_only = false; - ssh_symbol = "󰣀"; - style = "cyan"; + ssh_symbol = " 󰣀"; + style = "bold purple"; + user_overrides.root.style = "bold red"; }; directory = { format = "[$path]($style)[$read_only]($read_only_style)"; diff --git a/users/modules/config/shell/zsh/default.nix b/users/modules/config/shell/zsh/default.nix index 0f9c694..bb60227 100644 --- a/users/modules/config/shell/zsh/default.nix +++ b/users/modules/config/shell/zsh/default.nix @@ -3,6 +3,9 @@ pkgs, ... }: { + # Needed in path for zsh-histdb + home.packages = [pkgs.sqlite]; + programs.zsh = { enable = true; envExtra = '' @@ -15,19 +18,22 @@ size = 1000000; }; initExtra = lib.readFile ./zshrc; + initExtraFirst = '' + HISTDB_FILE=''${XDG_DATA_HOME-$HOME/.local/share}/zsh/history.db + ''; plugins = [ { # Must be before plugins that wrap widgets, such as zsh-autosuggestions or fast-syntax-highlighting name = "fzf-tab"; - src = pkgs.zsh-fzf-tab; + src = "${pkgs.zsh-fzf-tab}/share/fzf-tab"; } { name = "fast-syntax-highlighting"; - src = pkgs.zsh-fast-syntax-highlighting; + src = "${pkgs.zsh-fast-syntax-highlighting}/share/zsh/site-functions"; } { name = "zsh-autosuggestions"; - src = pkgs.zsh-autosuggestions; + src = "${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions"; } { name = "zsh-histdb";