{ pkgs, nixvim, ... }:
{
  imports = [
    nixvim.homeManagerModules.nixvim
  ];
  
  home = {
    username = "sperrault";
    homeDirectory = "/Users/sperrault";
    stateVersion = "24.11";

    sessionVariables = {
      SSH_AUTH_SOCK = "$HOME/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock";
    };

    packages = with pkgs; [
      watchman
      difftastic
    ];
  };

  programs.fish = {
    enable = true;
    interactiveShellInit = ''
      fish_vi_key_bindings
    '';
    shellAbbrs = {
      j = "jj";
    };
  };

  programs.zoxide = {
    enable = true;
    enableFishIntegration = true;
  };

  programs.direnv.enable = true;

  programs.mise = {
    enable = true;
    enableFishIntegration = true;
  };

  programs.nixvim = {
    enable = true;

    globals = {
      mapleader = " ";
    };

    globalOpts = {
      number = true;
      relativenumber = true;
      shiftwidth = 2;
      expandtab = true;
      tabstop = 2;
    };

    colorschemes.catppuccin.enable = true;

    keymaps = [
      {
        key = ";";
        action = ":";
        mode = ["n" "v"];
      }
      {
        key = "<leader>y";
        action = ''"+y'';
        mode = ["n" "v"];
      }
      {
        key = "<leader>Y";
        action = ''"+Y'';
        mode = ["n" "v"];
      }
      {
        key = "<leader>p";
        action = ''"+p'';
        mode = ["n" "v"];
      }
      {
        key = "<leader>P";
        action = ''"+P'';
        mode = ["n" "v"];
      }
      {
        key = "<leader>w";
        action = "<cmd>w<cr>";
        mode = ["n"];
      }
      {
        key = "<leader>q";
        action = "<cmd>q<cr>";
        mode = ["n"];
      }
      {
        key = "<esc>";
        action = "<cmd>nohlsearch<cr>";
        mode = ["n"];
      }
      {
        key = ''<leader>"'';
        action = "<cmd>split<cr>";
        mode = ["n"];
      }
      {
        key = "<leader>%";
        action = "<cmd>vsplit<cr>";
        mode = ["n"];
      }
      {
        key = "<leader><tab>";
        action = "<cmd>NERDTreeToggle<cr>";
        mode = ["n"];
      }
      {
        key = "<leader>fl";
        action = "<cmd>NERDTreeFind<cr>";
        mode = ["n"];
      }
      {
        key = "<leader><space>";
        action = "<cmd>Telescope find_files theme=dropdown<cr>";
        mode = ["n"];
      }
      {
        key = "<leader>/";
        action = "<cmd>Telescope live_grep<cr>";
        mode = ["n"];
      }
    ];

    extraPlugins = with pkgs.vimPlugins; [
      vim-abolish
      nerdtree
      vim-rhubarb
    ];

    plugins.commentary.enable = true;
    plugins.repeat.enable = true;
    plugins.fugitive.enable = true;

    plugins.nvim-autopairs.enable = true;
    plugins.nvim-surround.enable = true;

    plugins.web-devicons.enable = true;

    plugins.treesitter = {
      enable = true;
      settings.indent.enable = true;
      settings.highlight.enable = true;
      grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
        bash
        json
        lua
        markdown
        nix
        toml
        vim
        yaml
        elixir
        javascript
        typescript
        css
        html
      ];
    };

    plugins.lsp = {
      enable = true;
      servers = {
        elixirls.enable = true;
        fish_lsp.enable = true;
        html.enable = true;
        nixd.enable = true;
        tailwindcss.enable = true;
        terraform_lsp.enable = true;
      };
    };

    plugins.telescope.enable = true;

    plugins.cmp = {
      enable = true;
      autoEnableSources = true;
      settings.sources = [
        { name = "nvim_lsp"; }
        { name = "luasnip"; }
        { name = "path"; }
        { name = "buffer"; }
      ];
    };
  };

  programs.zellij = {
    enable = true;
    enableFishIntegration = false;
  };

  programs.ssh = {
    enable = true;
    matchBlocks = {
      "*" = {
        extraOptions.IdentityAgent = ''"~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"'';
      };
    };
  };

  programs.jujutsu = {
    enable = true;
    settings = {
      core.fsmonitor = "watchman";
      user = {
        name = "sloane";
        email = "git@sloanelybutsurely.com";
      };
      signing = {
        sign-all = true;
        backend = "ssh";
        key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID0TH2GezEx8+zlKBqUb7rBsbmghnd1u4nX6YpQr28Zw";
        backends.ssh.program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign";
      };
      ui = {
        paginate = "never";
        default-command = "log";
        editor = "nvim";
        diff.tool = ["difft" "--color=always" "$left" "$right"];
      };
      revsets.log = "trunk() | ancestors(reachable(@ | mine(), mutable()), 2) | @";
      git = {
        push-bookmark-prefix = "sloane/push-";
        private-commits = "wip | nocommit | dev-only";
      };
      revset-aliases = {
        wip = ''description(regex:"^\\[(wip|WIP|todo|TODO)\\]|(wip|WIP|todo|TODO):?")'';
        nocommit = ''description(regex:"^\\[(nocommit|NOCOMMIT)\\]|(nocommit|NOCOMMIT):?")'';
        dev-only = ''description(regex:"^\\[(dev-only|DEV-ONLY)\\]|(dev-only|DEV-ONLY):?")'';
        current = ''(bookmarks() | wip | dev-only) & mine()'';
      };
    };
  };
}