{ pkgs, lib, config, ... }: let cfg = config.jhome.dev; in { config = lib.flip lib.pipe [ lib.mkMerge (lib.mkIf (config.jhome.enable && cfg.enable)) ] [ (lib.mkIf cfg.rust.enable { home.packages = [ pkgs.rustup ] ++ cfg.rust.extraPackages; # Background code checker (for Rust) programs.bacon = { enable = true; settings = { export = { enabled = true; path = ".bacon-locations"; line_format = "{kind} {path}:{line}:{column} {message}"; }; }; }; }) { home = { sessionVariables.MANPAGER = lib.optionalString cfg.neovimAsManPager "nvim -c 'Man!' -o -"; packages = cfg.extraPackages; }; # Github CLI programs = { gh.enable = true; gh-dash.enable = true; # Git git = { enable = true; difftastic = { enable = true; background = "dark"; }; lfs.enable = true; extraConfig = { # Add diff to the commit message editor commit.verbose = true; # Improve submodule diff diff.submodule = "log"; # Set the default branch name for new branches init.defaultBranch = "main"; # Better conflicts (also shows parent commit state) merge.conflictStyle = "zdiff3"; # Do not create merge commits when pulling (rebase but abort on conflict) pull.ff = "only"; # Use `--set-upstream` if the remote does not have the branch push.autoSetupRemote = true; rebase = { # If there are uncommitted changes, stash them before rebasing autoStash = true; # If there are fixup! commits, squash them while rebasing autoSquash = true; }; # Enable ReReRe (Reuse Recovered Resolution) auto resolve previously resolved conflicts rerere.enabled = true; # Improve submodule status status.submoduleSummary = true; }; }; lazygit.enable = true; # Jujutsu (alternative DVCS (git-compatible)) jujutsu = { enable = true; package = pkgs.unstable.jujutsu; settings = { ui.pager = "bat"; # mimic git commit --verbose by adding a diff templates.draft_commit_description = '' concat( description, surround( "\nJJ: This commit contains the following changes:\n", "", indent("JJ: ", diff.stat(72)), ), surround( "\nJJ: Diff:\n", "", indent("JJ: ", diff.git()), ), ) ''; }; }; }; } ]; }