Fish: Difference between revisions

imported>Onny
Add notes on installing plugins system wide
Setting fish as default shell: Added a method for Gnome Console
 
(15 intermediate revisions by 11 users not shown)
Line 1: Line 1:
{{DISPLAYTITLE:fish}}
{{DISPLAYTITLE:fish}}
fish is the [http://fishshell.com/ Friendly Interactive Shell].
fish, the [http://fishshell.com/ Friendly Interactive Shell], is a [[Command Shell|command shell]] designed around user-friendliness.


== Installation ==
== Installation ==


For setting fish as the default shell system wide, see [[Command Shell#Changing default shell]].
=== NixOS System Installation ===


A user specific installation with [[Home Manager]] looks like this
To install fish for a user on a regular nixos system:


<syntaxhighlight lang="nix">
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
  programs.fish.enable = true;
  users.extraUsers.myuser = {
    ...
    shell = pkgs.fish;
  };
</nowiki>
}}
Replace <code>myuser</code> with the appropriate username.
 
{{warning| [https://fishshell.com/docs/current/index.html#default-shell As noted in the fish documentation], using fish as your *login* shell (via <code>/etc/passwd</code>) may cause issues, particularly for the <code>root</code> user, because fish is not POSIX compliant. While using fish as the default shell for regular users is generaly safe, caution is still advised. See [[#Setting fish as default shell]] for recommendations and mitigations.}}
 
=== Home Manager ===
 
For a user-specific installation managed by [[Home Manager]], use the following configuration:
 
{{file|home.nix|nix|
<nowiki>
home-manager.users.myuser = {
home-manager.users.myuser = {
   programs.fish.enable = true;
   programs.fish.enable = true;
};
};
</syntaxhighlight>
</nowiki>
}}


Change <code>myuser</code> with the username you want to configure.
Replace <code>myuser</code> with the appropriate username.


You can enable the fish shell and manage fish configuration and plugins with home manager, but to enable vendor fish completions provided by Nixpkgs you will also want to enable the fish shell in <code>/etc/nixos/configuration.nix</code>:
You can enable the fish shell and manage fish configuration and plugins with Home Manager, but to enable vendor fish completions provided by Nixpkgs you will also want to enable the fish shell:


<syntaxhighlight lang="nix">
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
   programs.fish.enable = true;
   programs.fish.enable = true;
</syntaxhighlight>
</nowiki>
}}


== Configuration ==
== Configuration ==


=== System wide ===
Available fish plugins packaged in Nixpkgs can be found via the [https://search.nixos.org/packages?query=fishPlugins fishPlugins package set].
 
=== NixOS System Configuration ===


To enable fish plugins, add your prefered plugins to `environment.systemPackages` to enable them:
To enable fish plugins system-wide, add your preferred plugins to `environment.systemPackages`:


<syntaxhighlight lang="nix">
{{file|/etc/nixos/configuration.nix|nix|
environment.systemPackages = with pkgs; [
<nowiki>
  fishPlugins.done
  programs.fish = {
  fishPlugins.fzf-fish
    enable = true;
  fishPlugins.forgit
    interactiveShellInit = ''
  fishPlugins.hydro
      set fish_greeting # Disable greeting
  fzf
    '';
  fishPlugins.grc
  };
  grc
 
];
  environment.systemPackages = with pkgs; [
    ...
    fishPlugins.done
    fishPlugins.fzf-fish
    fishPlugins.forgit
    fishPlugins.hydro
    fzf
    fishPlugins.grc
    grc
    # Use 3rd-party fish plugins manually packaged.
    (pkgs.callPackage ../fish-colored-man.nix {buildFishPlugin = pkgs.fishPlugins.buildFishPlugin; } )
  ];
</nowiki>
|name=/etc/nixos/configuration.nix|lang=nix}}
Example of a file containing the definition of a fish plugin.
{{file|/etc/nixos/fish-colored-man.nix|nix|
<nowiki>
{
  lib,
  buildFishPlugin,
  fetchFromGitHub,
}:
buildFishPlugin {
  pname = "fish-colored-man";
  version = "0-unstable-20240416";
  src = fetchFromGitHub {
    owner = "decors";
    repo = "fish-colored-man";
    rev = "1ad8fff696d48c8bf173aa98f9dff39d7916de0e";
    hash = "sha256-uoZ4eSFbZlsRfISIkJQp24qPUNqxeD0JbRb/gVdRYlA=";
  };
}
</nowiki>
}}


programs.fish.enable = true;
For a full list of fish module options, refer to [https://search.nixos.org/options?query=programs.fish programs.fish].
</syntaxhighlight>


=== Home Manager ===
=== Home Manager ===


An example configuration in Home Manager for adding plugins and changing options could look like this
An example configuration in Home Manager for adding plugins and changing options could look like this:


<syntaxhighlight lang="nix">
{{file|home.nix|nix|
<nowiki>
home-manager.users.myuser = {
home-manager.users.myuser = {
   programs.fish = {
   programs.fish = {
Line 58: Line 115:
       # Manually packaging and enable a plugin
       # Manually packaging and enable a plugin
       {
       {
      name = "z";
        name = "z";
      src = pkgs.fetchFromGitHub {
        src = pkgs.fetchFromGitHub {
        owner = "jethrokuan";
          owner = "jethrokuan";
        repo = "z";
          repo = "z";
        rev = "e0e1b9dfdba362f8ab1ae8c1afc7ccf62b89f7eb";
          rev = "e0e1b9dfdba362f8ab1ae8c1afc7ccf62b89f7eb";
        sha256 = "0dbnir6jbwjpjalz14snzd3cgdysgcs3raznsijd6savad3qhijc";
          sha256 = "0dbnir6jbwjpjalz14snzd3cgdysgcs3raznsijd6savad3qhijc";
       };
        };
     }
       }
   ];
    ];
</syntaxhighlight>
  };
};
</nowiki>
}}
 
For the full list of available home-manager options for fish, refer to the [https://github.com/nix-community/home-manager/blob/master/modules/programs/fish.nix module source].
 
== Tips and tricks ==
 
=== Setting fish as default shell ===
 
Using fish as the the login shell can cause compatibility issues. For example, certain recovery environments such as systemd's emergency mode to be completely broken when fish was set as the login shell. This  limitation is noted on the [https://wiki.gentoo.org/wiki/Fish#Caveats Gentoo] wiki. There they present an alternative, keeping bash as the system shell but having it exec fish when run interactively.
 
Here is one solution, which launches fish unless the parent process is already fish:
 
{{file|/etc/nixos/configuration.nix|nix|
<nowiki>
programs.bash = {
  interactiveShellInit = ''
     if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
    then
      shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
      exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
    fi
   '';
};
</nowiki>
}}
 
'''Setting fish as default for Gnome Console'''
 
It is possible to set fish as the interactive non-login shell for Gnome Console without setting fish as the login shell (the login shell in /etc/passwd for your user will not be fish).
 
{{File|3=home-manager.users.myuser = {
    dconf = {
        enable = true;
        settings."org/gnome/console" = {
            shell = [ "FISH" ];
        };
    };
};|name=home.nix|lang=nix}}
 
 
If you still want to set fish as the login shell, see [[Command Shell#Changing the default shell]].
 
==== Disable man page generation ====
Some users suffer from slow build due to fish enabling `documentation.man.generateCaches`. You may force false.
documentation.man.generateCaches = false'';''


See [https://search.nixos.org/packages?channel=unstable&from=0&size=50&buckets=%7B%22package_attr_set%22%3A%5B%22fishPlugins%22%5D%2C%22package_license_set%22%3A%5B%5D%2C%22package_maintainers_set%22%3A%5B%5D%2C%22package_platforms%22%3A%5B%5D%7D&sort=relevance&query=fishPlugins fishPlugins package set] for available plugins in nixpkgs.
==== Running fish interactively with zsh as system shell on darwin ====


== Useful scripts ==
Zsh users on darwin will need to use a modified version of the above snippet. As written, it presents two incompatibilities. First, being BSD-derived, MacOS's <code>ps</code> command accepts different options. Second, this is a script intended for bash, not zsh. MacOS uses zsh as its default shell.
 
<syntaxhighlight lang="nix">
programs.zsh = {
  initExtra = ''
    if [[ $(ps -o command= -p "$PPID" | awk '{print $1}') != 'fish' ]]
    then
        exec fish -l
    fi
  ''
};
</syntaxhighlight>


=== Show that you are in a nix-shell ===
=== Show that you are in a nix-shell ===
Line 90: Line 205:
</syntaxhighlight>
</syntaxhighlight>


Now your prompt looks like this
Now your prompt looks like this:


* outside: <code>~></code>
* outside: <code>~></code>
* inside: <code><nix-shell> ~></code>
* inside: <code><nix-shell> ~></code>


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


=== Environments ===
=== Environments ===
Helper functions that put you in a nix-shell with the given packages installed.  
 
Here are some examples of helper functions that put you in a nix-shell with the given packages installed.  


You can either put these in <code>programs.fish.functions</code> with home-manager or in <code>~/.config/fish/functions/fish_prompt.fish</code> without.
You can either put these in <code>programs.fish.functions</code> with home-manager or in <code>~/.config/fish/functions/fish_prompt.fish</code> without.
Line 135: Line 251:
* [[Command Shell]]
* [[Command Shell]]


[[Category:Applications]]
 
[[Category:Shell]]