Migrate global configuration to and expand home

- Move lots of system config to home (browser, editors, etc.)
- Improve catppuccin support (kitty, cursors, etc.)
- Improve overall theme (fonts, icons in kitty)
- Add coded's system hardware configuration ("shorthair")
- Add the ed editor
- Split minion's system hardware configuration ("greylag") into several files
- Improve shell support (aliases, useful packages, replacements, etc.)

Change-Id: Ie6d40f809b2662268a9a6fa8b241641bbfef9442
Reviewed-on: https://git.clicks.codes/c/Chimera/NixFiles/+/383
Tested-by: Skyler Grey <minion@clicks.codes>
Reviewed-by: Samuel Shuert <coded@clicks.codes>
diff --git a/modules/home/shell/bash/default.nix b/modules/home/shell/bash/default.nix
new file mode 100644
index 0000000..3eb3bf6
--- /dev/null
+++ b/modules/home/shell/bash/default.nix
@@ -0,0 +1,24 @@
+{ config, lib, ... }:
+{
+  options.chimera.shell.bash = {
+    enable = lib.mkEnableOption "Enable Bash Shell";
+    default = lib.mkOption {
+      type = lib.types.bool;
+      description = "Set as default shell";
+      default = true;
+    };
+    extraAliases = lib.mkOption {
+      type = lib.types.attrsOf lib.types.str;
+      description = "Attrset of extra shell aliases";
+      default = { };
+    };
+  };
+
+  config = lib.mkIf config.chimera.shell.bash.enable {
+    programs.bash = {
+      enable = true;
+
+      shellAliases = config.chimera.shell.bash.extraAliases;
+    };
+  };
+}
diff --git a/modules/home/shell/default.nix b/modules/home/shell/default.nix
new file mode 100644
index 0000000..f03ad77
--- /dev/null
+++ b/modules/home/shell/default.nix
@@ -0,0 +1,67 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+  options.chimera.shell = {
+    rebuildFlakePath = lib.mkOption {
+      type = lib.types.nullOr lib.types.str;
+      description = "Full path to where you store your flake locally";
+      default = null;
+    };
+    defaultAliases.enable = lib.mkEnableOption "Use sensible custom aliases";
+    usefulPackages.enable = lib.mkEnableOption "Enable useful shell packages (ripgrep, wget, etc)";
+    replacements = {
+      eza.enable = lib.mkEnableOption "Use eza instead of ls";
+      bfs.enable = lib.mkEnableOption "Use bfs instead of find";
+      ripgrep.enable = lib.mkEnableOption "Use ripgrep instead of grep";
+      htop.enable = lib.mkEnableOption "Use htop instead of top";
+      erdtree.enable = lib.mkEnableOption "Use erdtree instead of tree";
+      dust.enable = lib.mkEnableOption "Use dust instead of du";
+      bat.enable = lib.mkEnableOption "Use bat instead of cat";
+    };
+  };
+
+  config = {
+    home.shellAliases = lib.mkIf config.chimera.shell.defaultAliases.enable {
+      rebuild =
+        lib.mkIf (config.chimera.shell.rebuildFlakePath != null)
+          "sudo nixos-rebuild switch --flake ${config.chimera.shell.rebuildFlakePath}";
+      clr = "clear";
+      edit = config.home.sessionVariables.EDITOR;
+    };
+
+    programs = lib.mkIf config.chimera.shell.usefulPackages.enable {
+      tealdeer = {
+        enable = true;
+        settings.updates.autoupdate = true;
+      };
+      jq.enable = true;
+    };
+
+    home.packages =
+      (
+        if config.chimera.shell.usefulPackages.enable then
+          [
+            pkgs.wget
+            pkgs.curl
+            pkgs.curlie
+            pkgs.pv
+            pkgs.sd
+            pkgs.tokei
+            pkgs.hyperfine
+          ]
+        else
+          [ ]
+      )
+      ++ (if config.chimera.shell.replacements.eza.enable then [ pkgs.eza ] else [ ])
+      ++ (if config.chimera.shell.replacements.bfs.enable then [ pkgs.bfs ] else [ ])
+      ++ (if config.chimera.shell.replacements.ripgrep.enable then [ pkgs.ripgrep ] else [ ])
+      ++ (if config.chimera.shell.replacements.htop.enable then [ pkgs.htop ] else [ ])
+      ++ (if config.chimera.shell.replacements.erdtree.enable then [ pkgs.erdtree ] else [ ])
+      ++ (if config.chimera.shell.replacements.dust.enable then [ pkgs.dust ] else [ ])
+      ++ (if config.chimera.shell.replacements.bat.enable then [ pkgs.bat ] else [ ]);
+  };
+}
diff --git a/modules/home/shell/starship/default.nix b/modules/home/shell/starship/default.nix
new file mode 100644
index 0000000..4a958eb
--- /dev/null
+++ b/modules/home/shell/starship/default.nix
@@ -0,0 +1,13 @@
+{ config, lib, ... }:
+{
+  options.chimera.shell.starship.enable = lib.mkEnableOption "Enable to use starship prompt";
+
+  config = lib.mkIf config.chimera.shell.starship.enable {
+    programs.starship = {
+      enable = true;
+      settings = {
+        format = "$all";
+      };
+    };
+  };
+}
diff --git a/modules/home/shell/zsh/default.nix b/modules/home/shell/zsh/default.nix
new file mode 100644
index 0000000..6b669fd
--- /dev/null
+++ b/modules/home/shell/zsh/default.nix
@@ -0,0 +1,51 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+
+  options.chimera.shell.zsh = {
+    enable = lib.mkEnableOption "Enable ZSH Shell";
+    default = lib.mkOption {
+      type = lib.types.bool;
+      description = "Set as default shell";
+      default = true;
+    };
+    extraAliases = lib.mkOption {
+      type = lib.attrsOf lib.types.str;
+      description = "Attrset of extra shell aliases";
+      default = { };
+    };
+    dirHashes = lib.mkOption {
+      type = lib.attrsOf lib.types.str;
+      description = "Attrset of ~DIR's";
+      default = { };
+    };
+  };
+
+  config = lib.mkIf config.chimera.shell.zsh.enable {
+    programs.zsh = {
+      enable = true;
+      enableAutosuggestions = true;
+      enableCompletion = true;
+      autocd = true;
+      defaultKeymap = "emacs";
+
+      shellAliases = config.chimera.shell.zsh.extraAliases;
+
+      dirHashes = config.chimera.shell.zsh.dirHashes;
+
+      history = {
+        extended = true;
+      };
+      historySubstringSearch.enable = true;
+
+      oh-my-zsh = {
+        enable = true;
+        plugins = [ "git" ];
+      };
+    };
+  };
+}