{
  config,
  pkgs,
  ...
}: let
  inherit (config) conf;
  inherit (config.conf) keys;
in {
  programs.fish.enable = true;
  users.defaultUserShell = pkgs.fish;

  home-manager.users.${conf.username} = {
    home.packages = with pkgs; [
      man-pages
      man-pages-posix
    ];

    home.file = {
      ".gdbinit" = {
        source = ./gdbinit.conf;
      };
    };

    programs.man = {
      enable = true;
    };

    programs.less = {
      enable = true;
      keys = ''
        ${keys.up} back-line
        ${keys.down} forw-line
      '';
    };

    programs.git = {
      enable = true;
      userName = "twoneis";
      userEmail = "git@chpu.eu";
      extraConfig = {
        init.defaultBranch = "main";
        push.autoSetupRemote = true;
      };
    };

    programs.helix = {
      enable = true;
      defaultEditor = true;
      extraPackages = with pkgs; [nil marksman];
      settings = import ./helix.conf.nix {config = config;};
      languages = import ./helix-languages.conf.nix {};
    };

    programs.direnv = {
      enable = true;
      enableBashIntegration = true;
      nix-direnv.enable = true;
    };

    programs.bottom = {
      enable = true;
    };

    programs.hyfetch = {
      enable = true;
      settings = import ./hyfetch.conf.nix {};
    };

    programs.fish = {
      enable = true;

      plugins = [
        {
          name = "pure";
          src = pkgs.fishPlugins.pure.src;
        }
      ];

      functions = {
        run = {
          body = ''
            nix run nixpkgs#$argv[1] -- $argv[2..]
          '';
        };

        initdev = {
          body = ''
            nix flake init -t github:twoneis/flakes#$argv[1]
          '';
        };

        fish_prompt = {
          body = builtins.readFile ./prompt.fish;
        };
      };

      shellAliases = {
        ll = "ls --almost-all --ignore-backups --literal --human-readable --time-style=long-iso -l";
      };

      shellAbbrs = {
        ga = "git add";
        gc = "git commit";
        gp = "git push";
        gs = "git submodule sync --recursive && git submodule update --init --recursive";
        gpl = "git pull --recurse-submodules";
        gst = "git status";

        nrb = "sudo nixos-rebuild switch --cores 0 --flake .";
        nd = "nix develop";
        repl = "nix repl --expr 'import <nixpkgs>{}'";
      };
    };
  };
}
