{ lib }: let mkShellIntegrationOption = name: { config, baseName ? name, extraDescription ? "" }: let attrName = "enable${baseName}Integration"; in lib.mkOption { default = config.home.shell.${attrName}; defaultText = lib.literalMD "[](#opt-home.shell.${attrName})"; example = false; description = "Whether to enable ${name} integration.${ lib.optionalString (extraDescription != "") ("\n\n" + extraDescription) }"; type = lib.types.bool; }; in rec { # Produces a Bourne shell like statement that prepend new values to # an possibly existing variable, using sep(arator). # Example: # prependToVar ":" "PATH" [ "$HOME/bin" "$HOME/.local/bin" ] # => "$HOME/bin:$HOME/.local/bin:${PATH:+:}\$PATH" prependToVar = sep: n: v: "${lib.concatStringsSep sep v}\${${n}:+${sep}}\$${n}"; # Produces a Bourne shell like variable export statement. export = n: v: ''export ${n}="${toString v}"''; # Given an attribute set containing shell variable names and their # assignment, this function produces a string containing an export # statement for each set entry. exportAll = vars: lib.concatStringsSep "\n" (lib.mapAttrsToList export vars); mkBashIntegrationOption = mkShellIntegrationOption "Bash"; mkFishIntegrationOption = mkShellIntegrationOption "Fish"; mkIonIntegrationOption = mkShellIntegrationOption "Ion"; mkNushellIntegrationOption = mkShellIntegrationOption "Nushell"; mkZshIntegrationOption = mkShellIntegrationOption "Zsh"; }