From NixOS Wiki
Jump to: navigation, search

fish is the Friendly Interactive Shell.

Setting fish as the default shell

See Command Shell#Changing default shell.

Managing fish plugins with Home Manager

In order to manage fish with home manager you also have to enable it in your home.nix.

Then you can add new ones by adding them to the list of submodules of


So for example for the plugin z from jethrokuan on github. = true; = [{
    name = "z";
    src = pkgs.fetchFromGitHub {
      owner = "jethrokuan";
      repo = "z";
      rev = "e0e1b9dfdba362f8ab1ae8c1afc7ccf62b89f7eb";
      sha256 = "0dbnir6jbwjpjalz14snzd3cgdysgcs3raznsijd6savad3qhijc";


Or you can use some of the packaged plugins, by just adding them to your installed packages (or with nix-env)

Useful scripts

Show that you are in a nix-shell

Add this to the fish_prompt function (usually placed in ~/.config/fish/functions/

set -l nix_shell_info (
  if test -n "$IN_NIX_SHELL"
    echo -n "<nix-shell> "

and $nix_shell_info to the echo in that function, e.g.:

echo -n -s "$nix_shell_info ~>"

Now your prompt looks like this

  • outside: ~>
  • inside: <nix-shell> ~>

btw. you can directly start nix-shell in fish with nix-shell --run fish, but (FIXME) the normal build functions are not available there.


Helper functions that put you in a nix-shell with the given packages installed.

You can either put these in with home-manager or in ~/.config/fish/functions/ without.


function haskellEnv
  nix-shell -p "haskellPackages.ghcWithPackages (pkgs: with pkgs; [ $argv ])"
# Invocation: haskellEnv package1 packages2 .. packageN


function pythonEnv --description 'start a nix-shell with the given python packages' --argument pythonVersion
  if set -q argv[2]
    set argv $argv[2..-1]
  for el in $argv
    set ppkgs $ppkgs "python"$pythonVersion"Packages.$el"
  nix-shell -p $ppkgs

# Invocation: pythonEnv 3 package1 package2 .. packageN
# or:         pythonEnv 2 ..

See also