return {
    {
        "nvim-treesitter/nvim-treesitter-textobjects",
        dependencies = { "nvim-treesitter/nvim-treesitter" },
        opts = {
            textobjects = {
                select = {
                    enable = true,

                    -- Automatically jump forward to textobj, similar to targets.vim
                    lookahead = true,

                    keymaps = {
                        -- You can use the capture groups defined in textobjects.scm
                        ["af"] = "@function.outer",
                        ["if"] = "@function.inner",
                        ["ap"] = "@parameter.outer",
                        ["ip"] = "@parameter.inner",
                        ["ac"] = "@comment.outer",
                        ["aS"] = "@statement.outer",
                        ["ae"] = "@block.outer",
                        ["al"] = "@loop.outer",
                        ["il"] = "@loop.inner",
                        ["ar"] = "@return.outer",
                        ["ir"] = "@return.inner",
                        ["ia"] = "@assignment.rhs",
                        ["aa"] = "@assignment.inner",
                        ["i?"] = "@conditional.inner",
                        ["a?"] = "@conditional.outer",
                        ["in"] = "@number.inner",
                        ["iC"] = "@class.inner",
                        ["aC"] = "@class.outer",
                        ["ig"] = "@call.inner",
                        ["ag"] = "@call.outer",

                        -- You can also use captures from other query groups like `locals.scm`
                        ["as"] = { query = "@scope", query_group = "locals", desc = "Select language scope" },
                    },
                    -- You can choose the select mode (default is charwise 'v')
                    --
                    -- Can also be a function which gets passed a table with the keys
                    -- * query_string: eg '@function.inner'
                    -- * method: eg 'v' or 'o'
                    -- and should return the mode ('v', 'V', or '<c-v>') or a table
                    -- mapping query_strings to modes.
                    selection_modes = {
                        ['@parameter.outer'] = 'v', -- charwise
                        ['@function.outer'] = 'V', -- linewise
                    },
                    -- If you set this to `true` (default is `false`) then any textobject is
                    -- extended to include preceding or succeeding whitespace. Succeeding
                    -- whitespace has priority in order to act similarly to eg the built-in
                    -- `ap`.
                    --
                    -- Can also be a function which gets passed a table with the keys
                    -- * query_string: eg '@function.inner'
                    -- * selection_mode: eg 'v'
                    -- and should return true or false
                    include_surrounding_whitespace = false,
                },
            },

        },
        config = function(_, opts)
            require("nvim-treesitter.configs").setup(opts)
        end,
    }
}