{ lib, pkgs, config, ... }: let cfg = config.home.dev; in { options = { home.dev = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Development settings."; }; additionalDevPackages = lib.mkOption { type = lib.types.listOf lib.types.package; default = [ ]; description = "Development additional packages: cli/tui/utils"; }; git = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Git settings."; }; userName = lib.mkOption { type = lib.types.str; default = config.home.username; description = "Git user name."; }; userEmail = lib.mkOption { type = lib.types.str; default = ""; description = "Git user email."; }; }; python = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Python base settings & packages."; }; packages = lib.mkOption { type = lib.types.listOf lib.types.package; default = [ pkgs.python314 pkgs.uv ]; description = "List of user python packages."; }; }; rust = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Rust base settings & packages."; }; packages = lib.mkOption { type = lib.types.listOf lib.types.package; default = [ pkgs.gcc pkgs.cargo pkgs.rustc ]; description = "List of user rust packages."; }; }; terminal = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Terminal settings & other stuff."; }; shell = lib.mkOption { type = lib.types.str; default = if cfg.terminal.zsh.enable then "zsh" else "bash"; description = "Change standart shell for kitty"; }; aliases = lib.mkOption { type = lib.types.attrsOf lib.types.str; default = { gc = "sudo nix-collect-garbage -d"; dev = "nix develop --command ${cfg.terminal.shell}"; "..." = "cd ../.."; }; description = "Terminal aliases."; }; kitty.enable = lib.mkOption { type = lib.types.bool; default = false; description = "Configure kitty - terminal emulator."; }; zsh = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Configure zsh - terminal shell."; }; oh-my-zsh = { enable = lib.mkOption { type = lib.types.bool; default = false; description = "Configure oh-my-zsh."; }; plugins = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; description = "Plugins for oh-my-zsh"; }; }; }; }; }; }; config = lib.mkIf cfg.enable { programs.git = lib.mkIf cfg.git.enable { enable = true; package = pkgs.gitAndTools.gitFull; userName = cfg.git.userName; userEmail = cfg.git.userEmail; lfs.enable = true; aliases = { aa = "add --all"; c = "commit"; cm = "commit -m"; br = "branch"; s = "status"; uncommit = "reset --soft HEAD^"; unadd = "reset"; d = "diff"; ds = "diff --staged"; }; extraConfig = { init = { defaultbranch = "main"; }; branch = { soft = "-committerdate"; }; pull.rebase = true; }; }; programs.kitty = lib.mkIf cfg.terminal.kitty.enable { enable = true; package = pkgs.kitty; shellIntegration = lib.mkIf (cfg.terminal.shell == "zsh") { enableZshIntegration = true; }; settings = { shell = cfg.terminal.shell; confirm_os_window_close = 0; enable_audio_bell = false; scrollback_lines = 10000; mouse_hide_wait = "-1.0"; }; keybindings = { "ctrl+=" = "increase_font_size"; "ctrl+-" = "decrease_font_size"; }; }; programs.zsh = lib.mkIf cfg.terminal.zsh.enable { enable = true; package = pkgs.zsh; autocd = true; autosuggestion = { enable = true; strategy = [ "history" ]; }; history = { saveNoDups = true; size = 10000; save = 10000; }; oh-my-zsh = lib.mkIf cfg.terminal.zsh.oh-my-zsh.enable { enable = true; plugins = cfg.terminal.zsh.oh-my-zsh.plugins; }; syntaxHighlighting = { enable = true; }; shellAliases = cfg.terminal.aliases; }; home.packages = cfg.additionalDevPackages ++ lib.optionals cfg.python.enable cfg.python.packages ++ lib.optionals cfg.rust.enable cfg.rust.packages; }; }