aboutsummaryrefslogblamecommitdiff
path: root/nix/users/fcuny/home-manager.nix
blob: adb3adcbc034cc727e617c20ecf09d904e6a34de (plain) (tree)
1
2
3
4
5
6
7
8
9

        


                                  



                              






































































                                                               


















































                                                                              

                         































































































































                                                                                      
{ ... }:

{ config, lib, pkgs, ... }:
let isLinux = pkgs.stdenv.isLinux;
in {
  home.stateVersion = "23.05";

  xdg.enable = true;

  home.packages = with pkgs;
    [
      # go
      go-tools
      golangci-lint
      gopls
      delve

      # docker
      dive # explore layers in docker images

      # shell
      shellcheck

      # git
      gitAndTools.pre-commit
      git-credential-manager
      gh

      # shell utils
      coreutils
      direnv
      dust
      procs
      ripgrep
      tree
      wget

      # network
      bandwhich

      # data manipulation
      jless
      jq
      yq

      # encryption
      age

      # media
      mpv
      ffmpeg

      # dicts
      aspell
      aspellDicts.en
      aspellDicts.en-computers
      aspellDicts.en-science

      # nix
      nil
      nix-direnv
      nixd
      nixfmt-classic
      nixpkgs-fmt
      nil # nix lsp

      # k8s
      kind # k8s in docker
      kubebuilder # generate controller
      kubectl
      kubernetes-helm # deploy applications
      kubie # kubeconfig browser https://github.com/sbstp/kubie
      kubelogin-oidc # OIDC plugin
      k9s # object explorer

      # hashicorp
      boundary
      nomad-pack
      tfswitch
    ] ++ (lib.optionals (isLinux) [ htop ]);

  programs.go = {
    enable = true;
    goPath = ".local/share/pkg.go";
    goBin = ".local/bin.go";
    goPrivate = [ "github.rbx.com/*" "github.com/fcuny/*" "git.fcuny.net/*" ];
  };

  # an alternative to ls
  programs.eza = {
    enable = true;
    icons = "never";
    enableFishIntegration = false;
    extraOptions = [
      "--group-directories-first"
      "--no-quotes"
      "--git-ignore"
      "--icons=never"
    ];
  };

  # an alternative to find
  programs.fd = {
    enable = true;
    hidden = true;
    ignores = [ ".git/" ".direnv/" ];
  };

  programs.direnv = {
    enable = true;
    nix-direnv.enable = true;
    enableZshIntegration = true;
    config = {
      global.disable_stdin = true;
      global.strict_env = true;
    };
  };

  programs.fish = {
    enable = true;
    interactiveShellInit = ''
      set fish_greeting ""
    '';

    shellAbbrs = { ncg = "nix-collect-garbage -d"; };
    shellAliases = {
      c = "clear";
      ls = "eza -l -L=1 --git --color=always --group-directories-first";
      la = "eza -la --git --color=always --group-directories-first";
      ll = "eza -la -L=1 --git --color=always --group-directories-first";
      lt = "eza -aT -L=2 --git --color=always --group-directories-first";
      k = "kubectl";
      kctx = "kubie ctx";
    };
  };

  programs.git = {
    enable = true;
    userName = "Franck Cuny";
    userEmail = "franck@fcuny.net";

    aliases = { amend = "commit --amend"; };

    includes = [
      {
        condition = "hasconfig:remote.*.url:git@github.rbx.com:**";
        path = pkgs.writeText "finsitGitConfig"
          (lib.generators.toGitINI { user.email = "fcuny@roblox.com"; });
      }
      {
        condition = "hasconfig:remote.*.url:git@github.com:Roblox/**";
        path = pkgs.writeText "finsitGitConfig"
          (lib.generators.toGitINI { user.email = "fcuny@roblox.com"; });
      }
    ];

    extraConfig = {
      core.whitespace = "trailing-space,space-before-tab";
      color.ui = "true";

      # abort if the remote branch does not match the local one
      push.default = "simple";

      # https://adamj.eu/tech/2024/01/18/git-improve-diff-histogram/
      diff.algorithm = "histogram";

      init.defaultBranch = "main";

      pull.rebase = true;
      rebase = {
        # Automatically create a temporary stash entry before the
        # operation begins, and apply it after the operation ends.
        autoStash = true;
        # Print a warning if some commits are removed
        missingCommitsCheck = "warn";
      };

      branch.autosetuprebase = "remote";
      branch.sort = "authordate";

      url = {
        "ssh://git@github.rbx.com/" = {
          insteadOf = "https://github.rbx.com/";
        };
      };
    };
  };

  programs.ssh = {
    enable = true;
    forwardAgent = true;
    serverAliveInterval = 60;
    controlMaster = "auto";
    controlPersist = "30m";
    extraConfig = ''
      IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
    '';
    matchBlocks = {
      "personal" = {
        hostname = "github.com";
        user = "git";
        forwardAgent = false;
        extraOptions = { preferredAuthentications = "publickey"; };
      };
      "github.com" = {
        hostname = "github.com";
        user = "git";
        forwardAgent = false;
        extraOptions = { preferredAuthentications = "publickey"; };
      };
      "github.rbx.com" = {
        hostname = "github.rbx.com";
        user = "git";
        forwardAgent = false;
        extraOptions = { preferredAuthentications = "publickey"; };
      };
    };
  };

  home.sessionPath = [ config.home.sessionVariables.GOBIN ];

  home.sessionVariables = with config.xdg; {
    ASPELL_CONF = "conf ${config.xdg.configHome}/aspell/config;";
    EDITOR = "emacsclient -a=";
    HOMEBREW_NO_AUTO_UPDATE = 1;
    IPYTHONDIR = "${cacheHome}/ipython";
    LESS = "-FRSXM";
    LESSCHARSET = "utf-8";
    MYPY_CACHE_DIR = "${cacheHome}/mypy";
    PAGER = "less";
    PIP_LOG = "${cacheHome}/pip/pip.log";
    PYLINTHOME = "${cacheHome}/pylint";
    PYTHON_EGG_CACHE = "${cacheHome}/python-eggs";
    SHELL = "${pkgs.fish}/bin/fish";
    VISUAL = "emacsclient -a=";
  };

  # Generate ssh agent config for 1Password
  # I want both my personal and work keys
  home.file.".config/1Password/ssh/agent.toml".text = ''
    [[ssh-keys]]
    account = "my.1password.com"

    [[ssh-keys]]
    account = "roblox.1password.com"
    item = "GitHub ssh key"
    vault = "Private"
  '';

  home.file.kubie = {
    target = ".kube/kubie.yaml";
    text = ''
      shell: fish
      configs:
        include:
          - ~/.kube/rksconfig
      prompt:
        fish_use_rprompt: true
    '';
  };
}