{ lib, ... }:
{
  config = {
    programs.fish = {
      enable = true;

      binds = {
        "ctrl-d".command = "exit";

        # Tests `name` field to specify multiple binds for the same key (`ctrl-d`) but different `mode`
        "visual_ctrl-d" = {
          name = "ctrl-d";
          mode = "visual";
          command = "exit";
        };

        # Allow arbitrary modes
        "f" = {
          mode = "something-non-default";
          command = "exit";
        };

        "ctrl-c" = {
          mode = "insert";
          command = [
            "kill-whole-line"
            "repaint"
          ];
        };

        "ctrl-g" = {
          command = [
            "git diff"
            "repaint"
          ];
        };

        "alt-s".erase = true;
        "alt-s".operate = "preset";
        "alt-s".command = "fish_commandline_prepend sudo";
      };
    };

    # Needed to avoid error with dummy fish package.
    xdg.dataFile."fish/home-manager/generated_completions".source = lib.mkForce (
      builtins.toFile "empty" ""
    );

    nmt = {
      description = "if fish.binds is set, check function exists and contains valid binds";
      script = ''
        assertFileExists home-files/.config/fish/functions/fish_user_key_bindings.fish

        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind ctrl-d exit"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind --mode insert ctrl-c kill-whole-line repaint"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind ctrl-g 'git diff' repaint"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind -e --preset alt-s"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind --preset alt-s 'fish_commandline_prepend sudo"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind --mode visual ctrl-d exit"
        assertFileContains home-files/.config/fish/functions/fish_user_key_bindings.fish \
          "bind --mode something-non-default f exit"
      '';
    };
  };
}
