{ lib, pkgs, ... }:

with builtins;
{
  config.home-manager.users.moritz.programs.neovim.lazy.plugins = with pkgs.vimPlugins; [
    {
      plugin = nvim-treesitter;
      event = [ "BufReadPost" "BufNewFile" ];
      opts = {
        sync_install = false;
        auto_install = false;
        highlight = {
          enable = true;
        };
        textobjects =
          {
            select =
              {
                enable = true;

                # Automatically jump forward to textobj, similar to targets.vim
                lookahead = false;

                keymaps = {
                  # You can use the capture groups defined in textobjects.scm
                  "af" = {
                    query = "@function.outer";
                    desc = "Select outer part of a function region";
                  };
                  "if" = {
                    query = "@function.inner";
                    desc = "Select inner part of a function region";
                  };
                  "ac" = {
                    query = "@class.outer";
                    desc = "Select outer part of a class region";
                  };
                  "ic" = {
                    query = "@class.inner";
                    desc = "Select inner part of a class region";
                  };
                };
              };
          };
      };
      conf =
        let
          parserDir = pkgs.symlinkJoin
            {
              name = "tresitter-grammars-all";
              paths = lib.attrValues (lib.filterAttrs (_: builtins.isAttrs) nvim-treesitter-parsers);
            };
        in
        ''
          vim.opt.runtimepath:append("${parserDir}")
          local final_opts = vim.tbl_deep_extend("keep", opts, { parser_install_dir = "${parserDir}" })
          require('nvim-treesitter.configs').setup(final_opts)
        '';
      dependencies = [
        { plugin = nvim-treesitter-textobjects; }
        { plugin = nvim-ts-context-commentstring; opts = { }; }
      ];
    }
    {
      plugin = nvim-treesitter-textsubjects;
      event = [ "BufReadPost" "BufNewFile" ];
      conf = readFile ./lua/nvim-treesitter-textsubjects.lua;
    }
    {
      plugin = nvim-treesitter-context;
      event = [ "BufReadPost" "BufNewFile" ];
      opts = { };
    }
    {
      plugin = hmts-nvim;
      ft = [ "nix" ];
    }
  ];
}
