Skip to content

Fish#

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 programs.fish.enable and programs.fish.vendor.{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/" ];
}