wrapFish: add fish shell wrapper package

This adds a wrapper for fish which allows creating shells pre-initialised
with some completions, functions, and configuration scripts from given paths
or from fish plugin packages (`pkgs.fishPlugins.*`).

This is especially handy when one wants to try a plugin in an ephemeral shell.

GitHub: see https://github.com/NixOS/nixpkgs/pull/107834#discussion_r550612519
This commit is contained in:
pacien 2021-01-05 17:20:39 +01:00
parent a14ea3aecc
commit ae5c662182
2 changed files with 27 additions and 0 deletions

View file

@ -0,0 +1,25 @@
{ lib, writeShellScriptBin, fish }:
with lib;
makeOverridable ({
completionDirs ? [],
functionDirs ? [],
confDirs ? [],
pluginPkgs ? []
}:
let
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;
safeConfPath = map escapeShellArg confPath;
in writeShellScriptBin "fish" ''
${fish}/bin/fish --init-command "
set --prepend fish_complete_path ${escapeShellArgs complPath}
set --prepend fish_function_path ${escapeShellArgs funcPath}
for c in {${concatStringsSep "," safeConfPath}}/*; source $c; end
" "$@"
'')

View file

@ -8843,6 +8843,8 @@ in
fish = callPackage ../shells/fish { };
wrapFish = callPackage ../shells/fish/wrapper.nix { };
fishPlugins = recurseIntoAttrs (callPackage ../shells/fish/plugins { });
ion = callPackage ../shells/ion {