diff --git a/pkgs/shells/fish/wrapper.nix b/pkgs/shells/fish/wrapper.nix index f978f2bdfa4d..c5c55bb71103 100644 --- a/pkgs/shells/fish/wrapper.nix +++ b/pkgs/shells/fish/wrapper.nix @@ -1,25 +1,47 @@ -{ lib, writeShellScriptBin, fish }: +{ lib, writeShellScriptBin, fish, writeTextFile }: -with lib; - -makeOverridable ({ +lib.makeOverridable ({ completionDirs ? [], functionDirs ? [], confDirs ? [], - pluginPkgs ? [] + pluginPkgs ? [], + localConfig ? "", + shellAliases ? {} }: let + aliasesStr = builtins.concatStringsSep "\n" + (lib.mapAttrsToList (k: v: "alias ${k} ${lib.escapeShellArg v}") shellAliases); + + shellAliasesFishConfig = writeTextFile { + name = "wrapfish.aliases.fish"; + destination = "/share/fish/vendor_conf.d/aliases.fish"; + text = '' + status --is-interactive; and begin + # Aliases + ${aliasesStr} + end + ''; + }; + + localFishConfig = writeTextFile { + name = "wrapfish.local.fish"; + destination = "/share/fish/vendor_conf.d/config.local.fish"; + text = localConfig; + }; + vendorDir = kind: plugin: "${plugin}/share/fish/vendor_${kind}.d"; complPath = completionDirs ++ map (vendorDir "completions") pluginPkgs; funcPath = functionDirs ++ map (vendorDir "functions") pluginPkgs; - confPath = confDirs ++ map (vendorDir "conf") pluginPkgs; + confPath = confDirs + ++ (map (vendorDir "conf") pluginPkgs) + ++ (map (vendorDir "conf") [ localFishConfig shellAliasesFishConfig ]); in writeShellScriptBin "fish" '' ${fish}/bin/fish --init-command " - set --prepend fish_complete_path ${escapeShellArgs complPath} - set --prepend fish_function_path ${escapeShellArgs funcPath} - set --local fish_conf_source_path ${escapeShellArgs confPath} + set --prepend fish_complete_path ${lib.escapeShellArgs complPath} + set --prepend fish_function_path ${lib.escapeShellArgs funcPath} + set --local fish_conf_source_path ${lib.escapeShellArgs confPath} for c in \$fish_conf_source_path/*; source \$c; end " "$@" '')