{ config, lib, pkgs, ... }: let cfg = config.devkit; in { options.devkit = with lib; { enable = mkEnableOption "Enable devkit configuration and packages"; ghostty.enable = mkOption { type = with types; bool; default = cfg.enable; }; git.enable = mkOption { type = with types; bool; default = cfg.enable; }; git.wrapper = mkOption { type = with types; nullOr package; default = null; }; lazygit.enable = mkOption { type = with types; bool; default = cfg.enable; }; neovim.enable = mkOption { type = with types; bool; default = cfg.enable; }; starship.enable = mkOption { type = with types; bool; default = cfg.enable; }; tmux.enable = mkOption { type = with types; bool; default = cfg.enable; }; yazi.enable = mkOption { type = with types; bool; default = cfg.enable; }; zellij.enable = mkOption { type = with types; bool; default = cfg.enable; }; zsh.enable = mkOption { type = with types; bool; default = cfg.enable; }; }; config = lib.mkIf cfg.enable { home.packages = with pkgs; [ ouch # TODO: move this to neovim configuration/derivation (pkgs.writeShellScriptBin "gvim" '' ${lib.getExe config.programs.neovide.package} -- "$@" '') git-lfs-transfer ]; home.sessionVariables = { SHELL = lib.mkIf cfg.zsh.enable "${lib.getExe config.programs.zsh.package}"; TERM = lib.mkIf cfg.ghostty.enable "xterm-256color"; # Used to be ghostty, but it is borked TERMINAL = lib.mkIf cfg.ghostty.enable "${lib.getExe config.programs.wezterm.package}"; EXPLORER = lib.mkIf cfg.yazi.enable "${lib.getExe config.programs.yazi.package}"; }; # Local development shells programs.direnv.enable = true; programs.direnv.nix-direnv.enable = true; # SSH programs.ssh.enable = true; programs.ssh.matchBlocks = { "battleship" = { hostname = "battleship"; user = "${config.home.username}"; identitiesOnly = true; identityFile = "${config.home.homeDirectory}/home/battleship"; extraOptions = {RequestTTY = "yes";}; }; "fithter" = { hostname = "fighter"; user = "${config.home.username}"; identitiesOnly = true; identityFile = "${config.home.homeDirectory}/home/fighter"; extraOptions = {RequestTTY = "yes";}; }; }; # GPG Keyring programs.gpg.enable = true; programs.gpg.mutableKeys = true; programs.gpg.mutableTrust = true; services.gpg-agent.enable = true; services.gpg-agent.defaultCacheTtl = 3600 * 24; services.gpg-agent.pinentry.package = pkgs.pinentry-gtk2; # Devkit packages ## Ghostty (Terminal) programs.ghostty = lib.mkIf cfg.ghostty.enable { enable = true; package = config._devkit.packages.ghostty; }; programs.wezterm.enable = true; ## Git programs.git = lib.mkIf cfg.git.enable { enable = true; userEmail = "contact@guz.one"; userName = "Gustavo \"Guz\" L de Mello"; package = if isNull cfg.git.wrapper then config._devkit.packages.git else pkgs.writeShellScriptBin "git" '' ${lib.getExe cfg.git.wrapper} ${lib.getExe config._devkit.packages.git} "$@" ''; lfs.enable = true; }; ## Lazygit (Git TUI) programs.lazygit = lib.mkIf cfg.lazygit.enable { enable = true; package = config._devkit.packages.lazygit; # package = pkgs.lazygit; }; ## Neovim (Editor) neovim.enable = cfg.neovim.enable; programs.neovide.enable = true; ## Starship (Shell decoration) programs.starship = lib.mkIf cfg.starship.enable { enable = true; package = config._devkit.packages.starship; # package = pkgs.starship; }; ## Yazi (File manager) programs.yazi = lib.mkIf cfg.yazi.enable { enable = true; package = config._devkit.packages.yazi; # package = pkgs.yazi; }; # Zellij (Terminal multiplexer) programs.zellij = lib.mkIf cfg.zellij.enable { enable = true; package = config._devkit.packages.zellij; }; ## Tmux (Backup terminal multiplexer) programs.tmux = lib.mkIf cfg.tmux.enable { enable = true; package = config._devkit.packages.tmux; }; ## ZSH (Default shell) programs.zsh = lib.mkIf cfg.zsh.enable { enable = true; # package = config._devkit.packages.zsh; package = pkgs.zsh; autosuggestion.enable = true; enableCompletion = true; syntaxHighlighting.enable = true; }; }; }