From 0ea8b8d2ebf7b65ea10652a85a2268d810cb3556 Mon Sep 17 00:00:00 2001 From: m3tm3re Date: Sun, 26 Apr 2026 13:49:17 +0200 Subject: [PATCH] feat(home): extract CLI tools into modular home/base structure - Add individual modules for: bat, carapace, direnv, eza, fzf, lf, nitch, television, zellij, zellij-ps, zoxide - Centralize in home/base/cli-tools/ with default.nix aggregator - Simplify home/base/packages by removing extracted tools --- home/base/cli-tools/bat.nix | 144 +++++++++++++++++++++++++++++ home/base/cli-tools/carapace.nix | 20 ++++ home/base/cli-tools/default.nix | 17 ++++ home/base/cli-tools/direnv.nix | 19 ++++ home/base/cli-tools/eza.nix | 20 ++++ home/base/cli-tools/fzf.nix | 40 ++++++++ home/base/cli-tools/lf.nix | 27 ++++++ home/base/cli-tools/nitch.nix | 16 ++++ home/base/cli-tools/packages.nix | 51 ++++++++++ home/base/cli-tools/television.nix | 59 ++++++++++++ home/base/cli-tools/zellij-ps.nix | 27 ++++++ home/base/cli-tools/zellij.nix | 33 +++++++ home/base/cli-tools/zoxide.nix | 19 ++++ 13 files changed, 492 insertions(+) create mode 100644 home/base/cli-tools/bat.nix create mode 100644 home/base/cli-tools/carapace.nix create mode 100644 home/base/cli-tools/default.nix create mode 100644 home/base/cli-tools/direnv.nix create mode 100644 home/base/cli-tools/eza.nix create mode 100644 home/base/cli-tools/fzf.nix create mode 100644 home/base/cli-tools/lf.nix create mode 100644 home/base/cli-tools/nitch.nix create mode 100644 home/base/cli-tools/packages.nix create mode 100644 home/base/cli-tools/television.nix create mode 100644 home/base/cli-tools/zellij-ps.nix create mode 100644 home/base/cli-tools/zellij.nix create mode 100644 home/base/cli-tools/zoxide.nix diff --git a/home/base/cli-tools/bat.nix b/home/base/cli-tools/bat.nix new file mode 100644 index 0000000..473ae69 --- /dev/null +++ b/home/base/cli-tools/bat.nix @@ -0,0 +1,144 @@ +# Bat — cat replacement with nix-colors syntax highlighting theme. +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.base.cliTools.bat; + palette = config.colorScheme.palette; +in { + options.base.cliTools.bat.enable = mkEnableOption "enable bat with nix-colors theme"; + + config = mkIf cfg.enable { + programs.bat = { + enable = true; + config = {theme = "universal";}; + themes = { + universal = { + src = pkgs.writeText "universal.tmTheme" '' + + + + + name + Universal (nix-colors) + settings + + + settings + + background + #${palette.base00} + foreground + #${palette.base05} + caret + #${palette.base05} + selection + #${palette.base02} + selectionForeground + #${palette.base05} + lineHighlight + #${palette.base01} + + + + name + Comment + scope + comment + settings + + foreground + #${palette.base03} + fontStyle + italic + + + + name + String + scope + string + settings + + foreground + #${palette.base0A} + + + + name + Number + scope + constant.numeric + settings + + foreground + #${palette.base0E} + + + + name + Keyword + scope + keyword + settings + + foreground + #${palette.base08} + + + + name + Function + scope + entity.name.function + settings + + foreground + #${palette.base0B} + + + + name + Type + scope + entity.name.type, storage.type + settings + + foreground + #${palette.base0D} + + + + name + Variable + scope + variable + settings + + foreground + #${palette.base05} + + + + name + Constant + scope + constant + settings + + foreground + #${palette.base0E} + + + + + + ''; + }; + }; + }; + }; +} diff --git a/home/base/cli-tools/carapace.nix b/home/base/cli-tools/carapace.nix new file mode 100644 index 0000000..5fbb595 --- /dev/null +++ b/home/base/cli-tools/carapace.nix @@ -0,0 +1,20 @@ +# Carapace — multi-shell completion engine with Fish, Nushell, and Bash integration. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.carapace; +in { + options.base.cliTools.carapace.enable = mkEnableOption "enable carapace completion engine"; + + config = mkIf cfg.enable { + programs.carapace = { + enable = true; + enableFishIntegration = true; + enableNushellIntegration = true; + enableBashIntegration = true; + }; + }; +} diff --git a/home/base/cli-tools/default.nix b/home/base/cli-tools/default.nix new file mode 100644 index 0000000..3125597 --- /dev/null +++ b/home/base/cli-tools/default.nix @@ -0,0 +1,17 @@ +# CLI tools aggregator — imports all base command-line utilities. +{...}: { + imports = [ + ./bat.nix + ./carapace.nix + ./direnv.nix + ./eza.nix + ./fzf.nix + ./lf.nix + ./nitch.nix + ./packages.nix + ./television.nix + ./zellij.nix + ./zellij-ps.nix + ./zoxide.nix + ]; +} diff --git a/home/base/cli-tools/direnv.nix b/home/base/cli-tools/direnv.nix new file mode 100644 index 0000000..d7f7c7e --- /dev/null +++ b/home/base/cli-tools/direnv.nix @@ -0,0 +1,19 @@ +# Direnv — automatic environment loading with nix-direnv integration. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.direnv; +in { + options.base.cliTools.direnv.enable = mkEnableOption "enable direnv with nix-direnv"; + + config = mkIf cfg.enable { + programs.direnv = { + enable = true; + enableNushellIntegration = true; + nix-direnv.enable = true; + }; + }; +} diff --git a/home/base/cli-tools/eza.nix b/home/base/cli-tools/eza.nix new file mode 100644 index 0000000..9d2df93 --- /dev/null +++ b/home/base/cli-tools/eza.nix @@ -0,0 +1,20 @@ +# Eza — modern ls replacement with icons, git status, and long format by default. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.eza; +in { + options.base.cliTools.eza.enable = mkEnableOption "enable eza modern ls replacement"; + + config = mkIf cfg.enable { + programs.eza = { + enable = true; + enableFishIntegration = true; + enableBashIntegration = true; + extraOptions = ["-l" "--icons" "--git" "-a"]; + }; + }; +} diff --git a/home/base/cli-tools/fzf.nix b/home/base/cli-tools/fzf.nix new file mode 100644 index 0000000..f4ef6af --- /dev/null +++ b/home/base/cli-tools/fzf.nix @@ -0,0 +1,40 @@ +# Fuzzy finder with nix-colors palette and Wayland clipboard integration. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.fzf; +in { + options.base.cliTools.fzf.enable = mkEnableOption "enable fuzzy finder"; + + config = mkIf cfg.enable { + programs.fzf = { + enable = true; + enableFishIntegration = true; + colors = { + "fg" = "#${config.colorScheme.palette.base05}"; + "bg" = "#${config.colorScheme.palette.base00}"; + "hl" = "#${config.colorScheme.palette.base0E}"; + "fg+" = "#${config.colorScheme.palette.base05}"; + "bg+" = "#${config.colorScheme.palette.base02}"; + "hl+" = "#${config.colorScheme.palette.base0E}"; + "info" = "#${config.colorScheme.palette.base09}"; + "prompt" = "#${config.colorScheme.palette.base0B}"; + "pointer" = "#${config.colorScheme.palette.base08}"; + "marker" = "#${config.colorScheme.palette.base08}"; + "spinner" = "#${config.colorScheme.palette.base09}"; + "header" = "#${config.colorScheme.palette.base03}"; + }; + defaultOptions = [ + "--preview='bat --color=always -n {}'" + "--bind 'ctrl-/:toggle-preview'" + "--header 'Press CTRL-Y to copy command into clipboard'" + "--bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort'" + ]; + defaultCommand = "fd --type f --exclude .git --follow --hidden"; + changeDirWidgetCommand = "fd --type d --exclude .git --follow --hidden"; + }; + }; +} diff --git a/home/base/cli-tools/lf.nix b/home/base/cli-tools/lf.nix new file mode 100644 index 0000000..67bc50a --- /dev/null +++ b/home/base/cli-tools/lf.nix @@ -0,0 +1,27 @@ +# Lf — terminal file manager with bat preview and Dracula theme. +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.base.cliTools.lf; +in { + options.base.cliTools.lf.enable = mkEnableOption "enable lf terminal file manager"; + + config = mkIf cfg.enable { + home.packages = [pkgs.lf]; + + programs.lf = { + enable = true; + settings = { + preview = true; + drawbox = true; + hidden = true; + icons = true; + previewer = "bat"; + }; + }; + }; +} diff --git a/home/base/cli-tools/nitch.nix b/home/base/cli-tools/nitch.nix new file mode 100644 index 0000000..dc2147d --- /dev/null +++ b/home/base/cli-tools/nitch.nix @@ -0,0 +1,16 @@ +# Nitch — minimal system information display tool. +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.base.cliTools.nitch; +in { + options.base.cliTools.nitch.enable = mkEnableOption "enable nitch"; + + config = mkIf cfg.enable { + home.packages = [pkgs.nitch]; + }; +} diff --git a/home/base/cli-tools/packages.nix b/home/base/cli-tools/packages.nix new file mode 100644 index 0000000..fcfec2a --- /dev/null +++ b/home/base/cli-tools/packages.nix @@ -0,0 +1,51 @@ +# Essential CLI packages — core utilities always available on every host. +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.base.cliTools.essentials; +in { + options.base.cliTools.essentials.enable = mkEnableOption "enable essential CLI packages"; + + config = mkIf cfg.enable { + home.packages = with pkgs; [ + # Core utilities + coreutils + fd + htop + jq + ripgrep + + # Dev tools + devenv + gcc + go + httpie + just + lazygit + nix-index + nix-update + progress + sqlite + sqlite-vec + tldr + + # AI tools + comma + fabric-ai + llm + + # Misc + basecamp + hyprpaper-random + libnotify + trash-cli + unzip + yazi + zip + ]; + }; +} diff --git a/home/base/cli-tools/television.nix b/home/base/cli-tools/television.nix new file mode 100644 index 0000000..3c6aa67 --- /dev/null +++ b/home/base/cli-tools/television.nix @@ -0,0 +1,59 @@ +# Television — fuzzy finder with custom channels for tldr, git-diff, and git-log. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.television; +in { + options.base.cliTools.television.enable = mkEnableOption "enable television"; + + config = mkIf cfg.enable { + programs.television = { + enable = true; + channels = { + tldr = { + metadata = { + description = "Browse TLDR pages"; + name = "tldr"; + requirements = ["tldr"]; + }; + preview = { + command = "tldr '{}'"; + }; + source = { + command = "tldr --list"; + }; + }; + git-diff = { + metadata = { + description = "A channel to select files from git diff commands"; + name = "git-diff"; + requirements = ["git"]; + }; + preview = { + command = "git diff HEAD --color=always -- '{}'"; + }; + source = { + command = "git diff --name-only HEAD"; + }; + }; + git-log = { + metadata = { + description = "A channel to select from git log entries"; + name = "git-log"; + requirements = ["git"]; + }; + preview = { + command = "git show -p --stat --pretty=fuller --color=always '{0}'"; + }; + source = { + command = "git log --oneline --date=short --pretty=\"format:%h %s %an %cd\" \"$@\""; + output = "{split: :0}"; + }; + }; + }; + }; + }; +} diff --git a/home/base/cli-tools/zellij-ps.nix b/home/base/cli-tools/zellij-ps.nix new file mode 100644 index 0000000..c2f8c72 --- /dev/null +++ b/home/base/cli-tools/zellij-ps.nix @@ -0,0 +1,27 @@ +# Zellij-ps — project-aware Zellij session manager from m3ta-nixpkgs. +# Delegates to the cli.zellij-ps module provided by inputs.m3ta-nixpkgs. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.zellijPs; +in { + options.base.cliTools.zellijPs = { + enable = mkEnableOption "enable zellij-ps project session manager"; + + projectFolders = mkOption { + type = types.listOf types.path; + description = "Project root folders scanned by zellij-ps."; + default = ["${config.home.homeDirectory}/p"]; + }; + }; + + config = mkIf cfg.enable { + cli.zellij-ps = { + enable = true; + projectFolders = cfg.projectFolders; + }; + }; +} diff --git a/home/base/cli-tools/zellij.nix b/home/base/cli-tools/zellij.nix new file mode 100644 index 0000000..38e5c40 --- /dev/null +++ b/home/base/cli-tools/zellij.nix @@ -0,0 +1,33 @@ +# Zellij terminal multiplexer with nix-colors theming. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.zellij; +in { + options.base.cliTools.zellij.enable = mkEnableOption "enable zellij multiplexer"; + + config = mkIf cfg.enable { + programs.zellij = { + enable = true; + settings = { + theme = "universal"; + themes.universal = { + bg = "#${config.colorScheme.palette.base00}"; + fg = "#${config.colorScheme.palette.base05}"; + black = "#${config.colorScheme.palette.base01}"; + red = "#${config.colorScheme.palette.base08}"; + green = "#${config.colorScheme.palette.base0B}"; + yellow = "#${config.colorScheme.palette.base0A}"; + blue = "#${config.colorScheme.palette.base0D}"; + magenta = "#${config.colorScheme.palette.base0E}"; + cyan = "#${config.colorScheme.palette.base0C}"; + white = "#${config.colorScheme.palette.base07}"; + orange = "#${config.colorScheme.palette.base09}"; + }; + }; + }; + }; +} diff --git a/home/base/cli-tools/zoxide.nix b/home/base/cli-tools/zoxide.nix new file mode 100644 index 0000000..8c27c6f --- /dev/null +++ b/home/base/cli-tools/zoxide.nix @@ -0,0 +1,19 @@ +# Zoxide — smarter cd with Fish and Nushell integration. +{ + config, + lib, + ... +}: +with lib; let + cfg = config.base.cliTools.zoxide; +in { + options.base.cliTools.zoxide.enable = mkEnableOption "enable zoxide smarter cd"; + + config = mkIf cfg.enable { + programs.zoxide = { + enable = true; + enableFishIntegration = true; + enableNushellIntegration = true; + }; + }; +}