aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lua/plugins/nvim-treesitter.lua
blob: 2f8e3cb0a79ace9b68a522e9c21d8a6fbd4666b4 (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
return {
    "nvim-treesitter/nvim-treesitter",
    branch = "main",
    build = ":TSUpdate",
    init = function()
        vim.o.foldmethod = "expr"
        vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()"

    end,
    config = function(_, opts)
        vim.api.nvim_create_autocmd('User', {
            pattern = 'TSUpdate',
            callback = function()
                vim.tbl_extend("force", require('nvim-treesitter.parsers'), opts.custom_parsers or {})
            end
        })

        local ts = require('nvim-treesitter')

        local already_installed = ts.get_installed()
        local parsers_to_install = vim.iter(opts.parsers or {})
            :filter(function(parser) return not vim.tbl_contains(already_installed, parser) end)
            :totable()

        ts.install(parsers_to_install)

        -- Auto-install and start parsers for any buffer
        vim.api.nvim_create_autocmd({ "BufRead", "FileType" }, {
            desc = "Enable Treesitter",
            callback = function(event)
                local bufnr = event.buf
                local filetype = vim.api.nvim_get_option_value("filetype", { buf = bufnr })

                -- Skip if no filetype
                if filetype == "" then
                    return
                end

                -- Get parser name based on filetype
                local parser_name = vim.treesitter.language.get_lang(filetype)
                if not parser_name then
                    vim.notify(vim.inspect("No treesitter parser found for filetype: " .. filetype), vim.log.levels.WARN)
                    return
                end

                -- Try to get existing parser
                local parser_configs = require("nvim-treesitter.parsers")
                if not parser_configs[parser_name] then
                    return -- Parser not available, skip silently
                end

                local parser_exists = pcall(vim.treesitter.get_parser, bufnr, parser_name)

                local function init_treesitter()
                    -- vim.notify(vim.inspect("Starting treesitter parser " .. parser_name .. " for filetype: " .. filetype), vim.log.levels.WARN)
                    vim.treesitter.start(bufnr, parser_name)
                    -- Use regex based syntax-highlighting as fallback as some plugins might need it
                    -- vim.bo[bufnr].syntax = "ON"
                    -- vim.wo.foldtext = "v:lua.vim.treesitter.foldtext()"
                    -- Use treesitter for indentation
                    vim.bo[bufnr].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
                end

                if not parser_exists then
                    -- check if parser is already installed
                    if vim.tbl_contains(already_installed, parser_name) then
                        vim.notify("Parser for " .. parser_name .. " already installed.", vim.log.levels.INFO)
                        init_treesitter()
                    -- else
                    --     -- If not installed, install parser synchronously
                    --     vim.notify("Installing parser for " .. parser_name, vim.log.levels.INFO)
                    --     treesitter.install({ parser_name }):await(init_treesitter)
                    end
                else
                    init_treesitter()
                end

            end,
        })
    end,
    opts = {
        parsers = {
            "lua",
            "c",
            "vim",
            "vimdoc",
            "query",
            "rust",
            "fish",
            "json",
            "javascript",
            "latex",
            "markdown",
            "markdown_inline",
            "zig",
            "typescript",
            "toml",
            "svelte",
            "comment",
            "html",
            "typst",
            "ron",
            "smali",
            "java",
            "kotlin",
            "styled",
            "nix",
            "gitignore",
            "meson"
            -- "d2"
        },
        custom_parsers = {
            d2 = {
                install_info = {
                    url = 'https://github.com/ravsii/tree-sitter-d2',
                    queries = 'queries',
                },
            }
        }
    },
    lazy = false
}