Fish is a "smart and user-friendly command line shell" with support for plugins.

Vendor Fish scripts

Any package may ship its own Fish completions, configuration snippets, and functions. Those should be installed to $out/share/fish/vendor_{completions,conf,functions}.d respectively.

When the and{completions,config,functions}.enable options from the NixOS Fish module are set to true, those paths are symlinked in the current system environment and automatically loaded by Fish.

Packaging Fish plugins

While packages providing standalone executables belong to the top level, packages which have the sole purpose of extending Fish belong to the fishPlugins scope and should be registered in pkgs/shells/fish/plugins/default.nix.

The buildFishPlugin utility function can be used to automatically copy Fish scripts from $src/{completions,conf,conf.d,functions} to the standard vendor installation paths. It also sets up the test environment so that the optional checkPhase is executed in a Fish shell with other already packaged plugins and package-local Fish functions specified in checkPlugins and checkFunctionDirs respectively.

See pkgs/shells/fish/plugins/pure.nix for an example of Fish plugin package using buildFishPlugin and running unit tests with the fishtape test runner.

Fish wrapper

The wrapFish package is a wrapper around Fish which can be used to create Fish shells initialized with some plugins as well as completions, configuration snippets and functions sourced from the given paths. This provides a convenient way to test Fish plugins and scripts without having to alter the environment.

wrapFish {
  pluginPkgs = with fishPlugins; [ pure foreign-env ];
  completionDirs = [];
  functionDirs = [];
  confDirs = [ "/path/to/some/fish/init/dir/" ];