From ae5c6621825f73fb32a734b4bf2127655369f97a Mon Sep 17 00:00:00 2001 From: pacien Date: Tue, 5 Jan 2021 17:20:39 +0100 Subject: [PATCH] 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 --- pkgs/shells/fish/wrapper.nix | 25 +++++++++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 pkgs/shells/fish/wrapper.nix diff --git a/pkgs/shells/fish/wrapper.nix b/pkgs/shells/fish/wrapper.nix new file mode 100644 index 000000000000..053568bc6b9b --- /dev/null +++ b/pkgs/shells/fish/wrapper.nix @@ -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 + " "$@" +'') diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d4ca2d6f7418..2e6911c6939c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -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 {