summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/plugins/nvim-treesitter-textobjects.lua
blob: d30b93cdf873ceabed8620b7bac3dcbaef084094 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
return {
    'nvim-treesitter/nvim-treesitter-textobjects',
    event = 'VeryLazy',
    dependencies = { 'nvim-treesitter/nvim-treesitter' },
    config = function()
        ---@diagnostic disable-next-line: missing-fields
        require('nvim-treesitter.configs').setup({
            textobjects = {
                select = {
                    enable = true,
                    lookahead = true, -- automatically jump forward to textobj, similar to targets.vim
                    keymaps = {
                        -- You can use the capture groups defined in textobjects.scm
                        ['af'] = { query = '@function.outer', desc = 'Select entire function' },
                        ['if'] = { query = '@function.inner', desc = 'Select function body' },
                        ['ac'] = { query = '@class.outer', desc = 'Select entire class' },
                        ['ic'] = { query = '@class.inner', desc = 'Select class body' },
                        ['as'] = { query = '@scope.outer', query_group = 'locals', desc = 'Select language scope' },
                        ['is'] = { query = '@scope.inner', query_group = 'locals', desc = 'Select language scope' },
                        ['ia'] = { query = '@assignment.rhs', desc = 'Select assignment rhs' },
                        ['ip'] = { query = '@parameter.inner', desc = 'Select parameter' },
                    },
                    selection_modes = {
                        ['@parameter.outer'] = 'v', -- charwise
                        ['@function.outer'] = 'V', -- linewise
                        ['@class.outer'] = '<c-v>', -- blockwise
                        ['@assignment.rhs'] = 'v', -- charwise
                    },
                },
                swap = {
                    enable = true,
                    -- swap_next = {
                    --     ['<leader>sa'] = { query = '@parameter.inner', desc = 'Swap Argument (next)' },
                    -- },
                    -- swap_previous = {
                    --     ['<leader>sA'] = { query = '@parameter.inner', desc = 'Swap Argument (prev)' },
                    -- },
                },
            },
        })

        local ts_repeat_move = require('nvim-treesitter.textobjects.repeatable_move')
        -- Repeat movement with ; and ,
        vim.keymap.set({ 'n', 'x', 'o' }, ';', ts_repeat_move.repeat_last_move_next)
        vim.keymap.set({ 'n', 'x', 'o' }, ',', ts_repeat_move.repeat_last_move_previous)

        -- NOTE: You need this, otherwise the normal ; and , won't work for fFtT
        vim.keymap.set({ 'n', 'x', 'o' }, 'f', ts_repeat_move.builtin_f_expr, { expr = true })
        vim.keymap.set({ 'n', 'x', 'o' }, 'F', ts_repeat_move.builtin_F_expr, { expr = true })
        vim.keymap.set({ 'n', 'x', 'o' }, 't', ts_repeat_move.builtin_t_expr, { expr = true })
        vim.keymap.set({ 'n', 'x', 'o' }, 'T', ts_repeat_move.builtin_T_expr, { expr = true })
    end,
}